DBA优化SQL采用的WITH AS 用法简介
一、WITH AS简介
WITH AS的用法从oracle 9i新增的,官方文档也称之为:subquery factoring;在进行复杂的查询、统计等操作时使用with as 子句可以大大提高性能!
二、WITH AS用法
本人在oracle 11g 参考手册第1453页查询到官方对with as 的描述:
其中红色线框内给出了with as 的用法:oracle将其当作一个内联视图或者临时表来对待;
那么在进行复杂的查询时可以通过with as 对表数据进行处理,得到处理过后的结果作为一个临时表来操作,大大降低sql的复杂性;
官方文档给出with as 的用法如下:

由上图可知:其定义格式为:
WITH 名称1 [(别名1,别名2...)] AS ( 子查询 ) + 查询语句
以oracle数据库内置的用户scott中的dept,emp表来举例:
查询部门工资大于部门平均工资的部门信息
解决思路:
部门工资:按照部门进行分组,对每个部门下的员工工资进行求和,得到每个部门的工资;
部门平均工资:对上一步获得的部门工资进行就和后除以部门总数获得部门平均工资;
对以上的结果进行比较获得要求的部门信息
如果按照正常的思路去写,将会形成一个多重嵌套查询的sql,会是一个较为复杂的语句,如果利用with as 将部门工资和部门平均工资都
分别结算出来以后当作临时表,然后取得两个临时表中的工资数目进行比较很轻松获得要求的部门信息,其sql如下:
--统计部门工资大于平均工资的部门
WITH
dept_cost AS (SELECT d.dname ,sum(nvl(p.sal,0)) AS dept_total FROM dept d,emp p WHERE p.deptno (+)= d.deptno GROUP BY d.dname),
dept_avg AS (SELECT SUM(dept_total)/COUNT(1) AS sal_avg FROM dept_cost )
SELECT * FROM dept_cost a , dept_avg b WHERE a.dept_total > sal_avg ;
以上的dept_cost 就为部门工资,dept_avg为部门平均工资,通过with as 子句分别查询出来,然后通过一个select语句来操作两者获得结果如下:
DNAME DEPT_TOTAL SAL_AVG
1 ACCOUNTING 8750 7256.25
2 RESEARCH 10875 7256.25
3 SALES 9400 7256.25
DBA优化SQL采用的WITH AS 用法简介的更多相关文章
- MSSQL Sql加密函数 hashbytes 用法简介
转自:http://www.maomao365.com/?p=4732 一.mssql sql hashbytes 函数简介 hashbytes函数功能为:返回一个字符,通过 MD2.MD4.MD5. ...
- mssql sql server ceiling floor 函数用法简介
摘自: http://www.maomao365.com/?p=5581摘要: 下文主要讲述ceiling.floor函数的功能及举例说明 一.ceiling floor函数功能简介 ceiling ...
- 【转】使用SQL Tuning Advisor STA优化SQL
SQL优化器(SQL Tuning Advisor STA)是Oracle10g中推出的帮助DBA优化工具,它的特点是简单.智能,DBA值需要调用函数就可以给出一个性能很差的语句的优化结果.下面介绍一 ...
- MySQL 5.7 优化SQL提升100倍执行效率的深度思考(GO)
系统环境:微软云Linux DS12系列.Centos6.5 .MySQL 5.7.10.生产环境,step1,step2是案例,精彩的剖析部分在step3,step4. 1.慢sql语句大概需要13 ...
- mysql优化sql语句
mysql优化sql语句 常见误区 www.2cto.com 误区1: count(1)和count(primary_key) 优于 count(*) 很多人为了统计记录条数,就使 ...
- 如何用 SQL Tuning Advisor (STA) 优化SQL语句
在Oracle10g之前,优化SQL是个比较费力的技术活,不停的分析执行计划,加hint,分析统计信息等等.在10g中,Oracle推出了自己的SQL优化辅助工具: SQL优化器(SQL Tuning ...
- sql语句优化SQL Server
MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了 ...
- SQL中EXISTS和IN用法
SQL中EXISTS的用法 指定一个子查询,检测行的存在. 语法:EXISTS subquery 参数:subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INT ...
- 转载 50种方法优化SQL Server数据库查询
原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1 ...
随机推荐
- SQLSERVER一个比较不错的分页存储过程p_splitpage
CREATE procedure p_splitpage @sql nvarchar(4000), --要执行的sql语句 @page int=1, --要显示的页码 @pageSize int, - ...
- 利用花生壳在自己电脑上建立外网可访问的svn
下载花生壳并注册账号 2.花生壳会送你一个免费的二级域名 3.登陆到路由器界面192.168.0.1或者192.168.0.0进入动态dns选项输入你的花生壳账号密码 4.在路由器设置界面设置转发规则 ...
- Html Meta 标签详解
http://www.dreamdu.com/xhtml/tag_meta/
- DZY Loves Colors
CF #446C:http://codeforces.com/problemset/problem/444/C 题意:给你n个数,大小从1到n,然后又两种操作,1 a b c表示把区间a b 更新为c ...
- 创建组合索引SQL从1个多小时到1S的案例
select aa.acct_org, aa.loan_acct_no, aa.FUNCTIONARY, aa.cust_no, sum(dwm.pkg_tools.currcdtran(bb.INT ...
- poj2240 - Arbitrage(汇率问题,floyd)
题目大意: 给你一个汇率图, 让你判断能否根据汇率盈利 #include <iostream> #include <cstdlib> #include <cstdio&g ...
- HDOJ 1017 A Mathematical Curiosity
Problem Description Given two integers n and m, count the number of pairs of integers (a,b) such tha ...
- AOP Concepts
As with most technologies, AOP comes with its own specific set of concepts and terms. It is importan ...
- Oracle分页查询与RowNum
1. RowNum伪列 Oracle中,RowNum是一个伪列,表示当前记录是查询结果集中的第几条. RowNum在使用上应该注意,不能在where条件中用RowNum大于.大于等于.等于某个大于1的 ...
- [Java Concurrent] 多线程合作 wait / notifyAll 的简单案例
本案例描述的是,给一辆汽车打蜡.抛光的场景. Car 是一辆被打蜡抛光的汽车,扮演共享资源的角色. WaxOnCommand 负责给汽车打蜡,打蜡时需要独占整部车,一次打一部分蜡,等待抛光,然后再打一 ...