SQL语句复习【专题五】sql
单行子查询:只会获得一个结果的子查询【子查询的内容必须放在小括号中。在查询语句中的查询语句 】
--查询全部比 CLARK 员工 工资高的员工
--1.先查询 CLARK 员工的工资
select sal from emp where ename='CLARK'--2450
--2.而后拿着CLARK的工资去比较
select * from emp where sal > 2450 order by sal
--3.合二为一 => 子查询
select * from emp where sal > (select sal from emp where ename='CLARK') order by sal
ide
--查询工资高于平均工资的员工的名字和工资
--1.先查询平均工资
select avg(sal) from emp
--2.合二为一 => 子查询
select ename, sal from emp where sal > (select avg(sal) from emp)spa
--查询和scott同一个部门的,可是比scott入职时间早的员工的信息
--1.先查询 scott 的部门编号
select deptno from emp where ename='SCOTT'--20
--2.查询scott 的入职时间
select hiredate from emp where ename='SCOTT'--87,4,19
--3.最终SQL语句
select * from emp where deptno=(select deptno from emp where ename='SCOTT') and hiredate<(select hiredate from emp where ename='SCOTT')code
--查询 和 scott 同一个部门,可是比scott工资低的员工的信息
--1.先查询 scott 的部门编号
select deptno from emp where ename='SCOTT'--20
--2.在查询scott 的工资
select sal from emp where ename='SCOTT'--3000
--3.最终SQL语句
select * from emp where deptno=(select deptno from emp where ename='SCOTT') and sal < (select sal from emp where ename='SCOTT')blog
--查询 比scott 工资高或者入职时间比scott早的员工的编号 和姓名
--1.查询scott 的工资
select sal from emp where ename='SCOTT'--3000
--3.查询scott 的入职时间
select hiredate from emp where ename='SCOTT'--87,4,19
--3.最终SQL语句
select empno, ename from emp
where sal > (select sal from emp where ename='SCOTT') or hiredate< (select hiredate from emp where ename='SCOTT')排序
多行子查询:子查询的结果会有多个
1) all: 和全部的子查询的结果去比较
2) any:和子查询的结果集中的任意一个比较
3) in: 和子查询的结果集中的某一个比较是否相等event
--查询工资低于任意一个 ‘CLERK’的工资的员工信息
--1.先查出全部的 职员 的工资
select sal from emp where job='CLERK'
--2.最后SQL语句
select * from emp where sal < any(select sal from emp where job='CLERK')class
--查询工资 比全部的'SALESMAN'都高的员工的编号,姓名,工资
--查询全部的销售人员的工资
select sal from emp where job='SALESMAN'
--2.最后SQL语句
select empno,ename,sal from emp where sal > all(select sal from emp where job='SALESMAN')cli
--查询20号部门的中职务和10号部门职务相同的员工的信息
--1.先求10号部门的全部的人的工做
select distinct job from emp where deptno=10
--2.最终SQL
select * from emp where deptno=20 and job in(select distinct job from emp where deptno=10)sed
--查询哪些员工是领导,将领导的信息所有显式
--in any
--统计领导的编号
select distinct mgr from emp where mgr is not null
-- in 员工的编号 在领导的编号的集合中
select *from emp where empno in(select distinct mgr from emp where mgr is not null)
--any 员工的编号等于 领导的编号集合中的某一个
select * from emp where empno=any(select distinct mgr from emp where mgr is not null)
--查询20号部门中收入最高的职员的信息
--先求20号部门的最高工资 3000
select max(sal) from emp where deptno=20
--最终SQL语句
select *from emp where sal=(select max(sal) from emp where deptno=20)
--查询全部部门的平均薪水的等级
-- 1.先查询全部的部门的平均薪水
select deptno,avg(sal) from emp group by deptno
--将子查询做为一张表
--sql 92
select T.deptno, T.avg_sal, s.grade
from (select deptno,avg(sal) avg_sal from emp group by deptno) T, salgrade s
where T.avg_sal between s.losal and s.hisal
--sql 99
select T.deptno, T.avg_sal, s.grade
from (select deptno,avg(sal) avg_sal from emp group by deptno) T join salgrade s
on T.avg_sal between s.losal and s.hisal
--查询部门的详细信息,以及部门的平均工资和工资等级 三表查询
-- 查询全部的部门的平均薪水
select deptno,avg(sal) from emp group by deptno
--sql92
select d.*,T.avg_sal,s.grade
from (select deptno,avg(sal) avg_sal from emp group by deptno) T, salgrade s,dept d
where T.avg_sal between s.losal and s.hisal and T.deptno=d.deptno
--sql99
select d.*,T.avg_sal,s.grade
from (select deptno,avg(sal) avg_sal from emp group by deptno) T join salgrade s
on T.avg_sal between s.losal and s.hisal
join dept d
on T.deptno=d.deptno
相关子查询
--1:查询全部的部门的最高工资的员工的信息
--查询10部门的最高工资的员工的信息
--10部门的最高工资
select max(sal) from emp where deptno=40
select * from emp where deptno=10 and sal=(select max(sal) from emp where deptno=10)--1
select * from emp where deptno=20 and sal=(select max(sal) from emp where deptno=20)--2
select * from emp where deptno=30 and sal=(select max(sal) from emp where deptno=30)--1
select * from emp where deptno=40 and sal=(select max(sal) from emp where deptno=40)
-----------------------------------------------------------------------------------------------------------------------------
select * from emp e where sal=(select max(sal) from emp where deptno=e.deptno)
--2:查询工资高于其所在部门的平均工资的员工的信息
--查询工资高于10部门的平均工资的10部门员工的信息
--10部门的平均工资
select avg(sal) from emp where deptno=10
select * from emp where deptno=10 and sal > (select avg(sal) from emp where deptno=10)--1
select * from emp where deptno=20 and sal > (select avg(sal) from emp where deptno=20)--3
select * from emp where deptno=30 and sal > (select avg(sal) from emp where deptno=30)--2
-------------------------------------------------------------------------------------------------------------------------------------
select * from emp e1 where sal > (select avg(sal) from emp e2 where e2.deptno=e1.deptno)
总结:
--不相关子查询:能够单独运行,先执行子查询再执行 外查询。
--相关子查询:不能够单独运行,先执行外查询,再执行子查询。
--3:查询全部部门的最高工资的员工的信息
--查询全部部门的最高工资
select deptno, max(sal) from emp group by deptno
--方式-1
select e.*
from emp e, (select deptno, max(sal) max_sal from emp group by deptno) T
where e.deptno=T.deptno and e.sal=T.max_sal
--方式-2
select * from emp where (deptno,sal) in (select deptno, max(sal) from emp group by deptno)
----------------------------------------------------------------小练习---------------------------------------------------------------------
1 --一、列出全部员工的年工资,按年薪从低到高排序。 2 select ename, sal*12+nvl(comm,0)*12 year_sal from emp order by year_sal 3 --二、列出薪金比“ SMITH ”多的全部员工。 4 select * from emp where sal>(select sal from emp where ename='SMITH') 5 --三、列出全部员工的姓名及其直接上级的姓名。 sql92 , sql99 6 --sql92 7 select e1.ename,e2.ename 8 from emp e1, emp e2 9 where e1.mgr= e2.empno 10 --sql99 11 select e1.ename,e2.ename 12 from emp e1 join emp e2 13 on e1.mgr= e2.empno 14 --四、列出受雇日期早于其直接上级的全部员工。 15 --sql99 16 select e1.* 17 from emp e1 join emp e2 18 on e1.mgr=e2.empno 19 where e1.hiredate < e2.hiredate 20 --五、列出部门名称和这些部门的员工信息,包括那些没有员工的部门。 21 select d.dname,e.* 22 from emp e right join dept d 23 on e.deptno=d.deptno 24 --六、列出全部job 为“ CLERK ”(办事员)的姓名及其部门名称。 25 select e.ename,d.dname 26 from emp e join dept d 27 Using(deptno) 28 where e.job='CLERK' 29 --七、列出最低薪金大于1500 的各类工做。 30 select job, min(sal) 31 from emp 32 group by job 33 having min(sal) > 1500 34 --八、列出在部门“ SALES ”(销售部)工做的员工的姓名,假定不知道销售部的部门编号。 35 select e.deptno,e.ename 36 from emp e join dept d 37 on e.deptno=d.deptno 38 where d.dname='SALES' 39 --九、列出薪金高于公司平均薪金的全部员工。 40 select * from emp where sal > (select avg(sal) from emp) 41 --十、列出与“ SCOTT ”从事相同工做的全部员工。 42 select * from emp where job=(select job from emp where ename='SCOTT') and ename<>'SCOTT' 43 --十一、列出薪金高于在部门 30 工做的全部员工的薪金的员工姓名和薪金。 44 select ename,sal from emp where sal>all(select sal from emp where deptno=30) 45 --十二、列出在每一个部门工做的员工数量、平均工资和平均服务期限(年)。 46 select deptno, count(*), avg(sal) , avg(to_char(sysdate,'YYYY')-to_char(hiredate,'YYYY')) 平均服务年限 47 from emp 48 group by deptno 49 --1三、列出全部员工的姓名、部门名称和工资。 50 select e.ename,d.dname,e.sal from emp e natural join dept d 51 --1四、列出从事同一种工做但属于不一样部门的员工的一种组合。 52 select e1.ename,e1.job ,e1.deptno,e2.ename,e2.job,e2.deptno 53 from emp e1 join emp e2 54 on e1.job=e2.job and e1.deptno<>e2.deptno and e1.ename >e2.ename 55 --1五、列出全部部门的详细信息和部门人数。 56 select d.*, count(*) 57 from emp e join dept d 58 on e.deptno=d.deptno 59 group by d.deptno,d.dname,d.loc 60 61 select d.*,count(e.ename) from dept d left join emp e 62 on d.deptno = e.deptno 63 group by d.deptno,d.dname,d.loc 64 --1六、列出各类工做的最低工资。 65 select job,min(sal) from emp group by job 66 -- 17 、列出各个部门的 MANAGER (经理)的最低薪金。 67 select deptno,min(sal) 68 from emp 69 where job='MANAGER' 70 group by deptno 71 --1八、列出至少有一个员工的全部部门。 72 select d.*,count(*) 73 from emp e join dept d 74 on e.deptno=d.deptno 75 group by d.deptno,d.dname,d.loc 76 having count(*)>0