Oracle修炼路程--子查询

子查询可以出现的位置:
where\select\having\from的后面;
不能出现在group by 后面;

1)select后面:必须是单行值;

SQL> select empno,ename,(select mgr from emp) from emp;
select empno,ename,(select mgr from emp) from emp
                    *1 行出现错误:
ORA-01427: 单行子查询返回多个行


SQL> select empno,ename,(select mgr from emp where empno=7698) from emp;

     EMPNO ENAME      (SELECTMGRFROMEMPWHEREEMPNO=7698)
---------- ---------- ---------------------------------
      5741 QIN_JIALI                               7839
      7369 SMITH                                   7839
      7499 ALLEN                                   7839
      7521 WARD                                    7839
      7566 JONES                                   7839
      7654 MARTIN                                  7839
      7698 BLAKE                                   7839
      7782 CLARK                                   7839
      7788 SCOTT                                   7839
      7839 KING                                    7839
      7844 TURNER                                  7839
      7876 ADAMS                                   7839
      7900 JAMES                                   7839
      7902 FORD                                    7839
      7934 MILLER                                  7839

已选择15行。

--查询比SCOTT工资高的员工信息;
SQL> select *from emp where sal>(select sal from emp where ename='SCOTT');

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7566 JONES      MANAGER         7839 02-4-81           4575                    20
      7698 BLAKE      MANAGER         7839 01-5-81           4450                    30
      7782 CLARK      MANAGER         7839 09-6-81           4050                    10
      7839 KING       PRESIDENT            17-11-81           7000                    10

2)having后面;举例:查询最低工资比40号部门的最低工资高的部门编号;

SQL> select deptno,min(sal) from emp group by deptno having min(sal)>(select min(sal) from emp where deptno=40);

    DEPTNO   MIN(SAL)
---------- ----------
        10       1700
  1. from后面:相当于修改了表结构;
SQL> select *from (select empno,ename from emp);

     EMPNO ENAME
---------- ----------
      5741 QIN_JIALI
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS
      7900 JAMES
      7902 FORD
      7934 MILLER

已选择15行。

SQL> SELECT *FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES');

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 20-2-81           2000        300         30
      7521 WARD       SALESMAN        7698 22-2-81           1650        500         30
      7698 BLAKE      MANAGER         7839 01-5-81           4450                    30
      7844 TURNER     SALESMAN        7698 08-9-81           1900                    30
      7900 JAMES      CLERK           7698 03-12-81           1350                    30

4)any和all的用法

--查询工资比30号部门中任意其中一名员工的工资高的员工信息;
SQL>  select *from emp where sal>any(select sal from emp where deptno=30);

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7839 KING       PRESIDENT            17-11-81           7000                    10
      7566 JONES      MANAGER         7839 02-4-81           4575                    20
      7698 BLAKE      MANAGER         7839 01-5-81           4450                    30
      7782 CLARK      MANAGER         7839 09-6-81           4050                    10
      7902 FORD       ANALYST         7566 03-12-81           3400                    20
      7788 SCOTT      ANALYST         7566 19-4-87           3400                    20
      7499 ALLEN      SALESMAN        7698 20-2-81           2000        300         30
      7844 TURNER     SALESMAN        7698 08-9-81           1900                    30
      5741 QIN_JIALI  CLERK           7654 20-3-85           1900        600         20
      7934 MILLER     CLERK           7782 23-1-82           1700                    10
      7654 MARTIN     SALESMAN        7698 28-9-81           1650       1400         40
      7521 WARD       SALESMAN        7698 22-2-81           1650        500         30
      7876 ADAMS      CLERK           7788 23-5-87           1500                    20

已选择13行。

SQL> select *from emp where sal>(select min(sal) from emp where deptno=30);

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      5741 QIN_JIALI  CLERK           7654 20-3-85           1900        600         20
      7499 ALLEN      SALESMAN        7698 20-2-81           2000        300         30
      7521 WARD       SALESMAN        7698 22-2-81           1650        500         30
      7566 JONES      MANAGER         7839 02-4-81           4575                    20
      7654 MARTIN     SALESMAN        7698 28-9-81           1650       1400         40
      7698 BLAKE      MANAGER         7839 01-5-81           4450                    30
      7782 CLARK      MANAGER         7839 09-6-81           4050                    10
      7788 SCOTT      ANALYST         7566 19-4-87           3400                    20
      7839 KING       PRESIDENT            17-11-81           7000                    10
      7844 TURNER     SALESMAN        7698 08-9-81           1900                    30
      7876 ADAMS      CLERK           7788 23-5-87           1500                    20
      7902 FORD       ANALYST         7566 03-12-81           3400                    20
      7934 MILLER     CLERK           7782 23-1-82           1700                    10

已选择13行。


--查询工资比30号部门中全部员工的工资高的员工信息;
SQL> select *from emp where sal>(select max(sal) from emp where deptno=30);

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7566 JONES      MANAGER         7839 02-4-81           4575                    20
      7839 KING       PRESIDENT            17-11-81           7000                    10

SQL> select *from emp where sal>all(select sal  from emp where deptno=30);

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7566 JONES      MANAGER         7839 02-4-81           4575                    20
      7839 KING       PRESIDENT            17-11-81           7000                    10

一般不在子查询中排序,如果排序用于分页查询;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值