《卸甲笔记》-子查询

1查询公司中工资最低的雇员的完整信息

Oracle

SQL> select *

  2  from emp

  3  where sal=(

  4  select MIN(sal) from emp);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7369 SMITH      CLERK         7902 17-DEC-80                   800                   20

PPAS

scott=# select *

scott-# from emp

scott-# where sal=(

scott(# select MIN(sal) from emp);

 empno | ename |  job  | mgr  |      hiredate      |  sal   | comm | deptno

-------+-------+-------+------+--------------------+--------+------+--------

  7369 | SMITH | CLERK | 7902 | 17-DEC-80 00:00:00 | 800.00 |      |     20

(1 row)

2子查询返回的结果就当它是一个数字,即直接判断此数字

Oracle

SQL> select *

  2   from emp

  3  where sal=800;

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7369 SMITH      CLERK         7902 17-DEC-80                   800                   20

PPAS

scott=# select * 

scott-# from emp

scott-# where sal=800;

 empno | ename |  job  | mgr  |      hiredate      |  sal   | comm | deptno

-------+-------+-------+------+--------------------+--------+------+--------

  7369 | SMITH | CLERK | 7902 | 17-DEC-80 00:00:00 | 800.00 |      |     20

(1 row)

在WHERE子句中使用子查询

子查询返回单行单列数据

3查询出基本工资比ALLEN低的全部雇员信息

Oracle

SQL> select *

  2  from emp

  3   where sal<(

  4  select sal

  5  from emp

  6  where ename='ALLEN');

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7369 SMITH      CLERK         7902 17-DEC-80                   800                   20

      7521 WARD       SALESMAN        7698 22-FEB-81        1250     500            30

      7654 MARTIN     SALESMAN         7698 28-SEP-81        1250    1400            30

      7844 TURNER     SALESMAN         7698 08-SEP-81        1500       0            30

      7876 ADAMS      CLERK        7788 23-MAY-87                1100                   20

      7900 JAMES      CLERK         7698 03-DEC-81                   950                   30

      7934 MILLER     CLERK          7782 23-JAN-82        1300                   10

 

7 rows selected.

PPAS

scott=# select *

scott-# from emp

scott-# where sal<(

scott(# select sal

scott(# from emp

scott(# where ename='ALLEN');

 empno | ename  |   job    | mgr  |      hiredate      |   sal   |  comm   | deptno

-------+--------+----------+------+--------------------+---------+---------+--------

  7369 | SMITH  | CLERK    | 7902 | 17-DEC-80 00:00:00 |  800.00 |         |     20

  7521 | WARD   | SALESMAN | 7698 | 22-FEB-81 00:00:00 | 1250.00 |  500.00 |     30

  7654 | MARTIN | SALESMAN | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 |     30

  7844 | TURNER | SALESMAN | 7698 | 08-SEP-81 00:00:00 | 1500.00 |    0.00 |     30

  7876 | ADAMS  | CLERK    | 7788 | 23-MAY-87 00:00:00 | 1100.00 |         |     20

  7900 | JAMES  | CLERK    | 7698 | 03-DEC-81 00:00:00 |  950.00 |         |     30

  7934 | MILLER | CLERK    | 7782 | 23-JAN-82 00:00:00 | 1300.00 |         |     10

(7 rows)

4查询基本工资高于公司平均薪金的全部雇员信息

Oracle

SQL> select *

  2  from emp

  3   where sal>(

  4  select AVG(sal)

  5  from emp);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7566 JONES      MANAGER           7839 02-APR-81        2975                   20

      7698 BLAKE      MANAGER           7839 01-MAY-81                2850                   30

      7782 CLARK      MANAGER           7839 09-JUN-81        2450                   10

      7788 SCOTT      ANALYST              7566 19-APR-87        3000                   20

      7839 KING       PRESIDENT     17-NOV-81              5000                   10

      7902 FORD       ANALYST              7566 03-DEC-81                3000                   20

 

6 rows selected.

PPAS

scott=# select *

scott-# from emp

scott-# where sal>(

scott(# select AVG(sal)

scott(# from emp);

 empno | ename |    job    | mgr  |      hiredate      |   sal   | comm | deptno

-------+-------+-----------+------+--------------------+---------+------+--------

  7566 | JONES | MANAGER   | 7839 | 02-APR-81 00:00:00 | 2975.00 |      |     20

  7698 | BLAKE | MANAGER   | 7839 | 01-MAY-81 00:00:00 | 2850.00 |      |     30

  7782 | CLARK | MANAGER   | 7839 | 09-JUN-81 00:00:00 | 2450.00 |      |     10

  7788 | SCOTT | ANALYST   | 7566 | 19-APR-87 00:00:00 | 3000.00 |      |     20

  7839 | KING  | PRESIDENT |      | 17-NOV-81 00:00:00 | 5000.00 |      |     10

  7902 | FORD  | ANALYST   | 7566 | 03-DEC-81 00:00:00 | 3000.00 |      |     20

(6 rows)

5查找出与ALLEN从事同一工作,并且基本工资傲宇雇员编号为7521的全部雇员信息

Oracle

SQL> select *

  2  from emp

  3  where job=(

  4  select job

  5  from emp

  6  where ename='ALLEN')

  7  AND

  8  sal>(

  9  select sal

 10  from emp

 11  where empno=7521);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7499 ALLEN      SALESMAN           7698 20-FEB-81        1600     300            30

      7844 TURNER     SALESMAN         7698 08-SEP-81        1500       0            30

PPAS

scott=# select *

scott-# from emp

scott-# where job=(

scott(# select job

scott(# from emp

scott(# where ename='ALLEN')

scott-# AND

scott-# sal>(

scott(# select sal

scott(# from emp

scott(# where empno=7521);

 empno | ename  |   job    | mgr  |      hiredate      |   sal   |  comm  | deptno

-------+--------+----------+------+--------------------+---------+--------+--------

  7499 | ALLEN  | SALESMAN | 7698 | 20-FEB-81 00:00:00 | 1600.00 | 300.00 |     30

  7844 | TURNER | SALESMAN | 7698 | 08-SEP-81 00:00:00 | 1500.00 |   0.00 |     30

(2 rows)

子查询返回单行多列数据

6查询与SCOTT从事同一工作且工资相同的雇员信息

Oracle

SQL> select *

  2  from emp

  3  where(job,sal)=(

  4  select job,sal

  5  from emp

  6  where ename='SCOTT')AND ename <>'SCOTT';

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7902 FORD       ANALYST              7566 03-DEC-81                3000                   20

PPAS

scott=# select *     

scott-# from emp

scott-# where(job,sal)=(

scott(# select job,sal

scott(# from emp

scott(# where ename='SCOTT')AND ename <>'SCOTT';

 empno | ename |   job   | mgr  |      hiredate      |   sal   | comm | deptno

-------+-------+---------+------+--------------------+---------+------+--------

  7902 | FORD  | ANALYST | 7566 | 03-DEC-81 00:00:00 | 3000.00 |      |     20

(1 row)

7查询与雇员7566从事同一工作且领导相同的全部雇员信息

Oracle

SQL> select * from emp

  2  where(job,mgr)=(

  3  select job,mgr

  4  from emp

  5  where empno=7566)

  6  and empno<>7566;

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7698 BLAKE      MANAGER           7839 01-MAY-81                2850                   30

      7782 CLARK      MANAGER           7839 09-JUN-81        2450                   10

PPAS

scott=# select * from emp

scott-# where(job,mgr)=(

scott(# select job,mgr

scott(# from emp

scott(# where empno=7566)

scott-# and empno<>7566;

 empno | ename |   job   | mgr  |      hiredate      |   sal   | comm | deptno

-------+-------+---------+------+--------------------+---------+------+--------

  7698 | BLAKE | MANAGER | 7839 | 01-MAY-81 00:00:00 | 2850.00 |      |     30

  7782 | CLARK | MANAGER | 7839 | 09-JUN-81 00:00:00 | 2450.00 |      |     10

(2 rows)

8查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)

Oracle

SQL> select *

  2  from emp

  3  where(job,TO_CHAR(hiredate,'yyyy'))=(

  4  select job,TO_CHAR(hiredate,'yyyy')

  5  from emp

  6  where ename='ALLEN');

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7499 ALLEN      SALESMAN           7698 20-FEB-81        1600     300            30

      7521 WARD       SALESMAN        7698 22-FEB-81        1250     500            30

      7654 MARTIN     SALESMAN         7698 28-SEP-81        1250    1400            30

      7844 TURNER     SALESMAN         7698 08-SEP-81        1500       0            30

PPAS

scott=# select *

scott-# from emp

scott-# where(job,TO_CHAR(hiredate,'yyyy'))=(

scott(# select job,TO_CHAR(hiredate,'yyyy')

scott(# from emp

scott(# where ename='ALLEN');

 empno | ename  |   job    | mgr  |      hiredate      |   sal   |  comm   | deptno

-------+--------+----------+------+--------------------+---------+---------+--------

  7499 | ALLEN  | SALESMAN | 7698 | 20-FEB-81 00:00:00 | 1600.00 |  300.00 |     30

  7521 | WARD   | SALESMAN | 7698 | 22-FEB-81 00:00:00 | 1250.00 |  500.00 |     30

  7654 | MARTIN | SALESMAN | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 |     30

  7844 | TURNER | SALESMAN | 7698 | 08-SEP-81 00:00:00 | 1500.00 |    0.00 |     30

(4 rows)

子查询返回多行单列数据

IN操作符

9查询出与每个部门中最低工资相同的全部雇员信息

Oracle

SQL> select *

  2  from emp

  3  where sal IN(

  4  select MIN(sal)

  5  from emp

  6  GROUP BY deptno);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7369 SMITH      CLERK         7902 17-DEC-80                   800                   20

      7900 JAMES      CLERK         7698 03-DEC-81                   950                   30

      7934 MILLER     CLERK          7782 23-JAN-82        1300                   10

PPAS

scott=# select *

scott-# from emp

scott-# where sal IN(

scott(# select MIN(sal)

scott(# from emp

scott(# GROUP BY deptno);

 empno | ename  |  job  | mgr  |      hiredate      |   sal   | comm | deptno

-------+--------+-------+------+--------------------+---------+------+--------

  7369 | SMITH  | CLERK | 7902 | 17-DEC-80 00:00:00 |  800.00 |      |     20

  7900 | JAMES  | CLERK | 7698 | 03-DEC-81 00:00:00 |  950.00 |      |     30

  7934 | MILLER | CLERK | 7782 | 23-JAN-82 00:00:00 | 1300.00 |      |     10

(3 rows)

10查询出不与每个部门中最低工资相同的全部雇员信息

Oracle

SQL> select *

  2  from emp

  3  where sal NOT IN(

  4  select MIN(sal)

  5  from emp

  6  GROUP BY deptno);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7902 FORD       ANALYST              7566 03-DEC-81                3000                   20

      7788 SCOTT      ANALYST              7566 19-APR-87        3000                   20

      7698 BLAKE      MANAGER           7839 01-MAY-81                2850                   30

      7782 CLARK      MANAGER           7839 09-JUN-81        2450                   10

      7839 KING       PRESIDENT     17-NOV-81              5000                   10

      7654 MARTIN     SALESMAN         7698 28-SEP-81        1250    1400            30

      7521 WARD       SALESMAN        7698 22-FEB-81        1250     500            30

      7499 ALLEN      SALESMAN           7698 20-FEB-81        1600     300            30

      7876 ADAMS      CLERK        7788 23-MAY-87                1100                   20

      7566 JONES      MANAGER           7839 02-APR-81        2975                   20

      7844 TURNER     SALESMAN         7698 08-SEP-81        1500       0            30

 

11 rows selected.

PPAS

scott=# select *

scott-# from emp

scott-# where sal NOT IN(

scott(# select MIN(sal)

scott(# from emp

scott(# GROUP BY deptno);

 empno | ename  |    job    | mgr  |      hiredate      |   sal   |  comm   | deptno

-------+--------+-----------+------+--------------------+---------+---------+--------

  7499 | ALLEN  | SALESMAN  | 7698 | 20-FEB-81 00:00:00 | 1600.00 |  300.00 |     30

  7521 | WARD   | SALESMAN  | 7698 | 22-FEB-81 00:00:00 | 1250.00 |  500.00 |     30

  7566 | JONES  | MANAGER   | 7839 | 02-APR-81 00:00:00 | 2975.00 |         |     20

  7654 | MARTIN | SALESMAN  | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 |     30

  7698 | BLAKE  | MANAGER   | 7839 | 01-MAY-81 00:00:00 | 2850.00 |         |     30

  7782 | CLARK  | MANAGER   | 7839 | 09-JUN-81 00:00:00 | 2450.00 |         |     10

  7788 | SCOTT  | ANALYST   | 7566 | 19-APR-87 00:00:00 | 3000.00 |         |     20

  7839 | KING   | PRESIDENT |      | 17-NOV-81 00:00:00 | 5000.00 |         |     10

  7844 | TURNER | SALESMAN  | 7698 | 08-SEP-81 00:00:00 | 1500.00 |    0.00 |     30

  7876 | ADAMS  | CLERK     | 7788 | 23-MAY-87 00:00:00 | 1100.00 |         |     20

  7902 | FORD   | ANALYST   | 7566 | 03-DEC-81 00:00:00 | 3000.00 |         |     20

(11 rows)

如果使用IN操作符在指定的查询范围中存在一个null,则将不会有任何的查询结果返回

11观察null对NOT NI操作的影响

Oracle

SQL> select e.ename

  2  from emp e

  3  where e.empno NOT IN(

  4  select m.mgr

  5  from emp m);

 

no rows selected

PPAS

scott=# select e.ename

scott-# from emp e

scott-# where e.empno NOT IN(

scott(# select m.mgr

scott(# from emp m);

 ename

-------

(0 rows)

ANY操作符

12列出每个部门经理的工资

Oracle

SQL>  select MIN(sal)

  2  from emp

  3  where job='MANAGER'

  4  GROUP BY deptno;

 

  MIN(SAL)

----------

      2850

      2975

      2450

PPAS

scott=# select MIN(sal)

scott-# from emp

scott-# where job='MANAGER'

scott-# GROUP BY deptno;

   min  

---------

 2975.00

 2850.00

 2450.00

(3 rows)

13使用=ANY操作符完成查询

Oracle

SQL> select * from emp

  2  where sal=ANY(

  3  select MIN(sal)

  4  from emp

  5  where job='MANAGER'

  6  GROUP BY deptno);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7566 JONES      MANAGER           7839 02-APR-81        2975                   20

      7698 BLAKE      MANAGER           7839 01-MAY-81                2850                   30

      7782 CLARK      MANAGER           7839 09-JUN-81        2450                   10

PPAS

scott=# select * from emp

scott-# where sal=ANY(

scott(# select MIN(sal)

scott(# from emp

scott(# where job='MANAGER'

scott(# GROUP BY deptno);

 empno | ename |   job   | mgr  |      hiredate      |   sal   | comm | deptno

-------+-------+---------+------+--------------------+---------+------+--------

  7566 | JONES | MANAGER | 7839 | 02-APR-81 00:00:00 | 2975.00 |      |     20

  7698 | BLAKE | MANAGER | 7839 | 01-MAY-81 00:00:00 | 2850.00 |      |     30

  7782 | CLARK | MANAGER | 7839 | 09-JUN-81 00:00:00 | 2450.00 |      |     10

(3 rows)

14使用>ANY操作符完成查询

Oracle

SQL> select * from emp

  2  where sal>ANY(

  3  select MIN(sal)

  4  from emp

  5  where job='MANAGER'

  6  GROUP BY deptno);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7839 KING       PRESIDENT     17-NOV-81              5000                   10

      7902 FORD       ANALYST              7566 03-DEC-81                3000                   20

      7788 SCOTT      ANALYST              7566 19-APR-87        3000                   20

      7566 JONES      MANAGER           7839 02-APR-81        2975                   20

      7698 BLAKE      MANAGER           7839 01-MAY-81                2850                   30

PPAS

scott=# select * from emp

scott-# where sal >ANY(

scott-# ^C

scott=# select * from emp

scott-# where sal>ANY(

scott(# select MIN(sal)

scott(# from emp

scott(# where job='MANAGER'

scott(# GROUP BY deptno);

 empno | ename |    job    | mgr  |      hiredate      |   sal   | comm | deptno

-------+-------+-----------+------+--------------------+---------+------+--------

  7566 | JONES | MANAGER   | 7839 | 02-APR-81 00:00:00 | 2975.00 |      |     20

  7698 | BLAKE | MANAGER   | 7839 | 01-MAY-81 00:00:00 | 2850.00 |      |     30

  7788 | SCOTT | ANALYST   | 7566 | 19-APR-87 00:00:00 | 3000.00 |      |     20

  7839 | KING  | PRESIDENT |      | 17-NOV-81 00:00:00 | 5000.00 |      |     10

  7902 | FORD  | ANALYST   | 7566 | 03-DEC-81 00:00:00 | 3000.00 |      |     20

(5 rows)

15使用<ANY操作符完成查询

Oracle

SQL> select * from emp

  2  where sal<ANY(

  3  select MIN(sal)

  4  from emp

  5  where job='MANAGER'

  6  GROUP BY deptno);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7369 SMITH      CLERK         7902 17-DEC-80                   800                   20

      7900 JAMES      CLERK         7698 03-DEC-81                   950                   30

      7876 ADAMS      CLERK        7788 23-MAY-87                1100                   20

      7521 WARD       SALESMAN        7698 22-FEB-81        1250     500            30

      7654 MARTIN     SALESMAN         7698 28-SEP-81        1250    1400            30

      7934 MILLER     CLERK          7782 23-JAN-82        1300                   10

      7844 TURNER     SALESMAN         7698 08-SEP-81        1500       0            30

      7499 ALLEN      SALESMAN           7698 20-FEB-81        1600     300            30

      7782 CLARK      MANAGER           7839 09-JUN-81        2450                   10

      7698 BLAKE      MANAGER           7839 01-MAY-81                2850                   30

 

10 rows selected.

PPAS

scott=# select * from emp

scott-# where sal<ANY(

scott(# select MIN(sal)

scott(# from emp

scott(# where job='MANAGER'

scott(# GROUP BY deptno);

 empno | ename  |   job    | mgr  |      hiredate      |   sal   |  comm   | deptno

-------+--------+----------+------+--------------------+---------+---------+--------

  7369 | SMITH  | CLERK    | 7902 | 17-DEC-80 00:00:00 |  800.00 |         |     20

  7499 | ALLEN  | SALESMAN | 7698 | 20-FEB-81 00:00:00 | 1600.00 |  300.00 |     30

  7521 | WARD   | SALESMAN | 7698 | 22-FEB-81 00:00:00 | 1250.00 |  500.00 |     30

  7654 | MARTIN | SALESMAN | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 |     30

  7698 | BLAKE  | MANAGER  | 7839 | 01-MAY-81 00:00:00 | 2850.00 |         |     30

  7782 | CLARK  | MANAGER  | 7839 | 09-JUN-81 00:00:00 | 2450.00 |         |     10

  7844 | TURNER | SALESMAN | 7698 | 08-SEP-81 00:00:00 | 1500.00 |    0.00 |     30

  7876 | ADAMS  | CLERK    | 7788 | 23-MAY-87 00:00:00 | 1100.00 |         |     20

  7900 | JAMES  | CLERK    | 7698 | 03-DEC-81 00:00:00 |  950.00 |         |     30

  7934 | MILLER | CLERK    | 7782 | 23-JAN-82 00:00:00 | 1300.00 |         |     10

(10 rows)

ALL操作符

16使用<>ALL操作符完成查询

Oracle

SQL> select * from emp

  2  where sal<>ALL(

  3  select MIN(sal)

  4  from emp

  5  where job='MANAGER'

  6  GROUP BY deptno);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7369 SMITH      CLERK         7902 17-DEC-80                   800                   20

      7902 FORD       ANALYST              7566 03-DEC-81                3000                   20

      7788 SCOTT      ANALYST              7566 19-APR-87        3000                   20

      7839 KING       PRESIDENT     17-NOV-81              5000                   10

      7654 MARTIN     SALESMAN         7698 28-SEP-81        1250    1400            30

      7521 WARD       SALESMAN        7698 22-FEB-81        1250     500            30

      7499 ALLEN      SALESMAN           7698 20-FEB-81        1600     300            30

      7876 ADAMS      CLERK        7788 23-MAY-87                1100                   20

      7900 JAMES      CLERK         7698 03-DEC-81                   950                   30

      7934 MILLER     CLERK          7782 23-JAN-82       1300                   10

      7844 TURNER     SALESMAN         7698 08-SEP-81        1500       0            30

 

11 rows selected.

PPAS

scott=# select * from emp

scott-# where sal<>ALL(

scott(# select MIN(sal)

scott(# from emp

scott(# where job='MANAGER'

scott(# GROUP BY deptno);

 empno | ename  |    job    | mgr  |      hiredate      |   sal   |  comm   | deptno

-------+--------+-----------+------+--------------------+---------+---------+--------

  7369 | SMITH  | CLERK     | 7902 | 17-DEC-80 00:00:00 |  800.00 |         |     20

  7499 | ALLEN  | SALESMAN  | 7698 | 20-FEB-81 00:00:00 | 1600.00 |  300.00 |     30

  7521 | WARD   | SALESMAN  | 7698 | 22-FEB-81 00:00:00 | 1250.00 |  500.00 |     30

  7654 | MARTIN | SALESMAN  | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 |     30

  7788 | SCOTT  | ANALYST   | 7566 | 19-APR-87 00:00:00 | 3000.00 |         |     20

  7839 | KING   | PRESIDENT |      | 17-NOV-81 00:00:00 | 5000.00 |         |     10

  7844 | TURNER | SALESMAN  | 7698 | 08-SEP-81 00:00:00 | 1500.00 |    0.00 |     30

  7876 | ADAMS  | CLERK     | 7788 | 23-MAY-87 00:00:00 | 1100.00 |         |     20

  7900 | JAMES  | CLERK     | 7698 | 03-DEC-81 00:00:00 |  950.00 |         |     30

  7902 | FORD   | ANALYST   | 7566 | 03-DEC-81 00:00:00 | 3000.00 |         |     20

  7934 | MILLER | CLERK     | 7782 | 23-JAN-82 00:00:00 | 1300.00 |         |     10

(11 rows)

17使用>ALL操作符完成查询

Oracle

SQL> select * from emp

  2  where sal>ALL(

  3  select MIN(sal)

  4  from emp

  5  where job='MANAGER'

  6  GROUP BY deptno);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7788 SCOTT      ANALYST              7566 19-APR-87        3000                   20

      7902 FORD       ANALYST              7566 03-DEC-81                3000                   20

      7839 KING       PRESIDENT     17-NOV-81              5000                   10

PPAS

scott=# select * from emp

scott-# where sal>ALL(

scott(# select MIN(sal)

scott(# from emp

scott(# where job='MANAGER'

scott(# GROUP BY deptno);

 empno | ename |    job    | mgr  |      hiredate      |   sal   | comm | deptno

-------+-------+-----------+------+--------------------+---------+------+--------

  7788 | SCOTT | ANALYST   | 7566 | 19-APR-87 00:00:00 | 3000.00 |      |     20

  7839 | KING  | PRESIDENT |      | 17-NOV-81 00:00:00 | 5000.00 |      |     10

  7902 | FORD  | ANALYST   | 7566 | 03-DEC-81 00:00:00 | 3000.00 |      |     20

(3 rows)

18使用<ALL操作符完成查询

Oracle

SQL> select * from emp

  2  where sal<ALL(

  3  select MIN(sal)

  4  from emp

  5  where job='MANAGER'

  6  GROUP BY deptno);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7499 ALLEN      SALESMAN           7698 20-FEB-81        1600     300            30

      7844 TURNER     SALESMAN         7698 08-SEP-81        1500       0            30

      7934 MILLER     CLERK          7782 23-JAN-82        1300                   10

      7521 WARD       SALESMAN        7698 22-FEB-81        1250     500            30

      7654 MARTIN     SALESMAN         7698 28-SEP-81        1250    1400            30

      7876 ADAMS      CLERK        7788 23-MAY-87                1100                   20

      7900 JAMES      CLERK         7698 03-DEC-81                   950                   30

      7369 SMITH      CLERK         7902 17-DEC-80                   800                   20

 

8 rows selected.

PPAS

scott=# select * from emp

scott-# where sal<ALL(

scott(# select MIN(sal)

scott(# from emp

scott(# where job='MANAGER'

scott(# GROUP BY deptno);

 empno | ename  |   job    | mgr  |      hiredate      |   sal   |  comm   | deptno

-------+--------+----------+------+--------------------+---------+---------+--------

  7369 | SMITH  | CLERK    | 7902 | 17-DEC-80 00:00:00 |  800.00 |         |     20

  7499 | ALLEN  | SALESMAN | 7698 | 20-FEB-81 00:00:00 | 1600.00 |  300.00 |     30

  7521 | WARD   | SALESMAN | 7698 | 22-FEB-81 00:00:00 | 1250.00 |  500.00 |     30

  7654 | MARTIN | SALESMAN | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 |     30

  7844 | TURNER | SALESMAN | 7698 | 08-SEP-81 00:00:00 | 1500.00 |    0.00 |     30

  7876 | ADAMS  | CLERK    | 7788 | 23-MAY-87 00:00:00 | 1100.00 |         |     20

  7900 | JAMES  | CLERK    | 7698 | 03-DEC-81 00:00:00 |  950.00 |         |     30

  7934 | MILLER | CLERK    | 7782 | 23-JAN-82 00:00:00 | 1300.00 |         |     10

(8 rows)

空数据判断

19验证EXISTS结构

Oracle

SQL> select * from emp

  2  where exists(

  3  select * from emp where empno=9999);

 

no rows selected

PPAS

scott=# select * from emp

scott-# where exists(

scott(# select * from emp where empno=9999);

 empno | ename | job | mgr | hiredate | sal | comm | deptno

-------+-------+-----+-----+----------+-----+------+--------

(0 rows)

20验证EXISTS结构

Oracle

SQL> select * from  emp

  2  where exists(

  3  select * from emp);

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7369 SMITH      CLERK         7902 17-DEC-80                   800                   20

      7499 ALLEN      SALESMAN           7698 20-FEB-81        1600     300            30

      7521 WARD       SALESMAN        7698 22-FEB-81        1250     500            30

      7566 JONES      MANAGER           7839 02-APR-81        2975                   20

      7654 MARTIN     SALESMAN         7698 28-SEP-81        1250    1400            30

      7698 BLAKE      MANAGER           7839 01-MAY-81                2850                   30

      7782 CLARK      MANAGER           7839 09-JUN-81        2450                   10

      7788 SCOTT      ANALYST              7566 19-APR-87        3000                   20

      7839 KING       PRESIDENT     17-NOV-81              5000                   10

      7844 TURNER     SALESMAN         7698 08-SEP-81        1500       0            30

      7876 ADAMS      CLERK        7788 23-MAY-87                1100                   20

      7900 JAMES      CLERK         7698 03-DEC-81                   950                   30

      7902 FORD       ANALYST              7566 03-DEC-81                3000                   20

      7934 MILLER     CLERK          7782 23-JAN-82        1300                   10

 

14 rows selected.

PPAS

scott=# select * from  emp

scott-# where exists(

scott(# select * from emp);

 empno | ename  |    job    | mgr  |      hiredate      |   sal   |  comm   | deptno

-------+--------+-----------+------+--------------------+---------+---------+--------

  7369 | SMITH  | CLERK     | 7902 | 17-DEC-80 00:00:00 |  800.00 |         |     20

  7499 | ALLEN  | SALESMAN  | 7698 | 20-FEB-81 00:00:00 | 1600.00 |  300.00 |     30

  7521 | WARD   | SALESMAN  | 7698 | 22-FEB-81 00:00:00 | 1250.00 |  500.00 |     30

  7566 | JONES  | MANAGER   | 7839 | 02-APR-81 00:00:00 | 2975.00 |         |     20

  7654 | MARTIN | SALESMAN  | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 |     30

  7698 | BLAKE  | MANAGER   | 7839 | 01-MAY-81 00:00:00 | 2850.00 |         |     30

  7782 | CLARK  | MANAGER   | 7839 | 09-JUN-81 00:00:00 | 2450.00 |         |     10

  7788 | SCOTT  | ANALYST   | 7566 | 19-APR-87 00:00:00 | 3000.00 |         |     20

  7839 | KING   | PRESIDENT |      | 17-NOV-81 00:00:00 | 5000.00 |         |     10

  7844 | TURNER | SALESMAN  | 7698 | 08-SEP-81 00:00:00 | 1500.00 |    0.00 |     30

  7876 | ADAMS  | CLERK     | 7788 | 23-MAY-87 00:00:00 | 1100.00 |         |     20

  7900 | JAMES  | CLERK     | 7698 | 03-DEC-81 00:00:00 |  950.00 |         |     30

  7902 | FORD   | ANALYST   | 7566 | 03-DEC-81 00:00:00 | 3000.00 |         |     20

  7934 | MILLER | CLERK     | 7782 | 23-JAN-82 00:00:00 | 1300.00 |         |     10

(14 rows)

21使用NO EXISTS

Oracle

SQL> select * from emp

  2  where NOT EXISTS(

  3  (select * from emp where empno=9999));

 

     EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO

---------- ---------- ---------- ---------- ------------ ---------- ---------- ----------

      7369 SMITH      CLERK         7902 17-DEC-80                   800                   20

      7499 ALLEN      SALESMAN           7698 20-FEB-81        1600     300            30

      7521 WARD       SALESMAN        7698 22-FEB-81        1250     500            30

      7566 JONES      MANAGER           7839 02-APR-81        2975                   20

      7654 MARTIN     SALESMAN         7698 28-SEP-81        1250    1400            30

      7698 BLAKE      MANAGER           7839 01-MAY-81                2850                   30

      7782 CLARK      MANAGER           7839 09-JUN-81        2450                   10

      7788 SCOTT      ANALYST              7566 19-APR-87        3000                   20

      7839 KING       PRESIDENT     17-NOV-81              5000                   10

      7844 TURNER     SALESMAN         7698 08-SEP-81        1500       0            30

      7876 ADAMS      CLERK        7788 23-MAY-87                1100                   20

      7900 JAMES      CLERK         7698 03-DEC-81                   950                   30

      7902 FORD       ANALYST              7566 03-DEC-81                3000                   20

      7934 MILLER     CLERK          7782 23-JAN-82        1300                   10

 

14 rows selected.

PPAS

scott=# select * from emp

scott-# where NOT EXISTS(

scott(# (select * from emp where empno=9999));

 empno | ename  |    job    | mgr  |      hiredate      |   sal   |  comm   | deptno

-------+--------+-----------+------+--------------------+---------+---------+--------

  7369 | SMITH  | CLERK     | 7902 | 17-DEC-80 00:00:00 |  800.00 |         |     20

  7499 | ALLEN  | SALESMAN  | 7698 | 20-FEB-81 00:00:00 | 1600.00 |  300.00 |     30

  7521 | WARD   | SALESMAN  | 7698 | 22-FEB-81 00:00:00 | 1250.00 |  500.00 |     30

  7566 | JONES  | MANAGER   | 7839 | 02-APR-81 00:00:00 | 2975.00 |         |     20

  7654 | MARTIN | SALESMAN  | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 |     30

  7698 | BLAKE  | MANAGER   | 7839 | 01-MAY-81 00:00:00 | 2850.00 |         |     30

  7782 | CLARK  | MANAGER   | 7839 | 09-JUN-81 00:00:00 | 2450.00 |         |     10

  7788 | SCOTT  | ANALYST   | 7566 | 19-APR-87 00:00:00 | 3000.00 |         |     20

  7839 | KING   | PRESIDENT |      | 17-NOV-81 00:00:00 | 5000.00 |         |     10

  7844 | TURNER | SALESMAN  | 7698 | 08-SEP-81 00:00:00 | 1500.00 |    0.00 |     30

  7876 | ADAMS  | CLERK     | 7788 | 23-MAY-87 00:00:00 | 1100.00 |         |     20

  7900 | JAMES  | CLERK     | 7698 | 03-DEC-81 00:00:00 |  950.00 |         |     30

  7902 | FORD   | ANALYST   | 7566 | 03-DEC-81 00:00:00 | 3000.00 |         |     20

  7934 | MILLER | CLERK     | 7782 | 23-JAN-82 00:00:00 | 1300.00 |         |     10

(14 rows)

在HAVING子句中使用子查询

22查询部门编号、雇员人数、平均工资,并且要求这些部门的平均工资高于公司平均薪金

Oracle

SQL> select deptno,COUNT(empno),AVG(sal)

  2  from emp

  3  GROUP BY deptno

  4  HAVING AVG(sal)>(

  5  select AVG(sal)

  6  from emp);

 

    DEPTNO COUNT(EMPNO)   AVG(SAL)

---------- ------------ ----------

         20           5       2175

         10           3 2916.66667

PPAS

scott=# select deptno,COUNT(empno),AVG(sal)

scott-# from emp

scott-# GROUP BY deptno

scott-# HAVING AVG(sal)>(

scott(# select AVG(sal)

scott(# from emp);

 deptno | count |          avg         

--------+-------+-----------------------

     20 |     5 | 2175.0000000000000000

     10 |     3 | 2916.6666666666666667

(2 rows)

23查询出每个部门平均工资最高的部门名称及平均工资

Oracle

SQL> select d.dname,ROUND(AVG(e.sal),2)

  2  from emp e,dept d

  3  where e.deptno=d.deptno

  4  GROUP BY d.dname

  5  HAVING AVG(sal)=(

  6  select MAX(AVG(sal))

  7  from emp

  8  GROUP BY deptno);

 

DNAME             ROUND(AVG(E.SAL),2)

--------------- -------------------

ACCOUNTING               2916.67

PPAS

scott=# select d.dname,ROUND(AVG(e.sal),2)

scott-# from emp e,dept d

scott-# where e.deptno=d.deptno

scott-# GROUP BY d.dname

scott-# HAVING AVG(sal)=(

scott(# select MAX(AVG(sal))

scott(# from emp

scott(# GROUP BY deptno);

ERROR:  aggregate function calls cannot be nested

LINE 6: select MAX(AVG(sal))

在FROM子句中使用子查询

24查询出每个部门的编号、名称、位置、部门人数、平均工资

Oracle

SQL> select d.deptno,d.dname,d.loc,temp.count,temp.avg

  2  from dept d,(select deptno dno,COUNT(empno) count,

  3  ROUND(AVG(sal),2) avg

  4  from emp

  5  GROUP BY deptno) temp

  6  where d.deptno=temp.dno(+);

 

    DEPTNO DNAME        LOC                COUNT       AVG

---------- --------------- ---------- ---------- ----------

         10 ACCOUNTING        NEW YORK        3    2916.67

         20 RESEARCH     DALLAS              5       2175

         30 SALES     CHICAGO          6    1566.67

         40 OPERATIONS          BOSTON

PPAS

scott=# select d.deptno,d.dname,d.loc,temp.count,temp.avg

scott-# from dept d,(select deptno dno,COUNT(empno) count,

scott(# ROUND(AVG(sal),2) avg

scott(# from emp

scott(# GROUP BY deptno) temp

scott-# where d.deptno=temp.dno(+);

 deptno |   dname    |   loc    | count |   avg  

--------+------------+----------+-------+---------

     20 | RESEARCH   | DALLAS   |     5 | 2175.00

     30 | SALES      | CHICAGO  |     6 | 1566.67

     10 | ACCOUNTING | NEW YORK |     3 | 2916.67

     40 | OPERATIONS | BOSTON   |       |       

(4 rows)

25利用多字段分组

Oracle

SQL> select d.deptno,d.dname,d.loc,COUNT(e.empno) count,

  2  ROUND(AVG(sal),2) avg

  3  from emp e,dept d

  4  where e.deptno(+)=d.deptno

  5  GROUP BY d.deptno,d.dname,d.loc;

 

    DEPTNO DNAME        LOC                COUNT       AVG

---------- --------------- ---------- ---------- ----------

         20 RESEARCH     DALLAS              5       2175

         40 OPERATIONS          BOSTON            0

         10 ACCOUNTING        NEW YORK        3    2916.67

         30 SALES     CHICAGO          6    1566.67

PPAS
scott=# select d.deptno,d.dname,d.loc,COUNT(e.empno) count,

scott-# ROUND(AVG(sal),2) avg

scott-# from emp e,dept d

scott-# where e.deptno(+)=d.deptno

scott-# GROUP BY d.deptno,d.dname,d.loc;

 deptno |   dname    |   loc    | count |   avg  

--------+------------+----------+-------+---------

     10 | ACCOUNTING | NEW YORK |     3 | 2916.67

     30 | SALES      | CHICAGO  |     6 | 1566.67

     40 | OPERATIONS | BOSTON   |     0 |       

     20 | RESEARCH   | DALLAS   |     5 | 2175.00

(4 rows)

原文地址:https://www.cnblogs.com/songyuejie/p/5617395.html