zoukankan      html  css  js  c++  java
  • Oracle 子查询(复杂select语句)

      在执行数据操作时,如果某个操作需要依赖于另外一个 select语句的查询结果,那么就可以把 select 语句迁入到该操作语句中,这样就形成了一个子查询。实际应用中,表与表之间相互关联,相互依存,这样就可以根据数据之间的关系使用相应的子查询,从而实现复杂的查询。

    一、子查询

      子查询是在 SQL 语句内的另外一条 select 语句,也被称为内查询或是 内select语句。在select、insert、update 或delete 命令中允许是一个表达式的地方都可以包含子查询,子查询也可以包含在另外一个子查询里面中。

      EG:

    SQL > select empno,ename,job from emp
          where deptno = (select deptno from dept where dname="research");
    

       表示在emp表中查询部门名称为(dname)为“research” 的员工信息。

      分析:原来在 emp 表中不存在 dname 字段,但 emp 表中存在 depno字段(部门代码);dname 字段原本存在 dept 表中,并且 deptno 字段也存在 dept表中,所有 deptno 为两个表之间的关联字段,这样就可以通过多表关联查询来实现。等同于下面的多表查询:

    SQL > select empno,ename,job from emp join dept on emp.deptno = dept.deptno
       where dept.dname = 'research';

      从上可以看出,相比于多表关联查询,子查询更加灵活、功能更强大,而且更容易理解。但是多表关联查询的效率要高于子查询。

      在执行子查询操作的语句中,子查询也称为内查询,包含子查询的查询语句也被称为外查询或主查询。

      在执行查询时,外查询语句检索一行,子查询语句需要检索一遍数据,然后判断外查询语句的条件是否满足。如果满足,则外查询语句将检索到数据行添加到结果集中,如果条件不满足,则外查询语句继续检索下一行数据,所有子查询相对多表关联查询要慢。

      注意:

    •   子查询语句必须用括号 "()" 括起来。
    •        子查询中不能包括 order by  子句。
    •        子查询运行嵌套多层,但不能超过255层。

    二、单行子查询

      单行子查询是指返回一行数据的子查询语句。当在 where 子句中引用单行子查询时,可以使用当行比较运算符(=、>、<、>=、<=和<>)。

      EG:

    SQL >  select empno,ename,sal from emp 
           where sal > (select min(sal) from emp) and sal < (select max(sal) from emp);

      注意:

    •   内层子查询的执行结果如果为空值,那么外层的 where 子句就始终不会满足条件,这样的查询结果就必然为空值
    •        执行单行子查询时,要注意子查询的返回结果必须是一行数据,否则 Oracle 系统会提示无法执行。
    •        子查询中不能包含 order by 子句,如果非要进行排序的话,那么只能在外查询语句中使用 order by 子句。

    三、多行子查询

      多行子查询是指返回多行数据的子查询语句。当在 where 子句中使用多行子查询时,必须使用多行运算符(in、any、all)。

      1、使用 in 运算符

      当在多行子查询中使用 in 运算符时,外查询会尝试与子查询结果中的任何一个结果进行匹配,只要有一个匹配成功,则外查询返回当前检索的记录。

       EG:

    SQL > select empno,ename,job
          from emp where deptno in
         (select deptno from dept where dname<>'sales');

      2、使用 any 运算符

      any 运算符必须与单行比较运算符结合使用,并且返回行只要匹配子查询的任何一个结果即可。

        EG:

    SQL > select deptno,ename,sal from emp where sal > any
         (select sal from emp where deptno = 10) and deptno <> 10;

        表示从emp表中,查询工资大于部门编号为10的任意一个员工工资即可的其他部门的员工信息。

      3、使用 all 运算符

      all 运算符必须与单行运算符结合使用,并且返回行必须匹配所有子查询结果。

      EG:

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

         表示从emp表中,查询工资大于部门编号为 30 的所有员工工资的员工信息。

    四、关联子查询

      在单行子查询和多行子查询中,内查询和外查询是分开执行的,也就是说内查询的执行与外查询的执行时没有关系的,外查询仅仅是使用内查询的最终结果。在一些特殊需求的子查询中,内查询的执行需要借助于外查询,而外查询的执行又离不开内查询的执行,这时,内查询和外查询是相互关联的,这种子查询就被称为关联子查询。

      EG:

    SQL > select empno,ename,sal from emp f
          where sal > (select avg(sal) from emp where job = f.job)
          order by job;

      表示在emp表中,使用“关联子查询”检索工资大于同职位的平均工资的员工信息。

      注意

    •   在执行关联子查询的过程中,必须遍历数据表中的每条记录,因此如果被遍历的数据表中有大量的数据记录,则关联子查询的执行速度会比较慢。
    •        关联字查询不仅仅可以作为 select 语句的子查询,也可以作为 insert 、 update或 delete 语句的关联子查询。
  • 相关阅读:
    pythoon 学习资源
    cookie -- 添加删除
    前端技能
    jsonp 跨域2
    jsonp 跨域1
    webpy.org
    Flask 学习资源
    pip install flask 安装失败
    弹窗组价
    js中的deom ready执行的问题
  • 原文地址:https://www.cnblogs.com/niujifei/p/10948054.html
Copyright © 2011-2022 走看看