• Oracle--子查询


     
    求出谁的工资比 scott 工资高
    1.先求出scott工资
    select sal from emp
    where ename = 'SCOTT';
    2.查询谁的工资比scott高
     
    select * 
    from emp
    where sal > (select sal from emp
    where ename = 'SCOTT');
    子查询的本质就是 select 语言的嵌套
    使用子查询的场景:对于一步不能解决的问题,需要多步
    案例--查询部门为sale的员工信息
    select *
    from emp
    where deptno = (
            select deptno 
            from dept
            where dname = 'SALES'
    );
    使用多表查询
    select e.*
    from emp e, dept d
    where e.deptno = d.deptno and d.dname = 'SALES';
    可以在主查询的什么地方放一个子查询
     
            select a, b, c (select *...)    //ok    //在select 后面的子查询,必须是单行子查询
            from tab1 ,tab2, (select **)    //ok
            where ... (select *...)         //ok
            order by ...    //err
            group by ...    //err
            having ...(select ****)         //
     查询 和141号员工工种一样的,薪水比143号员工工资高的员工信息
            select last_name, job_id, salary
            from employees
            where job_id = (
                    select job_id
                    from employees
                    where employee_id = 141
            )
            and salary > (
                    select salary
                    from employees
                    where employee_id = 143
            );
     查询工资最低的员工信息
            select last_name, job_id, salary
            from employees
            where salary = (
                    select MIN(salary)
                    from employees
            );
    求最低工资比50号部门最低工资的各个部门编号和部门最低工资
            select department_id, MIN(salary)
            from employees
            group by department_id
            having MIN(salary) > (
                    select MIN(salary)
                    from employees
                    where department_id = 50
            );
     
    多行查询:多行比较操作符
    --查询部门为 SALES 和 ACCOUNTING 的员工信息
            select *
            from emp
            where deptno in (select deptno from dept where dname='SALES' or dname = 'ACCOUNTING');



    --查询部门名称为 不是 SALES 和 ACCOUNTING 的员工信息
            select *
            from emp
            where deptno not in (select deptno from dept where dname='SALES' or dname = 'ACCOUNTING');



    --查询薪水比 30 号部门所有员工薪资都高的员工信息
            select * 
            from emp
            where sal > (select max(sal) from emp where deptno = 30);
    
            select * 
            from emp
            where sal > all(select max(sal) from emp where deptno = 30);
    --查询薪水比 30 号部门任意员工薪资都高的员工信息
            select * 
            from emp
            where sal > (select min(sal) from emp where deptno = 30);
    
    
            select * 
            from emp
            where sal > all(select min(sal) from emp where deptno = 30);



    any/all 的运算和前面的逻辑比较关系相关
    # 面试强化
    --查询不是经理的员工信息
    分析:先查询是经理的员工信息
            select *
            from emp
            where empno in (select mgr from emp);
    在查询不是经理的员工信息且mgr列信息不为空
            select *
            from emp
            where empno not in (select mgr from emp where mgr is not null);



    --查询员工表中工资最高的三个员工信息
            select empno, ename, sal
            from emp
            order by sal desc;
    
            select rownum, empno, ename, sal
            from emp
            where rownum <= 3
            order by sal desc
    rownum:
            服务器返回的结果集的固有属性
            rownum 只能使用小于,不能大于
    =====》top-N
            select rownum, empno, ename, sal from
            (
                    select  empno, ename, sal
                    from emp
                    order by sal desc
            )
            where rownum <=3 ;
    =====》分页操作:
    select r, empno, ename, sal
    from
            (
                    select rownum r, empno, ename, sal from
                    (
                            select  empno, ename, sal
                            from emp
                            order by sal desc
                    )
            where rownum <= 8
            )
    where r >= 5;




    **解决分页的思路**
            思路:内层排序,外层选择
            内:排序
            中:使用rownum选择前n条,并给rownum指定一个别名,以供最外层过滤使用
            外:去掉前n层结果
    --找到员工表中薪水大于本部门平均薪水的员工
    ### 多表查询
    1.求各个部门的平均薪水水平
            select deptno , avg(sal) avgsal
            from emp
            group by deptno
    2.可以把部门平均薪水的数据,看成一个表,多表查询
    select e.empno, e.ename, e.sal, d.avgsal
    from emp e ,
            (
                    select deptno , avg(sal) avgsal
                    from emp
                    group by deptno     
            ) d
    where e.deptno = d.deptno and e.sal > d.avgsal;
    ### 方法2:子查询
            select empno, ename, sal, (员工所在部门的平均工资) avgsal
            from emp
            where sal > (员工所在部门的平均工资) avgsal
            员工所在部门的平均工资
            select e.empno, e.ename, e.sal, ( select avg(sal) avgsal from emp where deptno = e.deptno) avgsal
            from emp e
            where sal > ( select avg(sal) avgsal from emp where deptno = e.deptno);
    主查询通过别名把著查询的值传递给子查询
  • 相关阅读:
    什么样的人适合边打工边创业?
    手机市场分析
    《这个男人来自地球》台词
    关系网成网络盈利模式 LinkedIn网站探秘
    第二届手机应用大赛“金枝奖”评选
    乔布斯的平静让人不寒而栗
    发展移动互联网需理清商业模式
    好想看故乡夏夜的天空
    AdoHelper能否改写成单例模式?
    GMail邀请发放处
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/13234978.html
Copyright © 2020-2023  润新知