连接与多表查询

连接是关系型数据库的主要特点,通过连接运算符可以实现多表查询。当两个或者多个表存在相同意义的字段时,可用通过这些字段对不同的表进行连接查询。

连接查询

MySQL支持以下三种连接查询

  • INNER JOIN :内连接
  • RIGHT OUTER JOIN:右连接
  • LEFT OUTER JOIN:左连接

三种连接查询的不同之处

内连接查询

结果集为左表A与右表B的交集。

c 连接mysql查询信息 mysql连接查询的几种方式_mysql


左连接查询

结果集为左表A全部。

c 连接mysql查询信息 mysql连接查询的几种方式_mysql_02


右链接查询

结果集为右表B的全部。

c 连接mysql查询信息 mysql连接查询的几种方式_mysql_03

下面以两个表(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)