--语法:

/*
with   
alias_name1 as    (subquery1),  
alias_name2 as    (subQuery2),  
……  
alias_nameN as    (subQueryN)  
select col1,col2…… col3   
     from alias_name1,alias_name2……,alias_nameN 
    
     
如:
WITH  
Q1 AS (SELECT 3 + 5 S FROM DUAL),  
    Q2 AS (SELECT 3 * 5 M FROM DUAL),  
    Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2)  
SELECT * FROM Q3;

好处:    
          1. 结构清晰,预先定义(在本文《with自居的清晰.sql》中清晰可见。
          2. 性能更好,一份复制(类似SYS_TMP...),多份使用,可参见《with子句的高效.sql》。
          3. 代码修改不必修改多处,可参见《with子句的高效.sql》中提到的搞笑案例。

*/

/*
查询出部门的总薪水大于所有部门平均总薪水的部门。部门表s_dept,员工表s_emp。
分析:做这个查询,首先必须计算出所有部门的总薪水,然后计算出总薪水的平均薪水,再筛选出部门的总薪水大于所有部门总薪水平均薪水的部门。
1. 用with 查询查出所有部门的总薪水,
2. 用with 从第1 步获得的结果表中查询出平均薪水;
3. 最后利用这两次 的with 查询比较总薪水大于平均薪水的结果,如下:
*/

--构造环境
drop table dept purge;
drop table emp purge;
create table dept as select * from scott.dept;
create table emp  as select * from scott.emp;

set term off
set heading on
set verify off
set feedback off
set linesize 2000
set pagesize 30000
set long 999999999
set longchunksize 999999
set autotrace off
-------------------------------------------------------------------------------------------------------------------------------------------------------------------

WITH DEPT_COSTS AS --查询出部门的总工资  
 (SELECT D.DNAME, SUM(E.SAL) DEPT_TOTAL
    FROM DEPT D, EMP E
   WHERE E.DEPTNO = D.DEPTNO
   GROUP BY D.DNAME),
AVE_COST AS --查询出部门的平均工资,在后一个WITH语句中可以引用前一个定义的WITH语句   
 (SELECT SUM(DEPT_TOTAL) / COUNT(*) AVG_SUM FROM DEPT_COSTS)
SELECT *
  FROM DEPT_COSTS DC
 WHERE DC.DEPT_TOTAL > (SELECT AC.AVG_SUM FROM AVE_COST AC);

DNAME          DEPT_TOTAL
-------------- ----------
RESEARCH            10875

/* 
 
 可以使用前面的数据,在后面的with语句中直接引用。需求,展示根据查询结果查询出的数据,并把根据查询出的结果进行统计。
 如最大工资,最小工资,平均工资, 进行级联。
 注意:
 由于查询的统计数据的条数为1条,所以不会发生笛卡儿积的错误,
*/
 
WITH TEMP_DATA AS --查询基础数据(进行级联,由于查询的统计数据的条数为1条,所以不会发生笛卡儿积的错误)    
  (SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM EMP),
TEM_SUM AS --查询统计数据 
  (SELECT MAX(SAL), MIN(SAL), SUM(SAL) FROM TEMP_DATA)
SELECT * FROM TEM_SUM, TEMP_DATA;

MAX(SAL)   MIN(SAL)   SUM(SAL)      EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
--------- ---------- ---------- ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
     5000        800      29025       7369 SMITH      CLERK           7902 17-12月-80            800                    20
     5000        800      29025       7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
     5000        800      29025       7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
     5000        800      29025       7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
     5000        800      29025       7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
     5000        800      29025       7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
     5000        800      29025       7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
     5000        800      29025       7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
     5000        800      29025       7839 KING       PRESIDENT            17-11月-81           5000                    10
     5000        800      29025       7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
     5000        800      29025       7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
     5000        800      29025       7900 JAMES      CLERK           7698 03-12月-81            950                    30
     5000        800      29025       7902 FORD       ANALYST         7566 03-12月-81           3000                    20
     5000        800      29025       7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

--在列的子查询中引用WITH函数:
 SELECT (WITH A AS (SELECT '1' FROM DUAL) SELECT * FROM A) as  COL1 FROM DUAL;

C
-
1

with优化妙用的更多相关文章

  1. JavaScript的妙与乐(一)之 函数优化

    JavaScript的妙与乐系列文章主要是展示一些JavaScript上面比较好玩一点的特性和一些有用的技巧,里面很多内容都是我曾经在项目中使用过的一些内容(当然,未必所有技巧的使用频率都很高^_^) ...

  2. 树链剖分的一种妙用与一类树链修改单点查询问题的时间复杂度优化——2018ACM陕西邀请赛J题

    题目描述 有一棵树,每个结点有一个灯(初始均是关着的).每个灯能对该位置和相邻结点贡献1的亮度.现有两种操作: (1)将一条链上的灯状态翻转,开变关.关变开: (2)查询一个结点的亮度. 数据规模:\ ...

  3. HDFS 细粒度锁优化,FusionInsight MRS有妙招

    摘要:华为云FusionInsight MRS通过FGL对HDFS NameNode锁机制进行优化,有效提升了NameNode的读写吞吐量,从而能够支持更多数据,更多业务请求访问,从而更好的支撑政企客 ...

  4. 优化MySQL插入方法的五个妙招

    以下是涉及到插入表格的查询的5种改进方法: 1)使用LOAD DATA INFILE从文本下载数据这将比使用插入语句快20倍. 2)使用带有多个VALUES列表的INSERT语句一次插入几行这将比使用 ...

  5. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

  6. Expert 诊断优化系列-------------针对重点语句调索引

    上一篇我们说了索引的重要性,一个索引不仅能让一条语句起飞,也能大量减少系统对CPU.内存.磁盘的依赖.我想上一篇中的例子可以说明了.给出上一篇和目录文链接: SQL SERVER全面优化------- ...

  7. 妙味课堂——HTML+CSS基础笔记

    妙味课堂的课程讲得非常的清楚,受益匪浅.先把HTML和CSS基础课程部分视频的学习笔记记录如下: padding #PS基础 ##前端需要的PS技能 - PS技能(前端需要):切图.修图.测量 - P ...

  8. Android UI性能优化实战, 识别View中的性能问题

    出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android ...

  9. 对JavaScript优化及规范的一些感想

    变量...... 1.一个变量只存一种类型的数据,2.尽量减少对隐式转换的依赖,这样可增强程序的可读性,日后修改程序时不至于混乱,3.使用匈牙利命名法,4.使用局部变量时记得加 var 进行声明,不然 ...

随机推荐

  1. 使用express、react、webpack打包、socket.io、mongodb、ant.design、less、es6实现聊天室

    拿到一个项目,我们应该如何去完成这个项目呢. 是直接上手? 还是先进行分析,然后再去解决呢?毫无疑问,如果直接上手解决,那么可能会因为知道目标所在,而导致出现各种问题. 所以,我们应该系统的分析这个项 ...

  2. Delphi对话框初始地址InitialDir

    我的电脑:SaveDialog1.InitialDir := '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}';// My Computer {20D04FE0-3 ...

  3. springboot整合mybatis(映射文件方式和注解方式)

    springboot作为一个微服务框架,给我们开发人员提供极大的便利,秉着约定大于配置的原则,通过starter包的形式为我们做了许多默认的配置,在进行数据持久化到关系型数据库时,我们一般都会首选sp ...

  4. hibernate抓取问题

    当使用xml配置类之间的关系时 ,例如 学生 班级,多对一关系 /** * 默认情况会发出2条SQL语句,一条取student,一条取Classroom,其实这只需要一条sql             ...

  5. TCP连接管理(TCP Connection Management)

    在最近的求职面试过程中,关于"建立TCP连接的三次握手"不止一次被问到了,虽然我以前用同样的问题面试过别人,但感觉还是不能给面试官一个很清晰的回答.本文算是对整个TCP连接管理做一 ...

  6. LookupError: unknown encoding: cp65001的问题

    在CMD中进入Python2命令行交互模式,输入代码报错: LookupError: unknown encoding: cp65001 解决方法: 在CMD中设置 Python2 的环境变量 PYT ...

  7. Git命令基本操作备忘

    创建Git仓库并上传到远程Git仓库 git init git config user.name "显示的名称" git config user.email "EMAIL ...

  8. div+css 让一个小div在另一个大div里面 垂直居中

    方法1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 .parent {           width:800px;           height:500px;       ...

  9. git submodule的使用

    1.在项目中使用Submodule 为当前工程添加submodule,命令如下:git submodule add 仓库地址 路径仓库地址:是指子模块仓库地址URL.路径:指将子模块放置在当前工程下的 ...

  10. 【转】@RequestParam @RequestBody @PathVariable 等参数绑定注解详解

    @RequestParam @RequestBody @PathVariable 等参数绑定注解详解 2014-06-02 11:24 23683人阅读 评论(2) 收藏 举报 目录(?)[+] 引言 ...