zoukankan      html  css  js  c++  java
  • 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
    小练习
  • 相关阅读:
    java中public、private、protected区别
    Java构造函数
    吸血鬼数字算法
    JsonConvert.DeserializeObject<T>对象属性为空
    vs2015项目引用其他项目无法引用
    iis express 无法访问此网站
    c#Dictionary保存不同类型
    HttpContext.GetOwinContext().Authentication 报错 解决办法
    CSS基础1
    CSS基础3
  • 原文地址:https://www.cnblogs.com/cao-yin/p/10502726.html
Copyright © 2011-2022 走看看