zoukankan      html  css  js  c++  java
  • Oracle常用sql语句(三)之子查询

    子查询

    子查询要解决的问题,不能一步求解

    分为:

    • 单行子查询
    • 多行子查询

    语法:

    	SELECT select_list
    	FROM table
    	WHERE expr operator (SELECT select_list
    						 FROM   table);
    
    • 子查询(内查询)在住查询之前一次执行完成
    • 子查询的记过被主查询使用(外查询)

    注意:
    1.括号
    2.合理的书写风格
    3.可以在住查询的 WHERE SELECT HAVING FROM 后面使用子查询
    4.不可以在GROUP BY 后面使用
    5.强调FROM后面的子查询
    6.主查询和子查询可以不是同一张表;只用子查询返回的结果,主查询可以使用即可
    7.一般不在子查询中排序;但在top-n分析问题中
    8.一般先执行子查询,在执行主查询;但相关子查询例外
    9.单行子查询只能使用单行操作符;多行子查询只能使用多行子查询
    10.子查询中的null:单行的子查询,多行子查询

    解释:
    --5、强调from后面的子查询
    查询员工信息:员工号 姓名 月薪

    SELECT
    	* 
    FROM
    	( SELECT empno, ename, sal FROM emp );
    

    查询员工信息:员工号 姓名 月薪 年薪

    SELECT
    	* 
    FROM
    	(
    SELECT
    	empno,
    	ename,
    	sal,
    	sal * 12 annsal 
    FROM
    	emp)
    

    --6、主查询和子查询可以不是同一张表;只有子查询返回的结果 主查询可以使用 即可
    查询部门名称是SALES的员工

    SELECT
    	* 
    FROM
    	emp 
    WHERE
    	deptno = ( SELECT deptno FROM dept WHERE dname = 'SALES' );
    

    --7.一般不在子查询中排序;但在top-n分析问题中

    -- 找到员工表中工资最高的三名员工

    SELECT
    	empno,
    	ename,
    	sal 
    FROM
    	( SELECT * FROM emp ORDER BY sal DESC ) 
    WHERE
    	ROWNUM < 4
    

    8.一般先执行子查询,在执行主查询;但相关子查询例外

    相关子查询:
    -- 找到员工表中薪水大于本部门平均薪水的员工

    -- 一般方法
    SELECT
    	e.ename,
    	e.sal,
    	e.deptno,
    	d.avgsal 
    FROM
    	emp e,
    	( SELECT deptno, AVG( sal ) avgsal FROM emp GROUP BY deptno ) d 
    WHERE
    	e.deptno = d.deptno 
    	AND e.sal > d.avgsal
     
    -- 相关子查询
    SELECT
    	empno,
    	ename,
    	sal,
    	( SELECT avg( sal ) FROM emp WHERE deptno = e.deptno ) avgsal 
    FROM
    	emp e 
    WHERE
    	sal > (SELECT avg( sal ) 
    		   FROM  emp 
    		   WHERE deptno = e.deptno)
    

    10.子查询中的null
    in关键字中可以有null
    not in 中有null就会查不到数据原因如下

    • not in 等同于 <>ALL

    集合运算

    这里写图片描述

    INTERSECT(交集),返回两个查询共有的记录。

    UNION ALL(并集),返回各个查询的所有记录,包括重复记录。

    UNION(并集),返回各个查询的所有记录,不包括重复记录。

    MINUS(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录。

    注意的问题:
    1、参与运算的各个集合必须列数相同 且类型一致(列数不够可以用,to_number(null)、to_char(null)等去填充
    2、采用第一个集合作为最后的表头
    3、order by永远在最后
    4、括号,改变执行顺序

  • 相关阅读:
    EXCRT
    棋盘组合数
    Luogu P3687 [ZJOI2017]仙人掌 题解
    P4727 [HNOI2009]图的同构记数 题解
    WC2019 T1 数树 题解
    生成函数学习笔记
    luogu P1275 魔板 题解
    多项式ln、牛顿迭代学习笔记
    白帽子讲web安全——白帽子兵法(设计安全方案中的技巧)
    白帽子讲web安全——一个安全解决方案的诞生细节
  • 原文地址:https://www.cnblogs.com/yangliguo/p/7634840.html
Copyright © 2011-2022 走看看