MySQL 多表查询详解:从外键到连接查询

在设计关系型数据库时,为了减少数据冗余,我们通常会将不同维度的数据存储在多张表中。当需要从多张表中联合提取数据时,多表查询就成为了核心技能。本文将系统讲解 MySQL 中的外键约束内连接外连接,以及如何用 UNION 实现全外连接。


一、外键约束:连接两张表的桥梁

外键约束(FOREIGN KEY)用于建立两张表之间的关联,保证数据的引用完整性。

语法:

CREATE TABLE 子表 (
    ...
    关联字段 类型,
    CONSTRAINT 外键名 FOREIGN KEY (关联字段) REFERENCES 父表(主键字段)
);

作用:

  • 保证子表中外键字段的值必须在父表主键中存在(或为 NULL)
  • 防止误删父表中被子表引用的数据(默认会阻止删除)

示例:

-- 父表:部门
CREATE TABLE dept (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

-- 子表:员工,dept_id 作为外键关联到 dept 表的 id
CREATE TABLE emp (
    id INT PRIMARY KEY,
    name VARCHAR(20),
    dept_id INT,
    CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES dept(id)
);

二、内连接(INNER JOIN):获取两表的交集

内连接返回两张表中满足连接条件的数据,即两表的交集部分。如果某行在任意一张表中没有匹配,该行就不会出现在结果集中。

语法:

SELECT 字段列表
FROM1
INNER JOIN2 ON1.关联字段 =2.关联字段;

示例:

-- 查询员工姓名及其所属部门名称(只显示有部门的员工)
SELECT emp.name, dept.name AS dept_name
FROM emp
INNER JOIN dept ON emp.dept_id = dept.id;

若某员工没有分配部门(dept_id 为 NULL)或部门已不存在,该员工不会出现在查询结果中。


三、外连接(OUTER JOIN)

外连接不仅能返回匹配的记录,还能保留其中一张表的所有记录,不匹配的部分用 NULL 填充。MySQL 支持左外连接和右外连接。

1. 左外连接(LEFT JOIN)

返回左表所有记录,右表只返回匹配记录,匹配不上则置 NULL。

SELECT 字段列表
FROM1
LEFT JOIN2 ON1.关联字段 =2.关联字段;

示例:

-- 查询所有员工及其部门名称(包含没部门的员工)
SELECT emp.name, dept.name AS dept_name
FROM emp
LEFT JOIN dept ON emp.dept_id = dept.id;

即使员工没有所属部门,该员工信息仍会保留,对应的部门字段为空。

2. 右外连接(RIGHT JOIN)

与左连接相反,返回右表所有记录,左表只返回匹配记录,匹配不上则置 NULL。

SELECT 字段列表
FROM1
RIGHT JOIN2 ON1.关联字段 =2.关联字段;

示例:

-- 查询所有部门及部门下的员工姓名(包含没员工的部门)
SELECT emp.name, dept.name AS dept_name
FROM emp
RIGHT JOIN dept ON emp.dept_id = dept.id;

即使某个部门下没有员工,部门信息也会显示,员工字段为空。

实际开发中右连接完全可以通过交换左右表位置转换为左连接,因此左连接使用频率更高。


四、全外连接与 UNION

全外连接(FULL JOIN)返回左右两张表的并集,MySQL 原生并不直接支持 FULL JOIN 语法,但可以通过 UNION 组合左连接和右连接来实现。

UNION 与 UNION ALL 的区别

  • UNION:合并两个查询结果,自动去掉重复行
  • UNION ALL:直接合并,保留所有行(包括重复)

使用条件:
两个查询结果的列数必须相同,且对应列的数据类型兼容。

全外连接实现方式:

-- 左连接获取左表全量 + 右连接获取左表未匹配到的部分
SELECT emp.name, dept.name AS dept_name
FROM emp
LEFT JOIN dept ON emp.dept_id = dept.id

UNION

SELECT emp.name, dept.name
FROM emp
RIGHT JOIN dept ON emp.dept_id = dept.id;

这样得到的结果集既包含所有员工(包括无部门的),也包含所有部门(包括无员工的),实现了两张表的并集。如果不希望去掉重复行,可将 UNION 改为 UNION ALL


五、连接查询总结对比表

连接类型 返回结果描述 关键字
内连接 两表的交集 INNER JOIN
左外连接 左表全部 + 右表匹配,无匹配为 NULL LEFT JOIN
右外连接 右表全部 + 左表匹配,无匹配为 NULL RIGHT JOIN
全外连接 两表并集,MySQL 用 UNION 实现 (LEFT JOIN) UNION (RIGHT JOIN)

小结

多表查询是数据库操作中最常用的高级特性之一。理解外键约束的关联意义,掌握内连接与外连接的区别,以及使用 UNION 实现全外连接,能够帮助我们灵活地从多张表中提取业务所需的数据。建议结合实例多练习,并留意查询结果中 NULL 值的处理逻辑。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐