数据库连接查询

操作数据库当中,常常涉及多表查询。而在进行多表查询操作时,SQL提供了不同的表与表之间的连接方式,来获取用户所需的数据。

以下我们将主要围绕以下两个表进行数据库的多表查询操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
> -- 雇员表
> select * from employee;
+----+------+---------------+
| id | name | department_id |
+----+------+---------------+
| 1 | 张三 | 1 |
| 2 | 李四 | 1 |
| 3 | 王五 | 2 |
| 4 | 赵六 | 2 |
| 5 | 郑七 | 3 |
+----+------+---------------+

> -- 部门表
> select * from department;
+----+--------+
| id | name |
+----+--------+
| 1 | 技术部 |
| 2 | 技术部 |
| 3 | 工程部 |
+----+--------+

  • 内连接(INNER JOIN)

内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

1
2
3
4
5
6
7
8
9
10
11
12
> -- 由于雇员表中郑七没有与部门表中任何一行匹配,即在返回的数据不会显示
> SELECT e.id AS '员工编号', e. NAME AS '员工名称', d. NAME AS '所属部门'
> FROM employee AS e
> INNER JOIN department AS d ON e.department_id = d.id;
+----------+----------+----------+
| 员工编号 | 员工名称 | 所属部门 |
+----------+----------+----------+
| 1 | 张三 | 技术部 |
| 2 | 李四 | 技术部 |
| 3 | 王五 | 市场部 |
| 4 | 赵六 | 市场部 |
+----------+----------+----------+
  • 左外连接(LEFT JOIN)

左向外连接的结果集包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

1
2
3
4
5
6
7
8
9
10
11
12
13
> -- 左外连接会根据左表中的所有内容与右表进行匹配,即使右表不匹配也会显示所有数据
> SELECT e.id AS '员工编号', e. NAME AS '员工名称', d. NAME AS '所属部门'
> FROM employee AS e
> LEFT JOIN department AS d ON e.department_id = d.id;
+----------+----------+----------+
| 员工编号 | 员工名称 | 所属部门 |
+----------+----------+----------+
| 1 | 张三 | 技术部 |
| 2 | 李四 | 技术部 |
| 3 | 王五 | 市场部 |
| 4 | 赵六 | 市场部 |
| 5 | 郑七 | NULL |
+----------+----------+----------+
  • 右外连接(RIGHT JOIN)

右向外连接是左向外连接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

1
2
3
4
5
6
7
8
9
10
11
12
13
> -- 与左外连接完全相反
> SELECT e.id AS '员工编号', e. NAME AS '员工名称', d. NAME AS '所属部门'
> FROM employee AS e
> RIGHT JOIN department AS d ON e.department_id = d.id;
+----------+----------+----------+
| 员工编号 | 员工名称 | 所属部门 |
+----------+----------+----------+
| 1 | 张三 | 技术部 |
| 2 | 李四 | 技术部 |
| 3 | 王五 | 市场部 |
| 4 | 赵六 | 市场部 |
| NULL | NULL | 工程部 |
+----------+----------+----------+
  • 全外连接(FULL JOIN)

完整外部连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> -- MYSQL不支持全外连接,这个例子为手写例子
> SELECT e.id AS '员工编号', e. NAME AS '员工名称', d. NAME AS '所属部门'
> FROM employee AS e
> FULL JOIN department AS d ON e.department_id = d.id;
+----------+----------+----------+
| 员工编号 | 员工名称 | 所属部门 |
+----------+----------+----------+
| 1 | 张三 | 技术部 |
| 2 | 李四 | 技术部 |
| 3 | 王五 | 市场部 |
| 4 | 赵六 | 市场部 |
| 5 | 郑七 | NULL |
| NULL | NULL | 工程部 |
+----------+----------+----------+

参考资料:

[1] http://www.cnblogs.com/devilmsg/archive/2009/03/24/1420543.html

[2] http://www.cnblogs.com/youzhangjin/archive/2009/05/22/1486982.html