MySQL多表查询
摘要:
这是一篇关于MySQL的文章,主要介绍11. MySQL多表查询
MySQL多表查询
1. 连接查询
- 交叉连接: 生成笛卡尔积,它不使用任何匹配条件
- 内连接: 只连接匹配的行
- 外连接之左连接: 会显示左边表内所有的值,无论在右边的表内是否匹配
- 外连接之右连接: 会显示右边表内所有的值,无论在左边的表内是否匹配
- 全外连接: 包含左右两个表的全部行
2. 测试表结构与数据
mysql> desc department;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| dept_id | int(11) | YES | | NULL | |
| dept_name | varchar(100) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> desc employee;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| emp_id | int(11) | NO | PRI | NULL | auto_increment |
| emp_name | varchar(50) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| dept_id | int(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> select * from department;
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
| 200 | hr |
| 201 | it |
| 202 | sale |
| 203 | fd |
+---------+-----------+
4 rows in set (0.00 sec)
mysql> select * from employee;
+--------+----------+------+---------+
| emp_id | emp_name | age | dept_id |
+--------+----------+------+---------+
| 1 | tianyun | 26 | 200 |
| 2 | tom | 30 | 201 |
| 3 | jack | 24 | 201 |
| 4 | alice | 24 | 202 |
| 5 | robin | 40 | 204 |
| 6 | natasha | 28 | 204 |
+--------+----------+------+---------+
6 rows in set (0.00 sec)
3. 连接示例
3.1 交叉连接
mysql> select employee.emp_id, employee.emp_name, department.dept_name
-> from employee, department;
+--------+----------+-----------+
| emp_id | emp_name | dept_name |
+--------+----------+-----------+
| 1 | tianyun | hr |
| 1 | tianyun | it |
| 1 | tianyun | sale |
| 1 | tianyun | fd |
| 2 | tom | hr |
| 2 | tom | it |
| 2 | tom | sale |
| 2 | tom | fd |
| 3 | jack | hr |
| 3 | jack | it |
| 3 | jack | sale |
| 3 | jack | fd |
| 4 | alice | hr |
| 4 | alice | it |
| 4 | alice | sale |
| 4 | alice | fd |
| 5 | robin | hr |
| 5 | robin | it |
| 5 | robin | sale |
| 5 | robin | fd |
| 6 | natasha | hr |
| 6 | natasha | it |
| 6 | natasha | sale |
| 6 | natasha | fd |
+--------+----------+-----------+
24 rows in set (0.01 sec)
-- 两个表连接产生了笛卡尔积(即两个集合内的元素全部相乘)
3.2 内连接
-- 这是一个内连接,只连接匹配的行
mysql> select employee.emp_id, employee.emp_name, department.dept_name
-> from employee, department
-> where employee.dept_id = department.dept_id;
+--------+----------+-----------+
| emp_id | emp_name | dept_name |
+--------+----------+-----------+
| 1 | tianyun | hr |
| 2 | tom | it |
| 3 | jack | it |
| 4 | alice | sale |
+--------+----------+-----------+
4 rows in set (0.03 sec)
3.3 左外连接
-- from 那一句表示employee去左连接department表
-- on 那一句表示条件
-- 左连接即是左边表中的所有字段都会显示出来,不管条件有没有匹配上
mysql> select employee.emp_id, employee.emp_name, department.dept_name
-> from employee left join department
-> on employee.dept_id = department.dept_id;
+--------+----------+-----------+
| emp_id | emp_name | dept_name |
+--------+----------+-----------+
| 1 | tianyun | hr |
| 2 | tom | it |
| 3 | jack | it |
| 4 | alice | sale |
| 5 | robin | NULL |
| 6 | natasha | NULL |
+--------+----------+-----------+
6 rows in set (0.01 sec)
3.4 右外连接
-- from 那一句表示employee去右连接department表
-- on 那一句表示条件
-- 右连接即是右边表中的所有字段都会显示出来,不管条件有没有匹配上
mysql> select employee.emp_id, employee.emp_name, department.dept_name
-> from employee right join department
-> on employee.dept_id = department.dept_id;
+--------+----------+-----------+
| emp_id | emp_name | dept_name |
+--------+----------+-----------+
| 1 | tianyun | hr |
| 2 | tom | it |
| 3 | jack | it |
| 4 | alice | sale |
| NULL | NULL | fd |
+--------+----------+-----------+
5 rows in set (0.00 sec)
3.5 全外连接
-- 这是一个全外连接,包含左右两个表的所有行
mysql> select * from employee full join department;
+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | tianyun | 26 | 200 | 200 | hr |
| 1 | tianyun | 26 | 200 | 201 | it |
| 1 | tianyun | 26 | 200 | 202 | sale |
| 1 | tianyun | 26 | 200 | 203 | fd |
| 2 | tom | 30 | 201 | 200 | hr |
| 2 | tom | 30 | 201 | 201 | it |
| 2 | tom | 30 | 201 | 202 | sale |
| 2 | tom | 30 | 201 | 203 | fd |
| 3 | jack | 24 | 201 | 200 | hr |
| 3 | jack | 24 | 201 | 201 | it |
| 3 | jack | 24 | 201 | 202 | sale |
| 3 | jack | 24 | 201 | 203 | fd |
| 4 | alice | 24 | 202 | 200 | hr |
| 4 | alice | 24 | 202 | 201 | it |
| 4 | alice | 24 | 202 | 202 | sale |
| 4 | alice | 24 | 202 | 203 | fd |
| 5 | robin | 40 | 204 | 200 | hr |
| 5 | robin | 40 | 204 | 201 | it |
| 5 | robin | 40 | 204 | 202 | sale |
| 5 | robin | 40 | 204 | 203 | fd |
| 6 | natasha | 28 | 204 | 200 | hr |
| 6 | natasha | 28 | 204 | 201 | it |
| 6 | natasha | 28 | 204 | 202 | sale |
| 6 | natasha | 28 | 204 | 203 | fd |
+--------+----------+------+---------+---------+-----------+
24 rows in set (0.00 sec)
2016年04月10日 / 10:56