SQL进阶之关联子查询练习
SQL进阶之关联子查询
- 一、关联子查询简介
- 二、关联子查询实操
- 1.CreateTable
- 2.Sample
一、关联子查询简介
通过关联表内部条件从而达到查询效果
二、关联子查询实操
注:版本使用:mysql5.1.73
以下代码均可直接cv在mysql练习
1.CreateTable
--移动累计值和移动平均值
CREATE TABLE Accounts
(prc_date DATE NOT NULL , prc_amt INTEGER NOT NULL , PRIMARY KEY (prc_date)) ;INSERT INTO Accounts VALUES ('2006-10-26', 12000 );
INSERT INTO Accounts VALUES ('2006-10-28', 2500 );
INSERT INTO Accounts VALUES ('2006-10-31', -15000 );
INSERT INTO Accounts VALUES ('2006-11-03', 34000 );
INSERT INTO Accounts VALUES ('2006-11-04', -5000 );
INSERT INTO Accounts VALUES ('2006-11-06', 7200 );
INSERT INTO Accounts VALUES ('2006-11-11', 11000 );--查询重叠的时间区间
CREATE TABLE Reservations
(reserver VARCHAR(30) PRIMARY KEY,start_date DATE NOT NULL,end_date DATE NOT NULL);INSERT INTO Reservations VALUES('木村', '2006-10-26', '2006-10-27');
INSERT INTO Reservations VALUES('荒木', '2006-10-28', '2006-10-31');
INSERT INTO Reservations VALUES('堀', '2006-10-31', '2006-11-01');
INSERT INTO Reservations VALUES('山本', '2006-11-03', '2006-11-04');
INSERT INTO Reservations VALUES('内田', '2006-11-03', '2006-11-05');
INSERT INTO Reservations VALUES('水谷', '2006-11-06', '2006-11-06');--山本的入住日期为4日时
DELETE FROM Reservations WHERE reserver = '山本';
INSERT INTO Reservations VALUES('山本', '2006-11-04', '2006-11-04');--增长、减少、维持现状
CREATE TABLE Sales
(year INTEGER NOT NULL , sale INTEGER NOT NULL ,PRIMARY KEY (year));INSERT INTO Sales VALUES (1990, 50);
INSERT INTO Sales VALUES (1991, 51);
INSERT INTO Sales VALUES (1992, 52);
INSERT INTO Sales VALUES (1993, 52);
INSERT INTO Sales VALUES (1994, 50);
INSERT INTO Sales VALUES (1995, 50);
INSERT INTO Sales VALUES (1996, 49);
INSERT INTO Sales VALUES (1997, 55);--时间轴有间断时:和过去最临近的时间进行比较
CREATE TABLE Sales2
(year INTEGER NOT NULL , sale INTEGER NOT NULL , PRIMARY KEY (year));INSERT INTO Sales2 VALUES (1990, 50);
INSERT INTO Sales2 VALUES (1992, 50);
INSERT INTO Sales2 VALUES (1993, 52);
INSERT INTO Sales2 VALUES (1994, 55);
INSERT INTO Sales2 VALUES (1997, 55);
2.Sample
/* 求与上一年营业额一样的年份(1):使用关联子查询 */
SELECT YEAR,saleFROM Sales S1WHERE sale = (SELECT saleFROM Sales S2WHERE S2.year = S1.year - 1)ORDER BY YEAR;
/* 求与上一年营业额一样的年份(2):使用自连接 */
SELECT S1.year, S1.saleFROM Sales S1, Sales S2WHERE S2.sale = S1.saleAND S2.year = S1.year - 1ORDER BY YEAR;/* 求出是增长了还是减少了,抑或是维持现状(1):使用关联子查询 */
SELECT S1.year, S1.sale,CASE WHEN sale =(SELECT saleFROM Sales S2WHERE S2.year = S1.year - 1) THEN '→' /* 持平 */WHEN sale >(SELECT saleFROM Sales S2WHERE S2.year = S1.year - 1) THEN '↑' /* 增长 */WHEN sale <(SELECT saleFROM Sales S2WHERE S2.year = S1.year - 1) THEN '↓' /* 减少 */ELSE '—' END AS varFROM Sales S1ORDER BY YEAR;/* 求出是增长了还是减少了,抑或是维持现状(2):使用自连接查询 */
SELECT S1.year, S1.sale,CASE WHEN S1.sale = S2.sale THEN '→' WHEN S1.sale > S2.sale THEN '↑' WHEN S1.sale < S2.sale THEN '↓' ELSE '—' END AS varFROM Sales S1, Sales S2WHERE S2.year = S1.year-1ORDER BY YEAR;/* 查询与过去最临近的年份营业额相同的年份 */
SELECT YEAR, saleFROM Sales2 S1WHERE sale =(SELECT saleFROM Sales2 S2WHERE S2.year =(SELECT MAX(YEAR) /* 条件2:在满足条件1的年份中,年份最早的一个 */FROM Sales2 S3WHERE S1.year > S3.year)) /* 条件1:与该年份相比是过去的年份 */ORDER BY YEAR;
/* 查询与过去最临近的年份营业额相同的年份:同时使用自连接 */
SELECT S1.year AS YEAR,S1.sale AS saleFROM Sales2 S1, Sales2 S2WHERE S1.sale = S2.saleAND S2.year = (SELECT MAX(YEAR)FROM Sales2 S3WHERE S1.year > S3.year)/* 求每一年与过去最临近的年份之间的营业额之差(1):结果里不包含最早的年份 */
SELECT S2.year AS pre_year,S1.year AS now_year,S2.sale AS pre_sale,S1.sale AS now_sale,S1.sale - S2.sale AS diffFROM Sales2 S1, Sales2 S2WHERE S2.year = (SELECT MAX(year)FROM Sales2 S3WHERE S1.year > S3.year)ORDER BY now_year;
/* 求每一年与过去最临近的年份之间的营业额之差(2):使用自外连接。结果里包含最早的年份 */
SELECT S2.year AS pre_year,S1.year AS now_year,S2.sale AS pre_sale,S1.sale AS now_sale,S1.sale - S2.sale AS diffFROM Sales2 S1 LEFT OUTER JOIN Sales2 S2ON S2.year = (SELECT MAX(year)FROM Sales2 S3WHERE S1.year > S3.year)ORDER BY now_year;/* 求累计值:使用窗口函数 */(mysql不支持窗口函数,hivesql可以用)
SELECT prc_date, prc_amt,SUM(prc_amt) OVER (ORDER BY prc_date) AS onhand_amtFROM Accounts;/* 求累计值:使用冯·诺依曼型递归集合 */
SELECT prc_date, A1.prc_amt,(SELECT SUM(prc_amt)FROM Accounts A2WHERE A1.prc_date >= A2.prc_date ) AS onhand_amtFROM Accounts A1ORDER BY prc_date;/* 求移动累计值(1):使用窗口函数 */(hivesql使用,mysql不支持)
SELECT prc_date, prc_amt,SUM(prc_amt) OVER (ORDER BY prc_dateROWS 2 PRECEDING) AS onhand_amtFROM Accounts;
/* 求移动累计值(2):不满3行的时间区间也输出 */
SELECT prc_date, A1.prc_amt,(SELECT SUM(prc_amt)FROM Accounts A2WHERE A1.prc_date >= A2.prc_dateAND (SELECT COUNT(*)FROM Accounts A3WHERE A3.prc_date BETWEEN A2.prc_date AND A1.prc_date ) <= 3 ) AS mvg_sumFROM Accounts A1ORDER BY prc_date;/* 求移动累计值(3):不满3行的区间按无效处理 */
SELECT prc_date, A1.prc_amt,(SELECT SUM(prc_amt)FROM Accounts A2WHERE A1.prc_date >= A2.prc_dateAND (SELECT COUNT(*)FROM Accounts A3WHERE A3.prc_date BETWEEN A2.prc_date AND A1.prc_date ) <= 3HAVING COUNT(*) =3) AS mvg_sum /* 不满3行数据的不显示 */FROM Accounts A1ORDER BY prc_date;/* 求重叠的住宿期间 */
SELECT reserver, start_date, end_dateFROM Reservations R1WHERE EXISTS(SELECT *FROM Reservations R2WHERE R1.reserver <> R2.reserver /* 与自己以外的客人进行比较 */AND ( R1.start_date BETWEEN R2.start_date AND R2.end_date /* 条件(1):自己的入住日期在他人的住宿期间内 */OR R1.end_date BETWEEN R2.start_date AND R2.end_date)); /* 条件(2):自己的离店日期在他人的住宿期间内 *//* 升级版:把完全包含别人的住宿期间的情况也输出 */
SELECT reserver, start_date, end_dateFROM Reservations R1
WHERE EXISTS(SELECT *FROM Reservations R2WHERE R1.reserver <> R2.reserverAND ( ( R1.start_date BETWEEN R2.start_date AND R2.end_dateOR R1.end_date BETWEEN R2.start_date AND R2.end_date)OR ( R2.start_date BETWEEN R1.start_date AND R1.end_dateAND R2.end_date BETWEEN R1.start_date AND R1.end_date)));/* 简化多行数据的比较*/
SELECT S1.year, S1.sale,CASE SIGN(sale -(SELECT saleFROM Sales S2WHERE S2.year = S1.year - 1) )WHEN 0 THEN '→' /* 持平 */WHEN 1 THEN '↑' /* 增长 */WHEN -1 THEN '↓' /* 减少 */ELSE '—' END AS varFROM Sales S1ORDER BY YEAR;
参考资料:《SQL进阶教程》| MICK
SQL进阶之关联子查询练习相关推荐
- SQL进阶之关联子查询行间比较
SQL进阶之关联子查询行间比较 关联子查询行间比较 越前须知(雾) 具体用法 与最近一年比较营收 移动平均值和移动累计值 查询重叠的时间区间 关联子查询行间比较 越前须知(雾) 本系列参考<SQ ...
- SQL中的关联子查询
目录 关联查询 例子 分解相关的嵌套查询 与不同的表一起使用 关联子查询与内部联接 哪个更快? 哪个更容易阅读? 哪一个更好? HAVING子句中的关联子查询 在本文中,我们将查看几个示例并将关联子查 ...
- server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...
4.1.查询的类型 declare @value as int set @value = 50 select 'age:'as age,2008 years,@valueas va --这种查询时跟 ...
- SQL子查询和关联子查询
子查询:将用来定义视图的SELECT语句直接用于FROM子句中. SELECT <列名1>, <列名2>, - FROM (<SELECT语句>) AS <视 ...
- python中and与or的执行顺序-关联子查询的执行顺序是什么
sql的编写顺序 select .. from .. where .. group by ..having .. order by .. sql的执行顺序 from .. where .. group ...
- Oracle 的关联子查询(correlated subquery) 简介.
相信 接触过 ocp考题既, 都会见到 correlated subquery的字眼. correlated subquery的中文名称就是相关子查询呢? 1. 什么是子查询 这个很简单, 子查询就 ...
- order by 子查询_视图,子查询,标量子查询,关联子查询
视图 子查询 标量子查询 关联子查询 如何用SQL解决业务问题 各种函数 1. 视图 视图内存放SQL查询语句,运行时运行该语句.查出的数据为临时数据 创建视图 create view as 视图名称 ...
- Oracle 数据库的子查询(关联子查询)
文章目录 一.子查询结果返回一个值(单列单行) 二.子查询结果返回多行(单列多行) 三.子查询结果返回多列多行 四.关联子查询 (一)子查询执行顺序 (二)exists 关键字 五.子查询总结 六.关 ...
- oracle subquery是什么,如何让非关联子查询(uncorrelated subquery)先执行
如何让非关联子查询(uncorrelated subquery)先执行 环境:10.2.0.4 / Solaris 9 有一个sql: [php] SELECT M.PROD_DATE, N.FAC_ ...
最新文章
- Linux下tomcat内存溢出分析及优化
- 读取手柄_中高端游戏手柄比选,北通宙斯才是游戏的最佳拍档
- 第二篇:Mysql---约束条件、修改表的结构、键值
- 【STM32】MDK5打开MDK4项目工程时出现的不兼容及解决方法
- Eclipse 3.7 3.x SWT/Jface 开发环境搭建
- 【数据结构与算法】之深入解析KMP算法的核心原理和实战演练
- coolite TreePanel CheckBox联动
- 趣挨踢 | 关于遗留代码的那些事儿
- Android蓝牙设备名显示修改
- 360怎么看电脑配置_怎么样查看电脑配置?5种方法查看电脑硬件配置好坏图文详解...
- HDU 1016 DFS
- Python入门学习三
- jsp数据库中文乱码处理
- Linux基本操作(实训一)
- CSS3实现360度循环旋转
- 快速掌握阿里云 OSS
- OOzie 入门 【转】
- Python&Opencv手势识别系统
- 如何根据快递单号物流信息自动识别快递状态
- R语言plot函数以及acf函数,随机性检验
热门文章
- 拼多多Temu下载量突破5000万次!但这其实没有意义?
- SQL Server 2017下载,安装,打开步骤
- Arduino - 热敏电阻MF58-104F3950K
- Tomcat运行一段时间后访问变慢分析历程
- UML类图和关系--idea使用PlantUML插件画类图
- notify() 和 notifyAll() 有什么区别?
- Lillian Shao用十年经验解读中国“公有云”落地为什么这么难?
- IEEE802.11g 标准的OFDM
- 操作系统实验Lab 1:Xv6 and Unix utilities(MIT 6.S081 FALL 2020)
- RISC-V 架构及MRS 开发环境介绍