记得以前在论坛里看到inthirties用到过WITH AS这个字眼,当时没特别在意。今天在一个帖子里又看到有人用这个,所以就去网上搜了搜相关内容,自己小试了一把,写下来,方便以后忘了的话学习。
===================================================================================
语法:
with tempName as (select ....)
select ...
例:现在要从1-19中得到11-14。一般的sql如下:
select * from
(
--模拟生一个20行的数据
SELECT LEVEL AS lv
FROM DUAL
CONNECT BY LEVEL <<> 20
) tt
WHERE tt.lv > 10 AND tt.lv <<> 15<<><<><<><<><<><<>
使用With as 的SQL为:
with TT as( --模拟生一个20行的数据
SELECTLEVELAS lv FROM DUAL CONNECT BYLEVEL<<>20<<> )
select lv from TT WHERE lv >10AND lv <<>15<<><<><<><<>
一种SQL查询方法,颠覆日常以select开始的SQL查询写法
create table t (x number(10), y number(10));
insert into t values (1,110);
insert into t values (2,120);
insert into t values (2,80);
insert into t values (3,150);
insert into t values (3,30);
insert into t values (3,60);
commit;
select * from t;
需求描述
按照x列分组后统计y列的总值,最终目标是选出比y列总值的三分之一大的那些分组统计信息
使用子查询方式实现
最容易想到的方法
SELECT x, SUM (y) AS total_y
FROM t
GROUP BY x
HAVING SUM (y) > (SELECT SUM (y) / 3 FROM t)
ORDER BY total_y
WITH Clause方法闪亮登场
WITH secooler_sum AS (SELECT x, SUM (y) total_y
FROM t
GROUP BY x)
SELECT x, total_y
FROM secooler_sum
WHERE total_y > (SELECT SUM (total_y) / 3 FROM secooler_sum)
ORDER BY total_y
查询语句不是以select开始的,而是以“WITH”关键字开头
可认为在真正进行查询之前预先构造了一个临时表secooler_sum,之后便可多次使用它做进一步的分析和处理
WITH Clause方法的优点
增加了SQL的易读性,如果构造了多个子查询,结构会更清晰;
更重要的是:“一次分析,多次使用”,这也是为什么会提供性能的地方,达到了“少读”的目标
知其所以然
为什么WITH Clause方法会提高效率?通过查看上面两种方法的执行计划便可略知一二
1)使用子查询的执行计划
set autot trace exp
第一种使用子查询的方法T表被扫描了两次,而使用WITH Clause方法,T表仅被扫描一次
这也是为什么在大型数据仓库系统中推荐使用WITH Clause方法进行查询统计的原因,这样可以大大的提高数据分析和查询的效率
另外,观察WITH Clause方法执行计划,其中“SYS_TEMP_XXXX”便是在运行过程中构造的中间统计结果临时表。
先举个例子吧:
有两张表,分别为A、B,求得一个字段的值先在表A中寻找,如果A表中存在数据,则输出A表的值;如果A表中不存在,则在B表中寻找,若B表中有相应记录,则输出B表的值;如果B表中也不存在,则输出"no records”字符串。
-
with
-
sql1 as (select to_char(a) s_name from test_tempa),
-
sql2 as (select to_char(b) s_name from test_tempb where not exists (select s_name from sql1 where rownum=1))
-
select * from sql1
-
union all
-
select * from sql2
-
union all
-
select 'no records' from dual
-
where not exists (select s_name from sql1 where rownum=1)
-
and not exists (select s_name from sql2 where rownum=1);
相关推荐
详细介绍oracle数据库中新出的with_as语法以及相关使用
### Oracle数据库中的START WITH 和 CONNECT BY 用法详解 在Oracle数据库中,处理层次结构数据时,`START WITH` 和 `CONNECT BY` 是非常有用的两个关键字。这些关键字可以帮助我们在查询时构建出树形或者层级结构的...
本博客简单介绍一下oracle分组函数之rollup的用法,rollup函数常用于分组统计,也是属于oracle分析函数的一种 环境准备 create table dept as select * from scott.dept; create table emp as select * from ...
Oracle 下 WITH CHECK OPTION 用法 WITH CHECK OPTION 是 Oracle 中的一种视图定义选项,它可以确保数据库中正在修改的数据的完整性。该选项通常用在视图定义中,以确保任何引用该视图的 INSERT 或 UPDATE 语句都...
`START WITH...CONNECT BY PRIOR`是Oracle SQL中的一个特性,用于处理具有层级关系的数据。这个子句允许我们遍历和查询具有父子关系的数据,例如部门和其下属子部门,或者员工和他们的上级经理。 1. **START WITH...
SELECT ename, REGEXP_LIKE(ename, '^[0-9]') AS starts_with_number FROM emp; ``` 这个查询将返回一个标志,表明员工名字是否以数字开始。 了解并熟练掌握Oracle分析函数和正则表达式函数,能显著提高在数据库...
SELECT extract(month FROM sysdate) AS "This Month", extract(year FROM add_months(sysdate, 36)) AS "Years" FROM dual; ``` 这将分别提取当前月和当前日期36个月后对应的年份。 以上就是Oracle中常用的日期...
代码如下:with alias_name1 as (subquery1), alias_name2 as (subQuery2), …… alias_nameN as (subQueryN) select col1,col2…… col3from alias_name1,alias_name2……,alias_nameN Oracle with语句的...
WITH sales_data AS ( SELECT product_id, TO_CHAR(sale_date, 'YYYY-MM') AS sale_month, sale_amount FROM sales ) SELECT * FROM sales_data PIVOT ( SUM(sale_amount) FOR product_id IN (DECODE(product_...
WITH ranked_data AS ( SELECT name, code, id, ROW_NUMBER() OVER (PARTITION BY name, code ORDER BY id DESC) AS rn FROM table ) SELECT name, code, id FROM ranked_data WHERE rn = 1; ``` 总的来说,`...
WITH data AS (SELECT 'apple,banana,orange' str FROM dual) SELECT regexp_substr(str, '[^,]+', 1, level) fruit FROM data CONNECT BY level (regexp_replace(str, '[^,]+')) + 1; ``` 以上就是Oracle...
INNER JOIN Sales.SalesPerson AS sp ON e.EmployeeID = sp.SalesPersonID INNER JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE e.EmployeeID LIKE '2%' ORDER BY e.EmployeeID, c.LastName; GO ```...
- 掌握WITH子句的基本用法及特点。 - 了解WITH子句如何优化查询性能。 - 孶明WITH子句的常见应用场景。 #### WITH子句概述 在Oracle数据库中,WITH子句是一种非常有用的特性,它允许用户定义一个临时的结果集(通常...
例如:CREATE SEQUENCE 序列号的名称(最好是表名+序列号标记)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE; 3. 单引号的处理 MySQL 里可以用双引号包起字符串,Oracle 里只可以用单引号包起字符串。...
WITH lcy AS ( SELECT regexp_substr('10,20,30,30,50,60,80,80,90,100','[^,]+',1,level) score FROM dual CONNECT BY level ) SELECT score, RANK() OVER (ORDER BY TO_NUMBER(score) DESC) "rank", DENSE_...
WITH t AS (SELECT 1 id FROM dual UNION ALL SELECT 2 FROM dual UNION ALL SELECT 3 FROM dual) SELECT CARDINALITY(ARRAY[SELECT id FROM t]) cnt FROM dual; ``` **结果**: ``` CNT ---- 3 ``` #### CAST **...
韩顺平oracle学习笔记 第0讲:如何学习oracle 一、如何学习oracle Oracle目前最流行的数据库之一,功能强大,性能卓越。学习oracle需要具备一定基础: 1.学习过一门编程语言(如:java ,c) 2.最好学习过一门别的...
CREATE VIEW v3 AS SELECT * FROM SALES WHERE cust_id = 2034 WITH CHECK OPTION; CREATE VIEW v1 AS SELECT * FROM SALES WHERE time_id * 365 WITH CHECK OPTION; CREATE VIEW v2 AS SELECT prod_id, cust_id, ...