Tableau数据混合与SQL NATURAL JOIN

本文讨论了Tableau的混合功能及SQL中的自然连接(NATURAL JOIN)。混合在分析中降低了技术门槛,而NATURAL JOIN则通过自动匹配相同列来简化数据合并。尽管NATURAL JOIN方便,但易导致错误,推荐使用INNER JOIN以增强控制力度。

图:喜乐君著作
图:喜乐君数据分析系列著作封面
2025-07-24 参考网络内容,基于 Google Germini Pro2.5 创建2025/10/07修改,增加混合相关内容的比较——面向国产 BI 设计。

Tableau 混合

Tableau 混合是一个非常重要的功能,它降低了业务用户跨主题分析的难度,又避免了类似于 DAX 的 Related 一样的技术门槛,可以说是 Tableau 成长过程中堪比 关系模型、LOD 一样的核心功能。

从技术上看,混合最终体现为 Join,但它的独特之处在于位置:它在视图聚合之后创建,而非在数据库或数据源层面预先创建。这是混合灵活性的保证。相关内容参见《数据可视化分析(第 2 版):分析原理与 Tableau、SQL 实践》第四章内容。

图:一张展示数据准备和分析工作流程的思维导图,包括数据连接、数据合并、数据模型和数据清理等主题。
图:NATURAL JOIN 数据准备流程思维导图

本文重点,在于介绍 SQL 的“自然连接”,分析师可以把它比作是混合的低阶形式。

NATURAL JOIN (自然连接) 是 SQL 中的一种连接操作,它会基于两个表中所有同名且同数据类型的列来自动合并数据。其核心特点是无需手动指定连接条件,SQL 会自动寻找公共列进行匹配。

  • 临时关系匹配在 BI 分析中的作用及工具实现 2025/7

什么是 SQL NATURAL JOIN?

NATURAL JOIN 会在两个表之间,根据名称和数据类型都相同的列来执行连接。它会自动识别这些“公共列”,并在最终的结果集中将这些公共列合并,只保留一个版本,从而使查询结果更简洁,避免了数据冗余。

这种连接的行为模式本质上是一种 INNER JOIN (内连接),只会返回在两个表中公共列的值都能够匹配上的行。

语法:SQL

SELECT *
FROM table1
NATURAL JOIN table2;
图:概念图展示自然连接(NATURAL JOIN),包含两个表(Table A 和 Table B)与公共列的关系图示。
图:NATURAL JOIN 两表连接概念示意图

图片来自 https://www.boardinfinity.com/blog/natural-join-in-dbms-sql/

NATURAL JOIN 的特点

  • 自动匹配列:NATURAL JOIN 会自动寻找两个表中所有名称和类型相同的列作为连接键,无需像 INNER JOIN 那样使用 ON 子句手动指定。
  • 消除重复列:如果两个表有公共列,NATUAL JOIN 的结果中只会包含该列一次,而不是像其他连接那样可能返回两个同名列。
  • 体现引用完整性:它的行为类似于内连接,只有当连接键的值同时存在于两个表中时,相关的数据行才会被返回。这可以用来快速查找那些在两个关联表中都有对应记录的数据。
  • 潜在风险 ⚠️:由于连接是自动进行的,如果两个表恰好有多个未预期的同名列(例如 id, name, update_time 等),NATURAL JOIN 会尝试在所有这些列上进行匹配,这可能导致非预期的结果或返回空集。因此,在生产环境中,显式指定连接条件的 INNER JOIN 通常是更安全、更清晰的选择。

NATURAL JOIN 实战演练

第一步: 创建数据表

我们创建两个表:department (部门表) 和 employee (员工表)。

1、部门表 (department)该表包含 4 个部门。

SQLCREATE TABLE department ( dept_id INT PRIMARY KEY, dept_name VARCHAR(50) );
SQLCREATE TABLE employee

第二步: 插入数据

1、向 department 表插入数据:SQL

INSERT INTO department(dept_id, dept_name) VALUES
(10, '技术部'),
(20, '销售部'),
(30, '人力资源部'),
(40, '财务部'); -- 注意:这个部门将没有员工
INSERT INTO employee(emp_id, emp_name, dept_id) VALUES
(101, '张三', 10),
(102, '李四', 10),
(103, '王五', 20),
(104, '赵六', 30),
(105, '孙七', 30),
(106, '周八', 50); -- 注意:这名员工所属的部门ID(50)在部门表中不存在

第三步: 检视数据

SELECT * FROM department;
| dept_id | dept_name |

| :— | :— |

| 10 | 技术部 |

| 20 | 销售部 |

| 30 | 人力资源部 |

| 40 | 财务部 |

SELECT * FROM employee;
| emp_id | emp_name | dept_id |

| :— | :— | :— |

| 101 | 张三 | 10 |

| 102 | 李四 | 10 |

| 103 | 王五 | 20 |

| 104 | 赵六 | 30 |

| 105 | 孙七 | 30 |

| 106 | 周八 | 50 |

第四步: 执行 NATURAL JOIN

现在,我们在 employee 和 department 表之间执行 NATURAL JOIN。SQL 会自动发现公共列 $dept\_id$ 并用它来连接。

SQL

SELECT *
FROM employee
NATURAL JOIN department;
图:示意图展示了 SQL 中 `NATURAL JOIN` 的工作原理,包括两个表之间的公共列和根据这些公共列连接的匹配行。
图:NATURAL JOIN 工作原理示意图

图片来自 https://www.w3resource.com/mysql/advance-query-in-mysql/mysql-natural-join.php

结果分析

1. 基数差异处理:尽管 employee 表有 6 行,department 表有 4 行,但最终结果只有 5 行。

2. 引用完整性特征:
员工 ‘周八’ 没有出现在结果中,因为他所属的部门ID 50 在 department 表中不存在。

3. ‘财务部’ 也没有出现在结果中,因为没有任何一名员工被分配到该部门 (ID 40)。

这清晰地表明,NATURAL JOIN 只返回那些在两个表中都能找到匹配连接键的记录。

NATURAL JOIN 与 INNER JOIN 的区别

虽然 NATURAL JOIN 和 INNER JOIN 都能合并两个表的数据,但它们在用法和行为上有显著区别:

特性

NATURAL JOIN

INNER JOIN

连接条件

自动 基于所有同名同类型列,无需指定。

必须手动 使用 ON 子句显式指定连接列和条件。

结果列

公共列 只出现一次 。

默认情况下,两个表中的所有列都会出现,包括重复的连接列(需用别名区分)。

控制力

控制力较弱,容易因意外的同名列而出错。

控制力强,连接条件清晰明确,是更推荐的做法。

使用 INNER JOIN 实现与上面相同的效果,查询语句如下:

SELECT
  e.emp_id,
  e.emp_name,
  d.dept_id,
  d.dept_name
FROM
  employee AS e
INNER JOIN
  department AS d ON e.dept_id = d.dept_id;

参考文章:SQL Natural Join

No comments yet