Oracle学习之子查询

一、子查询

          在一个SQL语句中嵌套另一个SQL语句成为子查询。

          当一个问题无法通过一部解决时可考虑使用子查询,一个出现在SELECT

       语句的FROM子句中的子查询被称为"内嵌视图";一个出现在SELECT语

       句的WHERE子句中的子查询被称为"内嵌子查询",一个子查询能够包含

           另一个子查询,在一个顶级的查询中,Oracle数据库没有限制在FROM

           子句中的嵌套层数,可以在一个WHERE子句中嵌套255层子查询

            子查询可包括:

1、单行子查询(子查询只返回一行)

                    单行子查询可使用如下操作符:

                    >        大于

    <        小于

       =        等于

    >=     大于等于

    <=     小于等于

    <>     不等于

2、多行子查询(子查询返回多行)

                    多行子查询可使用如下操作符:

                    IN        等于列表中的任何一个

                    ANY     和子句中返回的任意一个值比较

                    ALL      和子句中返回的所有值比较

     出现在WHERE子句中的子查询语法

SELECT  select_list
FROM  table
WHERE expr operator
                  (SELECT select_list
                   FROM  table);

       

查询scott用户下的emp表中工资比scott高的员工的信息(此操作中

        的子查询只返回一行记录)

SQL> select * from emp
  2  where sal>(
  3            select sal from emp where ename='SCOTT');

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7839 KING       PRESIDENT            17-11月-81           5000                    10
 

查询scott用户下的emp表中所有的经理的信息(此操作子查询会返回

多行记录)

SQL> select * from emp
  2  where empno in (
  3                 select mgr from emp);

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
      7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
      7839 KING       PRESIDENT            17-11月-81           5000                    10
      7902 FORD       ANALYST         7566 03-12月-81           3000                    20

已选择6行。

      出现在FROM子句中的子查询语法

SELECT select_list
FROM  (SELECT select_list
       FROM table)
WHERE expr;
 

    将scott用户下的emp表中查询出的数据作为一个内嵌视图在FROM子句中

    使用

SQL> select *
  2  from (select empno,ename,job,sal from emp);

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7369 SMITH      CLERK            880
      7499 ALLEN      SALESMAN        1600
      7521 WARD       SALESMAN        1250
      7566 JONES      MANAGER         2975
      7654 MARTIN     SALESMAN        1250
      7698 BLAKE      MANAGER         2850
      7782 CLARK      MANAGER         2450
      7788 SCOTT      ANALYST         3000
      7839 KING       PRESIDENT       5000
      7844 TURNER     SALESMAN        1500
      7876 ADAMS      CLERK           1100
      7900 JAMES      CLERK            950
      7902 FORD       ANALYST         3000
      7934 MILLER     CLERK           1300

已选择14行。
 

      子查询也可出现在SELECT列表中,但此时子查询只能是一个单行子查询

select (select job from emp where empno=7369)
from emp;

      子查询也可出现在HAVING子句中

SQL> select empno,ename, sal,deptno
  2  from emp
  3  group by deptno,empno,ename,sal
  4  having deptno in (
  5                   select deptno from emp
  6                   where deptno=10 or deptno=20)
  7  order by deptno,sal;

     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      7934 MILLER           1300         10
      7782 CLARK            2450         10
      7839 KING             5000         10
      7369 SMITH             880         20
      7876 ADAMS            1100         20
      7566 JONES            2975         20
      7902 FORD             3000         20
      7788 SCOTT            3000         20

已选择8行。

      如果子查询返回了一个空值,则主查询将不会查到任何结果

SQL> select * from emp
  2  where empno=(
  3               select empno from emp
  4               where deptno=40);

未选定行
 

    子查询注意的问题:

1>、要将子查询发在圆括号内

2>、子查询可出现在WHERE子句、FROM子句、SELECT列表(此处

                   只能是一个单行子查询)、HAVING子句中

3>、子查询不能出现在主查询的GROUP BY语句中

4>、子查询和主查询使用表可以不同,是要子查询返回的结果能够被

                            主查询使用即可

5>、一般不会在子查询中使用ORDER BY语句,但在TOP-N分析中

                             必须使用ORDER BY语句

6>、当行子查询只能使用单行操作符,多行子查询只能使用多行操作

                   符

7>、采用合理的缩进和换行来提过SQL语句的可读性

8>、子查询中的空值问题

猜你喜欢

转载自dong-dong.iteye.com/blog/1463629