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

--查询工资高于平均工资的员工的名字和工资
--1.先查询平均工资
select avg(sal) from emp
--2.合二为一  => 子查询
select ename, sal from emp where sal > (select avg(sal) from emp)

--查询和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')

--查询 和 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')

--查询 比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:   和子查询的结果集中的某一个比较是否相等

--查询工资低于任意一个 ‘CLERK’的工资的员工信息
--1.先查出所有的 职员 的工资
select sal from emp where job='CLERK'
--2.最后SQL语句
select * from emp where sal < any(select sal from emp where job='CLERK')

--查询工资 比所有的'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')

--查询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)

--查询哪些员工是领导,将领导的信息全部显式
--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 --1、列出所有员工的年工资,按年薪从低到高排序。
 2 select ename, sal*12+nvl(comm,0)*12 year_sal from emp order by year_sal
 3 --2、列出薪金比“ SMITH ”多的所有员工。
 4 select * from emp where sal>(select sal from emp where ename='SMITH')
 5 --3、列出所有员工的姓名及其直接上级的姓名。 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 --4、列出受雇日期早于其直接上级的所有员工。
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 --5、列出部门名称和这些部门的员工信息,包括那些没有员工的部门。
21 select d.dname,e.*
22 from emp e right join dept d
23 on e.deptno=d.deptno
24 --6、列出所有job 为“ CLERK ”(办事员)的姓名及其部门名称。
25 select e.ename,d.dname
26 from emp e join dept d
27 Using(deptno)
28 where e.job='CLERK'
29 --7、列出最低薪金大于1500 的各种工作。
30 select job, min(sal)
31 from emp
32 group by job
33 having min(sal) > 1500
34 --8、列出在部门“ 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 --9、列出薪金高于公司平均薪金的所有员工。
40 select * from emp where sal > (select avg(sal) from emp)
41 --10、列出与“ SCOTT ”从事相同工作的所有员工。
42 select * from emp where job=(select job from emp where ename='SCOTT') and ename<>'SCOTT'
43 --11、列出薪金高于在部门 30 工作的所有员工的薪金的员工姓名和薪金。
44 select ename,sal from emp where sal>all(select sal from emp where deptno=30)
45 --12、列出在每个部门工作的员工数量、平均工资和平均服务期限(年)。
46 select deptno, count(*), avg(sal) , avg(to_char(sysdate,'YYYY')-to_char(hiredate,'YYYY')) 平均服务年限
47 from emp
48 group by deptno
49 --13、列出所有员工的姓名、部门名称和工资。
50 select e.ename,d.dname,e.sal from emp e natural join dept d
51 --14、列出从事同一种工作但属于不同部门的员工的一种组合。
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 --15、列出所有部门的详细信息和部门人数。
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 --16、列出各种工作的最低工资。
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 --18、列出至少有一个员工的所有部门。
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
小练习
原文地址:https://www.cnblogs.com/cao-yin/p/10502726.html