1、关于查询结果的去重
select distinct job from emp;//distinct 关键字去除重复记录

select ename,distinct job from emp;//error
distinct 只能出现在所有字段的最前面

统计岗位的数量
select count(distinct job) from emp;

2、连接查询
什么是连接查询
在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果
在实际开发中,一般一个业务都会对应多张表,比如:学生和老师,起码两张表。
将所有的信息存储在一张表中,数据会存在大量的重复,导致数据的冗(rong)余。
连接查询的分类
根据语法出现的年份来划分:
SQL92(一些老的DBA可能还在使用这种语法。DBA: DataBase Administrator,数据管理员)
SQL99(比较新的语法)
根据表的连接方式来划分
内连接
等值连接
非等值连接
自连接
外连接
左外连接(左连接)
右外连接(右连接)
全连接(这个基本不用,可以不学)
3、笛卡尔积现象(笛卡尔乘积现象)
(这是一种在表的连接查询出现的现象)
找出每一个员工的部门名称,要求显示员工名和部门名
select ename,dname from emp,dept;

笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终查询结果条数是两张表记录条数的乘积。
表的别名
select e.ename,d.dname from emp e,dept d;
表的别名有什么好处
- 执行效率高
- 可读性高
避免笛卡尔积现象(加条件过滤)
不会减少记录的匹配记录,只是显示有效的记录
4、内连接之等值连接
最大特定:条件是等量关系
找出一个员工的部门名称,要求显示员工名和部门名
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,d.dname
from
emp e
inner join //inner可以省略,带着inner目的是可读性好一些
dept d
on
e.deptno = d.deptno;

语法
···
A
join
B
on
连接条件
where
···
SQL99语法结构更加清晰一些:表的连接条件和后来的where条件分离了
5、内连接之非等值连接
最大的特定:连接条件中的关系是非等值连接。
找出一个员工的部门名称,要求显示员工号、工资、工资等级
select
e.ename,e.sal,s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal;

//inner可省
select
e.ename,e.sal,s.grade
from
emp e
inner join
salgrade s
on
e.sal between s.losal and s.hisal;

6、自连接
最大的特点是:一张表看作两张表。自己连接自己
找出每个员工的上级领导,要求显示员工名和对应的领导名

员工的领导编号 = 领导的员工编号
//内连接
select
a.ename as '员工名' ,b.ename as '领导名'
from
emp a
inner join
emp b
on
a.mgr = b.empno;

7、外连接
什么是外连接,和内连接的区别
内连接:
假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配的上的记录查询出来,这就是内连接
AB表没有主副之分,都是平等的
外连接:
假设A表和B表进行连接,使用外连接的话,AB两张表中有一张是主表,一张表是副表,主要查询主表中的
数据,捎带着查询副表,当副表中的数据没有和主表上的数据匹配上,副表自动模拟出NULL与之匹配
外连接的分类
左外连接(左连接):表示左边这张表是主表
右外连接(右连接):表示邮编这张表是主表
左连接有对应右连接的写法,右连接也会有对应左连接的写法
找出每个员工的上级领导(所有的员工必须全部查询出来)
//外连接(左外连接/左连接)
select
a.ename '员工',b.ename'领导'
from
emp a
left join
emp b
on
a.mgr = b.empno;
//outer可以省略
select
a.ename '员工',b.ename'领导'
from
emp a
left outer join
emp b
on
a.mgr = b.empno;

//外连接:(右外连接/右连接)
select
a.ename '员工',b.ename'领导'
from
emp a
right join
emp b
on
a.mgr = b.empno;
//outer可以省略
select
a.ename '员工',b.ename'领导'
from
emp a
right outer join
emp b
on
a.mgr = b.empno;

外连接最重要的特点是:主表的数据无条件的全部查询出来
找出哪个部门没有员工
select
d.*
from
emp e
right join
dept d
on
e.deptno = d.deptno
where
e.empno is null;

8、三张以上表连接查询
···
A
join
B
join
C
on
···
A表先和B表进行表连接,连接之后A表再继续和C表连接
找出每一个员工的部门名称以及工资等级
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,e1.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 e1
on
e.mgr = e1.empno;
