SQL 多表联查学习笔记

前言

在操作数据库时,面对一张表时往往没什么太大问题,但实际上大多数的查询需要涉及到多张表,进行多表联查;本文主要记录了本人在学习 SQL 多表联查的一些操作。

准备工作

在开始之前,我们准备了两张表,作为下面操作的对象。

学生信息表

id 学号 姓名 性别 年龄
1 210001 A 18
2 210002 B 18
3 210003 C 17
4 210004 D 19
5 210005 E 17
6 210006 F 18

专业班级表

id 学号 专业 班级
1 210001 数学 数 1
2 210003 计算机 计 1
3 210004 软件工程 软 2
4 210005 计算机 计 3
5 210007 物理 物 1
6 210008 英语 英 2

内连接(INNER JOIN)

使用场景:获取两个表中指定字段满足匹配关系的记录

1
2
3
4
SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key

查询示例:

获取每个学生的学号、姓名、性别、年龄、专业、班级信息

1
2
3
4
5
6
7
8
9
10
SELECT A.学号, A.姓名, A.性别, A.年龄, B.专业, B.班级
FROM student A
INNER JOIN class B
ON A.学号 = B.学号

-- 你也可以省去 INNER,直接写 JOIN
SELECT A.学号, A.姓名, A.性别, A.年龄, B.专业, B.班级
FROM student A
JOIN class B
ON A.学号 = B.学号

查询结果:

id 学号 姓名 性别 年龄 专业 班级
1 210001 A 18 数学 数 1
2 210003 C 17 计算机 计 1
3 210004 D 19 软件工程 软 2
4 210005 E 17 计算机 计 3

左连接(LEFT JOIN)

使用场景:获取左表中的所有记录,即使在右表没有对应匹配的记录

1
2
3
4
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key

查询示例:

获取每个学生的学号、姓名、性别、年龄、专业、班级信息

1
2
3
4
SELECT A.学号, A.姓名, A.性别, A.年龄, B.专业, B.班级
FROM student A
LEFT JOIN class B
ON A.学号 = B.学号

查询结果:

id 学号 姓名 性别 年龄 专业 班级
1 210001 A 18 数学 数 1
2 210002 B 18 NULL NULL
3 210003 C 17 计算机 计 1
4 210004 D 19 软件工程 软 2
5 210005 E 17 计算机 计 3
6 210006 F 18 NULL NULL

右连接(RIGHT JOIN)

使用场景:获取右表中的所有记录,即使在左表没有对应匹配的记录

1
2
3
4
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key

查询示例:

获取每个学生的学号、姓名、性别、年龄、专业、班级信息

1
2
3
4
SELECT A.学号, A.姓名, A.性别, A.年龄, B.专业, B.班级
FROM student A
RIGHT JOIN class B
ON A.学号 = B.学号

查询结果:

id 学号 姓名 性别 年龄 专业 班级
1 210001 A 18 数学 数 1
2 210003 C 17 计算机 计 1
3 210004 D 19 软件工程 软 2
4 210005 E 17 计算机 计 3
5 NULL NULL NULL NULL 物理 物 1
6 NULL NULL NULL NULL 英语 英 2

完全连接(FULL JOIN)

使用场景:获取两个表中的所有行

1
2
3
4
SELECT <select_list>
FROM Table_A A
FULL JOIN Table_B B
ON A.Key = B.Key

FULL OUTER JOIN 或者 FULL JOIN 都可以

查询示例:

获取每个学生的学号、姓名、性别、年龄、专业、班级信息

1
2
3
4
SELECT A.学号, A.姓名, A.性别, A.年龄, B.专业, B.班级
FROM student A
FULL JOIN class B
ON A.学号 = B.学号

查询结果:

id 学号 姓名 性别 年龄 专业 班级
1 210001 A 18 数学 数 1
2 210002 B 18 NULL NULL
3 210003 C 17 计算机 计 1
4 210004 D 19 软件工程 软 2
5 210005 E 17 计算机 计 3
6 210006 F 18 NULL NULL
7 NULL NULL NULL NULL 物理 物 1
8 NULL NULL NULL NULL 英语 英 2

左表唯一(LEFT Excluding JOIN)

使用场景:获取左表有但右表没有关联数据的记录

1
2
3
4
5
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

右表唯一(RIGHT Excluding JOIN)

使用场景:获取右表有但左表没有关联数据的记录

1
2
3
4
5
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL

非交集连接(Outer Excluding JOIN)

使用场景:获取左表和右表里没有相互关联的记录

1
2
3
4
5
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL

总结

参考资料