- 把查询结果去除重复记录
注意:原表数据不会被修改,只是查询结果去重
去重需要使用一个关键字:distinct //只能出现在所有字段的最前方 - 什么是连接查询
从一张表中单独查询,称为单表查询
emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字
这种跨表查询,多张表联合起来查询数据,称为连接查询 - 连接查询的分类
根据语法的年代分类:- SQL92、SQL99,我们这里重点学习SQL99
- 根据表连接的方式分类:
- 内连接:
- 等值连接
- 非等值连接
- 自连接
- 外连接:
- 左外连接(左连接)
- 右外连接(右连接)
- 全连接(不讲)
- 内连接:
- 当两张表进行连接查询时,没有任何条件的限制会发生什么现象?
- 案例:查询每个员工所在部门名称
当两张表进行连接查询,没有任何条件的限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象。
- 案例:查询每个员工所在部门名称
- 怎么避免笛卡尔积现象?
- 连接时加条件,满足这个条件的记录被筛选出来!
注意:通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表的连接次数
- 连接时加条件,满足这个条件的记录被筛选出来!
- 内连接之等值连接
- 案例:查询每个员工所在部门名称,显示员工名和部门名
select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;//SQL92的语法
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;//SQL99的语法
- 案例:查询每个员工所在部门名称,显示员工名和部门名
- 内连接之非等值连接
- 案例:找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级
select e.ename,e.sal,sg.grade from emp e join salgrade sg on e.sal >= sg.losal and e.sal <= sg.hisal;
- 案例:找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级
- 内连接之自连接
- 案例:查询员工的上级领导,要求显示员工名和对应的领导名
select a.ename '员工名',b.ename '领导名' from emp a join emp b on a.mgr = b.empno;//13条记录,没有KING(内连接)
以上就是内连接中的自连接:自连接的技巧:一张表看做两张表
- 案例:查询员工的上级领导,要求显示员工名和对应的领导名
- 内连接(A和B连接,AB两张表没有主次关系,平等的):
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;
//内连接特点:完成能够匹配上这个条件的数据查询出来 - 外连接(右外连接):
select e.ename,d.dname from emp e right join dept d on e.deptno = d.deptno; - 外连接(左外连接):
select e.ename,d.dname from dept d left join emp e on e.deptno = d.deptno;
right代表什么:表示将join关键字右边的这张表看成主表,主要是为了
将这张表的数据全部查询出来,捎带着关联查询左边的表
注意:外连接的查询结果条数一定是 >= 内连接的查询结果条数- 案例:查询每个员工的上级领导,要求显示所有员工的名字和领导名
select a.ename '员工名',b.ename '领导名' from emp a left join emp b on a.mgr = b.empno;
- 案例:查询每个员工的上级领导,要求显示所有员工的名字和领导名
- 三张表、四张表怎么连接?
- 语法:
select ... from a join b on a和b的连接条件 join c on a和c的连接条件 join d on a和d的连接条件
一条SQL中内连接和外连接可以混合,都可以出现 - 案例:找出每个员工的部门名称以及工资等级,还有上级领导,要求显示员工名,部门名,薪资,薪资等级
select
e.ename,d.dname,e.sal,s.grade,l.ename
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 l
on
e.mgr = l.empno;
- 语法: