SQL 联接详解:INNER、LEFT、RIGHT、CROSS(以及逗号联接)
Published: 2026-02-04
SQL 联接可以让你根据相关列,把两张表中的行组合在一起。本文用简短的教程展示四种核心联接类型,并解释为什么逗号联接和 CROSS JOIN 是同一回事。
示例数据
下面两张表会在所有示例中使用:
employees 表:
| id | name | dept_id |
|---|---|---|
| 1 | Ava | 10 |
| 2 | Ben | 20 |
| 3 | Cara | NULL |
departments 表:
| dept_id | dept_name |
|---|---|
| 10 | Sales |
| 20 | Engineering |
| 30 | Support |
在浏览器中试一试这些联接
你可以直接在页面中运行示例查询。编辑查询后点击 Run 即可。
INNER JOIN
只返回在两张表中都能匹配到的行。
结果: Ava/Sales、Ben/Engineering。Cara 被排除,因为她没有匹配的部门;Support 也被排除,因为部门 30 中没有任何员工。
LEFT JOIN (LEFT OUTER JOIN)
返回左表中的所有行,再加上右表中能匹配到的行。右侧不匹配的部分会变成 NULL。
结果: Ava/Sales、Ben/Engineering、Cara/NULL。所有员工都被保留。
RIGHT JOIN (RIGHT OUTER JOIN)
返回右表中的所有行,再加上左表中能匹配到的行。左侧不匹配的部分会变成 NULL。
结果: Ava/Sales、Ben/Engineering、NULL/Support。所有部门都被保留。
注意:很多开发者更喜欢通过交换表的顺序,把
RIGHT JOIN重写成LEFT JOIN,这样可读性和一致性更好。
CROSS JOIN
返回笛卡尔积(两张表所有行的所有组合)。
结果: 3 × 3 = 9 行(每个员工和每个部门都配对一次)。
逗号联接(传统语法)
逗号联接和 CROSS JOIN 是一样的。它在 FROM 子句中用逗号分隔多张表:
这会产生和 CROSS JOIN 相同的笛卡尔积。如果你在 WHERE 子句中添加过滤条件,它的行为就和 INNER JOIN 一样:
虽然这种语法仍然有效,但被认为已经过时,因为它把联接逻辑和过滤条件混在一起,可读性较差。推荐使用显式的 JOIN ... ON 语法。
DbGate:展开列时自动使用 LEFT JOIN
在 DbGate 的数据浏览器中,当你展开一个外键列时,会自动生成带有 LEFT JOIN 的查询,用来拉取相关数据,同时不会丢弃主表中的任何行。这样既能保持基础数据集完整,又能立即看到相关字段。
小结
INNER JOIN只保留匹配的行。LEFT JOIN保留左表的所有行。RIGHT JOIN保留右表的所有行。CROSS JOIN返回所有组合。- 逗号联接和
CROSS JOIN相同(加上WHERE过滤后就变成INNER JOIN)。