SQL之with子句_sql with-程序员宅基地

技术标签: # 数据分析之SQL  

with 语句

with 语句相当于建立了一张 临时虚拟表

即利用with子句为子查询的数据集作为一个内存临时表. 在内存中解析,提高执行效率.,并且提高SQL语句的可读性,用完即销毁。

语法

可以同时定义多个临时表

With 
	Subtable1 as (select 1...), //as和select中的括号都不能省略
	Subtable2 as (select 2...), //后面的没有with,逗号分割,同一个主查询同级别地方,with子查询只能定义一次
	…
	Subtablen as (select n...) //与下面的实际查询之间没有逗号
Select.

引用高级sql学习——with子句!!!

在这里插入图片描述

例子

以下内容引用自Oracle with子句的简单介绍.

with 
   Q1 as (select product_id, product_name from products where rownum <= 10)
select * from Q1 ; //使用Q1

//查询结果
 
product_id 		product_name 
1797 			Inkjet C/8/HQ                                                                                                                 
2459 			LaserPro 1200/8/BW                                                                                                            
3127 			LaserPro 600/6/BW                                                                                                             
2254 			HD 10GB /I                                                                                                                                                                                                                                     
3334 			HD 12GB /R 

Q1为括号的子查询的别名,相当于在内存里建立了1张临时表. 下面的select 语句就直接检索这张临时表

with子句后必须接着select 语句, 否则出错

with 
   Q1 as (select product_id, product_name from products where rownum <= 10)
delete from products where 1 =2 ;
select * from products where 1 =2;
在第4行上开始执行命令时出错:
with 
   Q1 as (select product_id, product_name from products where rownum <= 10)
delete from products where 1 =2 

命令出错, 行: 17 列: 4
错误报告:
SQL 错误: ORA-00928: 缺失 SELECT 关键字
00928. 00000 -  "missing SELECT keyword"
*Cause:    
*Action:
未选择任何行

1个with子句里可以定义多个内存临时表, 而且可以互相使用

也就是说

with子句里其中1个内存临时表能被这个with子句内的其他内存临死表使用

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; 
 
         S          M        S+M        S*M
---------- ---------- ---------- ----------
         8         15         23        120 

with定义的内存临时表一旦被select 语句检索一次,系统就会在内存中清理掉这张临时表

也就是 用完即销毁

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; 
SELECT * FROM Q2;

结果

ORA-00942: 表或视图不存在
00942. 00000 -  "table or view does not exist"
*Cause:    
*Action:
行 42 列 15 出错

Q2 已经被with里的Q3检索过一次, 被删掉了

with子句定义的临时表命不能于已存在的表名重复

with
   products as (select 
   					product_id, 
   					product_name 
   				from products 
   				where rownum <= 10) 
select * from products ;
在行 21 上开始执行命令时出错:
with
   products as (select product_id, product_name from products where rownum <= 10)
 
select * from products 
命令出错, 行: 22 列: 54
错误报告:
SQL 错误: ORA-32039: 递归 WITH 子句必须具有列别名列表

案例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//构造子查询
WITH r AS (
    SELECT seller_id, item_id, 
        RANK() OVER(PARTITION BY seller_id ORDER BY order_date) AS ranking 
    FROM Orders), 
    second AS (
    SELECT seller_id, item_id 
    FROM r 
    WHERE ranking = 2)

SELECT user_id AS seller_id, 
    IF(item_brand = favorite_brand, 'yes', 'no') AS 2nd_item_fav_brand
FROM Users 
LEFT JOIN  second  //使用子查询
ON user_id = seller_id 
LEFT JOIN Items 
ON second.item_id = Items.item_id ```
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42374697/article/details/115293553

智能推荐

在java中实现订餐系统_Java实现简单订餐系统-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏28次。本文实例为大家分享了Java实现简单订餐系统的具体代码,供大家参考,具体内容如下import java.util.Scanner;import java.util.*;public class OrderingMsg {public static void main(String[] args) {// 数据主体:一组订单信息String[] names = new String[4]; // 订..._java美每胃订餐系统

用DB类写新闻系统-1-程序员宅基地

文章浏览阅读40次。今天用DB类写个新闻系统(点击查看DB类) 添加新闻主要代码<form action="news_add_up.asp?tabname=news" onSubmit="return isok(this)" method="post" name="upload" id="upload"> <table width="100%" border="0" class="df..._$hot_news= mymps_get_news

设计模式——行为型模式之——命令模式Command_命令模式 李建忠-程序员宅基地

文章浏览阅读94次。命令模式Command_命令模式 李建忠

借助腾讯云CDN开启全站https及问题解决分享_cdn的http3开不开-程序员宅基地

文章浏览阅读5.5k次。版权声明:本文由张戈原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/78来源:腾云阁 https://www.qcloud.com/community自从百度推荐全站 https 以来,一直就想让博客跟上这个节奏。可惜,国内所有的免费CDN都不支持https。所以要开启https势必要暴露网_cdn的http3开不开

卷积神经网络学习二:tinny_cnn程序试运行_对于卷积神经网络文件过多,怎样运行-程序员宅基地

文章浏览阅读1.4k次。卷积神经网络学习二:tinny_cnn程序试运行_对于卷积神经网络文件过多,怎样运行

实测阿里“通义千问”!一花独放不是春,百花齐放春满园-程序员宅基地

文章浏览阅读202次。阿里的大模型“通义千问”今天开启内测,距百度“文心一言”发布差不多20天。今天看到消息后厚着脸皮找达摩院的朋友要邀请码,下午拿到后,赶紧测了一下。官方网址:https://tongyi.aliyun.com/chat刚好上次文心一言出来的时候测试过一次,有一些现成的case,于是又用这些case测了一轮,有一些随意,个人观点,仅供参考。帮我写一份招聘JD,第一步没问题,让继续写实习生JD的时候,大..._通义千问7b 微调 csdn

随便推点

http://liveforlinux.blog.51cto.com/3337218/1056484-程序员宅基地

文章浏览阅读522次。awk系列3--比较全面在各大网站看到的 自己整理的awk学习实例[root@localhostopt]#catgrade.txtM.Tansley05/9948311Green84044J.Lulu06/9948317green92426P.Bunny02/99..._456mmmcon

Python机器学习入门 -- 支持向量机学习笔记_支持向量机 python-程序员宅基地

文章浏览阅读879次,点赞5次,收藏10次。大部分传统的机器学习算法都可以实现分类任务,但这些模型关注的是将不同类别的数据分得开就行,也就是说它们的核心思想是让整个模型分类出错的损失越小越好。刚刚好有一种机器学习模型,它不仅关注分类能不能将不同类别的数据完全分得开,还关注分类得到的决策边界的间隔能不能最大化,即离该决策边界每个类别最近的数据点的距离能不能更远,这就是我们今天的主角 - - 支持向量机。_支持向量机 python

信息学奥赛一本通 1321:【例6.3】删数问题(Noip1994) 贪心算法_1321信息学奥赛一本通答案-程序员宅基地

文章浏览阅读437次,点赞9次,收藏10次。输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小。时间限制: 1000 ms 内存限制: 65536 KB。每次删除第一个比下一个数字大的数字,如果没有就删除最后一个。1321:【例6.3】删数问题(Noip1994)理由是越高位替换成小的数字,得到的数字就会越小。(n不超过240位)输入数据均不需判错。_1321信息学奥赛一本通答案

OS短作业优先调度算法C语言,OS短作业优先调度算法C语言.doc-程序员宅基地

文章浏览阅读295次。采用短作业优先调度算法调度程序学 号:姓 名:专 业:指导老师:日 期:目录一、实验题目3二、课程设计的目的3三、设计内容3四、设计要求3五、主要数据结构及其说明4六、程序运行结果5七、流程图7八、源程序文件9九、实验体会13十、参考文献13摘要在多道程序环境下,主存中有着多个进程,其数目往往多于处理机数目。这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程..._os长作业与短作业

黑马程序员--Java基础学习第十三天-程序员宅基地

文章浏览阅读84次。---------------------- android培训、java培训、期待与您交流! ----------------------一、String类概述String类被final修饰,不能被继承。字符串一旦被初始化就不能被改变。字符串在内存中的存储请参考:http://www.cnblogs.com/heima/archive/2012/03/25/2417253.html..._java黑马程序员di13天代码

svn merge 命令使用_svn merge指令-程序员宅基地

文章浏览阅读2.3k次。Subversion的分支通常用于在主干程序之外,对程序进行修改。这样 可以在不扰乱主干程序进行的开发、测试、发布流程之外,尝试一下新功能的研究、修改。如果觉得新功能没问题,可以将分支合并到主干程序中。  合并前,需要将分支提交(Commit),由此看来,合并操作好象是在服务端和本地客户端同时进行的操作。  合并时,要从主干的working copy的右键菜单开始,"From" Url是合_svn merge指令

推荐文章

热门文章

相关标签