连接与多表查询
连接是关系型数据库的主要特点,通过连接运算符可以实现多表查询。当两个或者多个表存在相同意义的字段时,可用通过这些字段对不同的表进行连接查询。
连接查询
MySQL支持以下三种连接查询
- INNER JOIN :内连接
- RIGHT OUTER JOIN:右连接
- LEFT OUTER JOIN:左连接
三种连接查询的不同之处
内连接查询
结果集为左表A与右表B的交集。
左连接查询
结果集为左表A全部。
右链接查询
结果集为右表B的全部。
下面以两个表(students,classes)为例,说明三种连接查询的不同之处。
mysql> select * from students;
+----+----------+--------+--------+-------+
| id | class_id | name | gender | score |
+----+----------+--------+--------+-------+
| 1 | 1 | 小明 | M | 90 |
| 2 | 1 | 小红 | F | 95 |
| 3 | 1 | 小军 | M | 88 |
| 4 | 1 | 小米 | F | 73 |
| 5 | 2 | 小白 | F | 81 |
| 6 | 2 | 小兵 | F | 55 |
| 7 | 2 | 小林 | M | 85 |
| 8 | 3 | 小新 | F | 91 |
| 9 | 3 | 小王 | M | 89 |
| 10 | 3 | 小丽 | F | 88 |
| 11 | 5 | 小花 | M | 95 |
+----+----------+--------+--------+-------+
mysql> select * from classes;
+----+--------+
| id | name |
+----+--------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
| 4 | 四班 |
+----+--------+
4 rows in set (0.00 sec)
students表中含有四个字段,分别为:id、class_id、name、gender、score
classes表中含有二和字段,分别为:id、name
注意:
students中存在name='小花',class_id=5
的记录(为方便后续描述,将该记录称为记录L1),而classes表中不存在id=5
的记录。
classes中存在id=4,name='四班'
的记录(为方便后续描述,将该记录称为记录R1),而students表中不存在class_id=4
得记录。
INNER JOIN 内连接
查询classes表中id字段与students表中class_id字段一致的数据。结果集展示students表中id、name、class_id、gender、score字段和classes表中name(改名为class_name)字段。
SELECT
s.id,
s.name,
s.class_id,
c.name class_name,
s.gender,
s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;
查询结果为,不包含记录L1和记录R1
mysql> SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
-> FROM students s INNER JOIN classes c
-> ON s.class_id = c.id;
+----+--------+----------+------------+--------+-------+
| id | name | class_id | class_name | gender | score |
+----+--------+----------+------------+--------+-------+
| 1 | 小明 | 1 | 一班 | M | 90 |
| 2 | 小红 | 1 | 一班 | F | 95 |
| 3 | 小军 | 1 | 一班 | M | 88 |
| 4 | 小米 | 1 | 一班 | F | 73 |
| 5 | 小白 | 2 | 二班 | F | 81 |
| 6 | 小兵 | 2 | 二班 | F | 55 |
| 7 | 小林 | 2 | 二班 | M | 85 |
| 8 | 小新 | 3 | 三班 | F | 91 |
| 9 | 小王 | 3 | 三班 | M | 89 |
| 10 | 小丽 | 3 | 三班 | F | 88 |
+----+--------+----------+------------+--------+-------+
10 rows in set (0.00 sec)
RIGHT OUTER JOIN 右连接
查询students表中class_id字段与classes表中id字段一致的数据。结果集展示students表中id、name、class_id、gender、score字段和classes表中name(改名为class_name)字段。
SELECT
s.id,
s.name,
s.class_id,
c.name class_name,
s.gender,
s.score
FROM students s
RIGHT OUTER JOIN classes c
ON s.class_id = c.id;
查询结果为,包含记录R1,不包含记录L1
mysql> SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
-> FROM students s
-> RIGHT OUTER JOIN classes c
-> ON s.class_id = c.id;
+------+--------+----------+------------+--------+-------+
| id | name | class_id | class_name | gender | score |
+------+--------+----------+------------+--------+-------+
| 1 | 小明 | 1 | 一班 | M | 90 |
| 2 | 小红 | 1 | 一班 | F | 95 |
| 3 | 小军 | 1 | 一班 | M | 88 |
| 4 | 小米 | 1 | 一班 | F | 73 |
| 5 | 小白 | 2 | 二班 | F | 81 |
| 6 | 小兵 | 2 | 二班 | F | 55 |
| 7 | 小林 | 2 | 二班 | M | 85 |
| 8 | 小新 | 3 | 三班 | F | 91 |
| 9 | 小王 | 3 | 三班 | M | 89 |
| 10 | 小丽 | 3 | 三班 | F | 88 |
| NULL | NULL | NULL | 四班 | NULL | NULL |
+------+--------+----------+------------+--------+-------+
11 rows in set (0.00 sec)
LEFT OUTER JOIN 左连接
查询students表中class_id字段与classes表中id字段一致的数据。结果集展示students表中id、name、class_id、gender、score字段和classes表中name(改名为class_name)字段。
SELECT
s.id,
s.name,
s.class_id,
c.name class_name,
s.gender,
s.score
FROM students s
LEFT OUTER JOIN classes c
ON s.class_id = c.id;
查询结果为,包含记录L1,不包含记录R1
mysql> SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
-> FROM students s
-> LEFT OUTER JOIN classes c
-> ON s.class_id = c.id;
+----+--------+----------+------------+--------+-------+
| id | name | class_id | class_name | gender | score |
+----+--------+----------+------------+--------+-------+
| 1 | 小明 | 1 | 一班 | M | 90 |
| 2 | 小红 | 1 | 一班 | F | 95 |
| 3 | 小军 | 1 | 一班 | M | 88 |
| 4 | 小米 | 1 | 一班 | F | 73 |
| 5 | 小白 | 2 | 二班 | F | 81 |
| 6 | 小兵 | 2 | 二班 | F | 55 |
| 7 | 小林 | 2 | 二班 | M | 85 |
| 8 | 小新 | 3 | 三班 | F | 91 |
| 9 | 小王 | 3 | 三班 | M | 89 |
| 10 | 小丽 | 3 | 三班 | F | 88 |
| 11 | 小花 | 5 | NULL | M | 95 |
+----+--------+----------+------------+--------+-------+
11 rows in set (0.00 sec)