mysql学习笔记(四):多表查询(关联查询)
程序员文章站
2022-05-29 16:42:32
...
两张表中的数据为:
mysql> select * from department;
+----+----------+
| id | deptName |
+----+----------+
| 1 | 软件部 |
| 2 | 财务部 |
| 3 | 人事部 |
| 4 | 行政部 |
+----+----------+
4 rows in set
mysql> select * from employee;
+----+---------+--------+
| id | empName | deptId |
+----+---------+--------+
| 1 | rose | 1 |
| 2 | lily | 2 |
| 3 | lucy | 3 |
+----+---------+--------+
3 rows in set
一、交叉连接查询
查询员工及其所在部门(显示员工姓名和部门名称):
从结果可以看出,不是我们想要的结果,产生了 笛卡尔积 现象,3*4,有些数据是重复的;
mysql> select empName,deptName from employee,department;
+---------+----------+
| empName | deptName |
+---------+----------+
| rose | 软件部 |
| lily | 软件部 |
| lucy | 软件部 |
| rose | 财务部 |
| lily | 财务部 |
| lucy | 财务部 |
| rose | 人事部 |
| lily | 人事部 |
| lucy | 人事部 |
| rose | 行政部 |
| lily | 行政部 |
| lucy | 行政部 |
+---------+----------+
12 rows in set
二、内连接查询
查询员工及其所在部门(显示员工姓名和部门名称):
使用 where 条件语句(最常使用)
mysql> select empName,deptName from employee,department where employee.deptId=department.id;
+---------+----------+
| empName | deptName |
+---------+----------+
| rose | 软件部 |
| lily | 财务部 |
| lucy | 人事部 |
+---------+----------+
3 rows in set
内连接查询的另一种方式:使用关键字 inner join
mysql> select empName,deptName
-> from employee e
-> inner join department d
-> on e.deptId=d.id;
+---------+----------+
| empName | deptName |
+---------+----------+
| rose | 软件部 |
| lily | 财务部 |
| lucy | 人事部 |
+---------+----------+
3 rows in set
三、左外连接查询
查询每个部门的员工
用内连接查询无法达到要求,因为 行政部 没有对应的员工,需要显示 null;
使用左外连接查询:使用左边表的数据 去匹配右边表的数据,如果符合连接条件的结果则显示,
如果不符合连接条件则显示 null;
注意:左外连接查询,左表的数据一定会完全显示;
mysql> select deptName,empName
-> from department d
-> left outer join employee e
-> on d.id=e.deptId;
+----------+---------+
| deptName | empName |
+----------+---------+
| 软件部 | rose |
| 财务部 | lily |
| 人事部 | lucy |
| 行政部 | NULL |
+----------+---------+
4 rows in set
四、右外连接查询
查询每个部门的员工
使用右边表的数据 去匹配左边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示 null;
右外连接查询,右表的数据一定会完全显示;
mysql> select deptName,empName
-> from employee e
-> right outer join department d
-> on e.deptId=d.id;
+----------+---------+
| deptName | empName |
+----------+---------+
| 软件部 | rose |
| 财务部 | lily |
| 人事部 | lucy |
| 行政部 | NULL |
+----------+---------+
4 rows in set