欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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