连接查询
连接查询:也可以叫跨表查询,需要关联多个表进行查询。
数据表
员工表(emp)
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
|---|---|---|---|---|---|---|---|
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
部门表(dept)
| DEPTNO | DNAME | LOC |
|---|---|---|
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
工资表(salgrade)
| GRADE | LOSAL | HISAL |
|---|---|---|
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
连接查询的分类
根据表的连接方式来划分,包括:
- 内连接
- 等值连接
- 非等值连接
- 自连接
- 外连接
- 左外连接(左连接)
- 右外连接(右连接)
- 全连接
笛卡尔乘积现象
当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。
通过添加限制条件进行过滤可以避免笛卡尔积现象,但不会减少记录的匹配次数。限制条件只是起到过滤作用。
表的别名有什么好处
- 执行效率高
- 可读性好
内连接
语法:inner关键字可以省略
···
A
inner join
B
on
连接条件
where
···
等值连接
避免笛卡尔积现象的限制条件是等量关系
例子:查询每个员工的部门名称,要求显示员工名和部门名
select
e.ename, d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
非等值连接
避免笛卡尔积现象的限制条件是非等量关系
例子:查询每个员工的工资等级,要求显示员工名、工资、工资等级。
select
e.ename, e.sal, s.grade
from
emp e
inner join
salgrade s
on
e.sal between s.losal and s.hisal;
自连接
将一张表看作两张表,自己连接自己。
例子:查询每个员工的上级领导,要求显示员工名和对应领导名
select
a.ename, b.ename
from
emp a
join
emp b
on
a.mgr=b.empno;
外连接
语法:outer关键字可以省略
···
A
left(right) outer join
B
on
连接条件
where
···
外连接与内连接的区别
内连接:假设A表和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录都能查询出来,AB两张表没有主副之分,两张表是平等的。
外连接:假设A表和B表进行连接,使用外连接的话,两张表之中有一张表是主表,另一张是副表,主要查询主表中的数据。当副表中的数据没有和主表中的数据匹配上,副表自动填充NULL与之匹配。
左(右)外连接
左外连接(左连接):表示左边的这张表是主表。
右外连接(右连接):表示右边的这张表是主表。
例子:找出每个员工的上级领导,所有员工必须全部查询出来。
select
a.ename, b.ename
from
emp a
left outer join
emp b
on
a.mgr = b.empno;
在上例中,a表是主表,确保所有员工全部查询出来。b表是副表,主要用来查询上级领导。没有上级领导则填充null。
外连接最重要的特点是:主表的数据无条件的全部查询出来。
例子:查询没有员工的部门
select
d.*
from
emp e
right join
dept d
on
e.deptno=d. deptno
where
e.empno is null;
全连接
语法
···
A
full join
B
on
连接条件
where
···
A表和B表都是主表,在查询过程中两张表的数据全部都会显示出来。两表连接时,不满足连接条件的数据记录会使用NULL填充缺省部分。
三张表的连接查询
例子:找出每一个员工的部门名称和工资等级。
select
e.ename,d.dname,s.grade
from
emp e
join
dept d
on
e.deptno = d.deptno
join
salgrade s
on
e.sal between s.losal and s.hisal;
例子:找出每一个员工的部门名称、工资等级、上级领导。
select
e.ename,d.dname,s.grade
from
emp e
join
dept d
on
e.deptno = d.deptno
join
salgrade s
on
e.sal between s.losal and s.hisal
left join
emp e1
on
e.mgr=e1.empno;
本文介绍了MySQL中的多表查询,包括连接查询的种类如内连接、等值连接、非等值连接、自连接、外连接(左连接、右连接、全连接),并通过实例展示了如何使用这些连接类型查询员工、部门和工资等级信息。
&spm=1001.2101.3001.5002&articleId=130063778&d=1&t=3&u=4c8de6aab50c4e638bfa2c1841101c32)
5252

被折叠的 条评论
为什么被折叠?



