1、外连接
什么是外连接,和内连接有什么区别?
内连接:
假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
AB两张表没有主副之分,两张表是平等的。
外连接:
假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
*例子:*找出每个员工的上级领导?(所有员工必须全部查询出来。)
左连接:表示左边的这张表是主表。
select
a.ename ‘员工’, b.ename ‘领导’
from
emp a
left outer join // outer可以省略,表示外连接
emp b
on
a.mgr = b.empno;
右连接:表示右边的这张表是主表。
select
a.ename ‘员工’, b.ename ‘领导’
from
emp b
right outer join // outer可以省略 ,表示外连接
emp a
on
a.mgr = b.empno;
外连接最重要的特点是:主表的数据无条件的全部查询出来。
2、三张表及以上表的连接查询
格式:
…
A
join
B
join
C
on
…
表示:A表和B表先进行表连接,连接之后A表继续和C表进行连接。
例子:找出每一个员工的部门名称、工资等级、以及上级领导。
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;
3、子查询
(1)where子句中使用子查询
例子:找出高于平均薪资的员工信息。
select * from emp where sal > avg(sal); //错误的写法,where后面不能直接使用分组
select * from emp where sal > (select avg(sal) from emp);
(2)from后面嵌套子查询
例子:找出每个部门平均薪水的等级。
第一步:找出每个部门平均薪水(按照部门编号分组,求sal的平均值)
select deptno,avg(sal) as avgsal from emp group by deptno;
第二步:将以上的查询结果当做临时表t,让t表和salgrade s表连接,条件是:t.avgsal between s.losal and s.hisal
select
t.*,s.grade
from
(select deptno,avg(sal) as avgsal from emp group by deptno) t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;
(3)在select后面嵌套子查询。(一般不用)
例子:找出每个员工所在的部门名称,要求显示员工名和部门名。
select
e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname
from
emp e;