FORMA

多表查询

多表查询(基础)

多表查询用于从两个或更多表中获取数据。常见的连接类型包括内连接外连接(左、右)和自连接

一、内连接(INNER JOIN)

作用:返回两个表中连接字段匹配的行。不匹配的行会被丢弃。

语法

sql
SELECT 列列表
FROM 表1
INNER JOIN 表2 ON 表1.关联列 = 表2.关联列;

INNER 可省略)

示例:查询每个员工的部门名称

sql
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.id;

只有 dept_iddepartments 中存在的员工才会出现。

二、左外连接(LEFT JOIN)

作用:返回左表所有行,即使右表中没有匹配的行。右表中不匹配的列将填充 NULL

语法

sql
SELECT 列列表
FROM 表1
LEFT JOIN 表2 ON 表1.关联列 = 表2.关联列;

示例:查询所有员工及其部门(包括没有部门的员工)

sql
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id;

如果某员工的 dept_id 不存在于 departments,则 dept_name 显示为 NULL

三、右外连接(RIGHT JOIN)

作用:返回右表所有行,左表不匹配则补充 NULL。与 LEFT JOIN 对称,但通常可用 LEFT JOIN 重写,因此使用较少。

语法

sql
SELECT 列列表
FROM 表1
RIGHT JOIN 表2 ON 表1.关联列 = 表2.关联列;

示例:查询所有部门及其员工(包括空部门)

sql
SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.id;

如果某个部门没有员工,则员工列显示为 NULL

提示:RIGHT JOIN 可以通过交换表顺序改写为 LEFT JOIN,因此习惯上多用 LEFT JOIN

四、自连接

作用:将一张表与它自身进行连接,通常用于处理具有层级关系(如员工-经理)或比较同一表中不同行的数据。

语法:必须使用表别名来区分同一张表的两个实例。

sql
SELECT a.列, b.列
FROM 表 a
INNER JOIN 表 b ON a.关联列 = b.关联列;

(也可以用外连接)

示例:查询每个员工及其经理的名字

sql
SELECT e.name AS employee, m.name AS manager
FROM emp e
LEFT JOIN emp m ON e.manager_id = m.id;

这里 emp 表既作为员工表(别名 e),又作为经理表(别名 m)。使用 LEFT JOIN 确保没有经理的员工(如 CEO)也会显示。

五、连接类型对比

连接类型保留行不匹配时右/左表表现
INNER JOIN仅匹配丢弃
LEFT JOIN左表全部右表列 NULL
RIGHT JOIN右表全部左表列 NULL
自连接取决于是 INNER/LEFT/RIGHT同上

实际选择

  • 需要匹配数据时用 INNER JOIN
  • 需要保留左表全部数据(即使无匹配)时用 LEFT JOIN
  • 处理层次或比较同一表内行时用自连接(配合别名)。

六、完整示例

sql
-- 内连接:查询已分配部门的员工
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN dept d ON e.dept_id = d.id;

-- 左连接:查询所有员工及其部门(未分配也显示)
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN dept d ON e.dept_id = d.id;

-- 自连接:查询每个员工及其上级经理
SELECT worker.name AS employee, manager.name AS manager
FROM employees worker
LEFT JOIN employees manager ON worker.manager_id = manager.id;

掌握这些基础连接类型,可以应对绝大多数多表查询需求。后续可进一步学习 FULL OUTER JOIN(MySQL 不支持,需用 UNION 模拟)、交叉连接等高级用法。

参考文献

资料说明
MySQL 8.0 手册官方
数据存储导读学习路径

Series

mysql

9 / 11