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)。