ITPub博客

首页 > 数据库 > Oracle > 使用子查询检索数据

使用子查询检索数据

原创 Oracle 作者:brj880719 时间:2017-10-12 11:23:16 0 删除 编辑

一、相关子查询

相关子查询对于外部查询的每一个值都会有一个结果与其对应,其计算的过程是这样的:
1、扫描外查询的第一条记录
2、扫描子查询,并将第一条记录的对应值传给子查询,由此计算出子查询的结果
3、根据子查询的结果,返回外查询的结果。
4、重复上述动作,开始扫描外查询的第二条记录,第三条记录,直至全部扫描完毕
例句:
  1. --查询本部门最高工资的员工?
  2. --方法一,使用嵌套子查询(非关联子查询)
  3. select * from emp a where (a.deptno,a.sal) in (select deptno,max(sal) from emp group by deptno);

  4. --方法二,使用关联子查询
  5. select * from emp a where a.sal=(select max(sal) from emp where deptno=a.deptno);

二、EXISTS

exists是判断 exits 后面的 sql 语句是否为真,若为真则整个sql句子成立,否则没有任何记录。
例句:
  1. SELECT 1 FROM DUAL WHERE EXISTS (SELECT 1 FROM DUAL WHERE 2 = 1);

三、WITH

语法:
  1. SELECT *
  2.   FROM (--模拟生一个20行的数据
  3.         SELECT LEVEL AS lv
  4.           FROM DUAL
  5.        CONNECT BY LEVEL < 20) tt
  6.  WHERE tt.lv > 10 AND tt.lv < 15

  7. WITH TT AS(--模拟生一个20行的数据
  8.            SELECT LEVEL AS lv
  9.              FROM DUAL
  10.           CONNECT BY LEVEL < 20)
  11. SELECT lv
  12.   FROM TT
  13.  WHERE lv > 10 AND lv < 15
  14. WITH tempName AS (SELECT ....)
  15. SELECT ...
说明:
  可认为在真正进行查询之前预先构造了一个临时表TT,之后便可多次使用它做进一步的分析和处理
优点:
  增加了SQL的易读性,如果构造了多个子查询,结构会更清晰;更重要的是:“一次分析,多次使用”,这也是为什么会提供性能的地方,达到了“少读”的目标。
例句:
  1. --普通查询
  2. SELECT *
  3.   FROM (--模拟生一个20行的数据
  4.         SELECT LEVEL AS lv
  5.           FROM DUAL
  6.        CONNECT BY LEVEL < 20) tt
  7.  WHERE tt.lv > 10 AND tt.lv < 15;

  8. --with语句
  9. WITH TT AS(--模拟生一个20行的数据
  10.            SELECT LEVEL AS lv
  11.              FROM DUAL
  12.           CONNECT BY LEVEL < 20)
  13. SELECT lv
  14.   FROM TT
  15.  WHERE lv > 10 AND lv < 15;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24851054/viewspace-2145880/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 分层检索
请登录后发表评论 登录
全部评论

注册时间:2014-12-06

  • 博文量
    75
  • 访问量
    67556