第三节课:自连接及三表联合查询
查询员工姓名,职位,薪资,上级领导姓名
select e.ename,e.job,e.sal,m.ename from emp e,emp m where e.mgr=m.empno--sql92
sql99实现:
select e.ename,e.job,e.sal,m.ename
from emp e
inner join emp m
on e.mgr=m.empno
-----------------------------------------------------------------------
sql99三表联合查询
查询员工姓名,工作,薪资,部门名称,城市名称
sql92实现:
select e.ename,e.job,e.sal,d.dname,c.cname
from emp e,dept d,city c
where e.deptno=d.deptno and d.loc=c.cid
sql99实现:
select e.ename,e.job,e.sal,d.dname,c.cname
from emp e
inner join dept d
on e.deptno=d.deptno
inner join city c
on d.loc=c.cid
查询工资高于2000的员工姓名,工作,薪资,部门名称,城市名称
sql92实现:
select e.ename,e.job,e.sal,d.dname,c.cname
from emp e,dept d,city c
where e.deptno=d.deptno and d.loc=c.cid and sal>2000
sql99实现:
select e.ename,e.job,e.sal,d.dname,c.cname --查询内容
from emp e --查询表
inner join dept d --链接表
on e.deptno=d.deptno --链接条件
inner join city c --链接表
on d.loc=c.cid --链接条件
where e.sal>2000 --筛选条件
第四节课:单行子查询
子查询(单行子查询、多行子查询)
单行子查询
select 内容 from 表名 where 子查询语句
1、什么时候使用单行子查询?
--在不能直接获取有效信息的时候,考虑使用子查询
2、单行子查询的注意事项?
---子查询的结果必须只有一个值
---可以直接使用算术链接符
---子查询出现在where中,一般出现在条件语句的右边
问题:查询所有比雇员“CLARK”工资高的员工信息
解读1:查询雇员CLARK的工资
select sal from emp where ename='CLARK'
解读2:查询工资大于2450的员工信息
select * from emp where sal>'2450'
使用子查询
select * from emp where sal>(select sal from emp where ename='CLARK')
select * from emp where (select sal from emp where ename='CLARK')<sal
查询工资高于平均工资的员工的名字和工资
select * from emp where sal>(select avg(sal) from emp) order by sal
查询和soctt属于同一部门且工资比他低的员工资料
select * from emp where deptno=(select deptno from emp where ename='SCOTT') and sal<(select sal from emp where ename='SCOTT')
查询工资最高的员工资料
select * from emp where sal=(select max(sal) from emp)
查询职务和scott相同,雇佣时间早的员工信息
select * from emp where job=(select job from emp where ename='SCOTT') and hiredate<(select hiredate from emp where ename='SCOTT')
查询工资比scott高或者雇佣时间早的员工编号和名字
select empno,ename from emp where sal>(select sal from emp where ename='SCOTT') or hiredate<(select hiredate from emp where ename='SCOTT')
查询工资高于任意一个CLERK的所有员工信息
select * from emp where sal>(select min(sal) from emp where job='CLERK') and job<>'CLERK'
----------------------------------------------------------------------------------------------
第五节课: 多行子查询
多行子查询学习:其实就使用使用关键字:any all in
注意:子查询返回多个值建议使用多行子查询,返回的单个值使用单行子查询
select * from emp where sal> any (select sal from emp where job='CLERK') and job<>'CLERK'
查询工资高于所有SALESMAN的员工信息
select * from emp where sal>(select max(sal) from emp where job='SALESMAN')--单行子查询的写法
select * from emp where sal>all (select sal from emp where job='SALESMAN';
查询部门20中同部门10的雇员工作一样的雇员信息
select * from emp where deptno='20' and (job='MANAGER' or job='PRESIDENT' or job='CLERK')
select * from emp where deptno='20' and job in ('MANAGER', 'PRESIDENT' , 'CLERK')
select * from emp where deptno='20' and job in (select job from emp where deptno='10')
select * from emp where deptno='20' and job= any (select job from emp where deptno='10')
select job from emp where deptno='10'