首页 > 代码库 > 高级子查询【weber出品必属精品】

高级子查询【weber出品必属精品】

  1. 多列子查询

    where条件中出现多列与子查询进行比较

    多列子查询分为:成对比较和非成对比较

    成对比较:

    SQL> select ename,sal,job from emp where (deptno,job) in(select deptno,job from emp where ename=SCOTT);ENAME    SAL JOB------ ----- ---------FORD    3000 ANALYSTSCOTT   4000 ANALYST

    非成对比较:

    select ename,sal,job from emp where deptno=(select deptno from emp where ename=SCOTT)and   job = (select job from emp where ename=SCOTT)ENAME    SAL JOB------ ----- ---------SCOTT   4000 ANALYSTFORD    3000 ANALYST
  2.  标量子查询表达式

    标量子查询是从一行中返回一列值的子查询

    标量子查询可用于:

    1. DECODE 和CASE的条件和表达式部分

    2. 除了GROUP BY之外的所有SELECT语句

    CASE表达式中使用标量子查询:CASE表达式可以实现if --then-- else的功能

    SQL> select employee_id,last_name,(
       case
    when department_id=(select department_id from departments where location_id=1800)
    then CANDA elseUSA end ) location
    from employees;EMPLOYEE_ID LAST_NAME LOCAT----------- ------------------------- ----- 198 OConnell USA 199 Grant USA 200 Whalen USA 201 Hartstein CANDA 202 Fay CANDA 203 Mavris USA 204 Baer USA 205 Higgins USA 206 Gietz USA 100 King USA 101 Kochhar USA .......................
    107
    rows selected.
  3.  ORDER BY子句中使用标量子查询
    SQL> select ename,sal,deptno from emp order by (select dname from dept where emp.deptno=dept.deptno);ENAME             SAL     DEPTNO---------- ---------- ----------CLARK            2450         10KING             5000         10MILLER           1300         10JONES            2975         20FORD             3000         20ADAMS            1100         20SMITH             800         20SCOTT            3000         20WARD             1250         30TURNER           1500         30ALLEN            1600         30JAMES             950         30BLAKE            2850         30MARTIN           1250         3014 rows selected.
  4.  相互关联的子查询

    相互关联子查询用于行-执行-行的处理主查询的每一行子查询都要执行一次:通俗的说就是,主查询--->子查询--->主查询。就是这个执行顺序。

    ---从emp表中查询 薪水大于 部门平均薪水 的用户名,部门编号和薪水,没有大于的则不会被显示出来。
    select
    ename,deptno,salfrom emp outerwhere sal>(select avg(sal) from emp inner where outer.deptno=inner.deptno );ENAME DEPTNO SAL------ ------ -----ALLEN 30 1600JONES 20 2975BLAKE 30 2850SCOTT 20 4000KING 10 5000FORD 20 3000
  5.  再举一个相互关联的例子
    ---查询至少换了两次工作的员工---
    SQL> select employee_id,last_name,job_id from employees e where 2<=(select count(*) from job_history j where e.employee_id=j.employee_id);EMPLOYEE_ID LAST_NAME JOB_ID----------- ------------------------- ---------- 200 Whalen AD_ASST 101 Kochhar AD_VP 176 Taylor SA_REP
  6.  使用EXISTS

    EXISTS 检测子查询中行的存在性

    1.如果值存在于子查询中:
       终止在子查询中的查找
       条件返回TRUE

    2.如果值不存在于子查询中:
       条件返回FALSE
       继续在子查询中的查找

    ---示例:查找是领导的员工
    SQL> select empno,ename from emp outer where exists(select mgr from emp inner where outer.empno=inner.mgr); EMPNO ENAME---------- ---------- 7566 JONES 7698 BLAKE 7782 CLARK 7788 SCOTT 7839 KING 7902 FORD6 rows selected.

    另一种写法:

    SQL> select empno ,ename from emp  where empno in(select mgr from emp);     EMPNO ENAME---------- ----------      7566 JONES      7698 BLAKE      7782 CLARK      7788 SCOTT      7839 KING      7902 FORD6 rows selected.
  7. 我们来做另一个实验:查找不是领导的员工,也就是最基层的员工了。
    SQL> select empno,ename from emp outer where not exists (select 1 from emp inner where outer.empno=inner.mgr);     EMPNO ENAME---------- ----------      7369 SMITH      7499 ALLEN      7521 WARD      7654 MARTIN      7844 TURNER      7876 ADAMS      7900 JAMES      7934 MILLER8 rows selected.
    ---这里解释一下:not exists里的整数1的作用,只要是个整数即可,‘abc’字符串也可以。

     

  8.  
  9.  
  10.  
  11.