外连接
(1) 例子:
select e.ename,d,dname from emp e right join dept d on e.deptno = d.deptno;
right 代表:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。
带有left的是左外连接。
任何一个右连接都有左连接的写法。
任何一个左连接都有右连接的写法。
左外连接可以写成left outer join
右外连接可以写成right outer join
(2) 例子:查询每个员工的上级领导,要求显示所有员工的名字和领导名。
select a.ename as ‘员工名’ , b.ename as ‘领导名’ 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中内连接和外连接可以混合,都可以出现
(1)案例:找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级。
select e.ename,e.sal,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;
子查询
(1)select 语句中嵌套select 语句,被嵌套的select语句称为子查询
(2)子查询都可以出现在哪里呢?
select……(select)
from……(select)
where……(select)
(3)where子句中的子查询
案例:找出比最低工资高的员工姓名和工资
select ename,sal from emp where sal>min(sal);
会报错!!!
where子句中不能直接使用分组函数
实现思路:
第一步:查询最低工资是多少
select min(sal) from emp;
第二步:找出>800的
select ename,sal from emp where sal>800;
第三步:合并
select ename,sal from emp where sal > (select min(sal) from emp);
(4) from子句中的子查询
注意:from 后面的子查询,可以将子查询的查询结果当作一张临时表
案例:找出每个岗位的平均工资的薪资等级
第一步:找出每个岗位的平均工资(按照岗位分组求平均值)
select job,avg(sal) from emp group by job;
第二步:将上表和工资等级表进行连接。条件为平均工资在losal和hisal之间
select s.grade,t.* from
(select job,avg(sal) as avgsal from emp group by job
) t
join salgrade s on
t.avgsal between s.losal and s.hisal;
(5)select后面的子查询
例子:找出每个员工的部门名称,显示员工名,部门名
select e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;
注意:对于select后面的子查询来说,这个子查询只能一次返回一条结果,多于1条就会报错。
例:
select e.ename,e.deptno,(select dname from dept) as dname from emp e;