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