SQL语句复习【专题五】

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
小练习
相关文章
相关标签/搜索