MySQL 多表查询详解:从外键到连接查询
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 字段列表
FROM 表1
INNER JOIN 表2 ON 表1.关联字段 = 表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 字段列表
FROM 表1
LEFT JOIN 表2 ON 表1.关联字段 = 表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 字段列表
FROM 表1
RIGHT JOIN 表2 ON 表1.关联字段 = 表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 值的处理逻辑。
更多推荐




所有评论(0)