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进阶之关联子查询练习相关推荐

  1. SQL进阶之关联子查询行间比较

    SQL进阶之关联子查询行间比较 关联子查询行间比较 越前须知(雾) 具体用法 与最近一年比较营收 移动平均值和移动累计值 查询重叠的时间区间 关联子查询行间比较 越前须知(雾) 本系列参考<SQ ...

  2. SQL中的关联子查询

    目录 关联查询 例子 分解相关的嵌套查询 与不同的表一起使用 关联子查询与内部联接 哪个更快? 哪个更容易阅读? 哪一个更好? HAVING子句中的关联子查询 在本文中,我们将查看几个示例并将关联子查 ...

  3. server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...

    4.1.查询的类型 declare @value as int set @value = 50 select  'age:'as age,2008 years,@valueas va --这种查询时跟 ...

  4. SQL子查询和关联子查询

    子查询:将用来定义视图的SELECT语句直接用于FROM子句中. SELECT <列名1>, <列名2>, - FROM (<SELECT语句>) AS <视 ...

  5. python中and与or的执行顺序-关联子查询的执行顺序是什么

    sql的编写顺序 select .. from .. where .. group by ..having .. order by .. sql的执行顺序 from .. where .. group ...

  6. Oracle 的关联子查询(correlated subquery) 简介.

    相信 接触过 ocp考题既, 都会见到 correlated subquery的字眼. correlated subquery的中文名称就是相关子查询呢? 1. 什么是子查询 这个很简单,  子查询就 ...

  7. order by 子查询_视图,子查询,标量子查询,关联子查询

    视图 子查询 标量子查询 关联子查询 如何用SQL解决业务问题 各种函数 1. 视图 视图内存放SQL查询语句,运行时运行该语句.查出的数据为临时数据 创建视图 create view as 视图名称 ...

  8. Oracle 数据库的子查询(关联子查询)

    文章目录 一.子查询结果返回一个值(单列单行) 二.子查询结果返回多行(单列多行) 三.子查询结果返回多列多行 四.关联子查询 (一)子查询执行顺序 (二)exists 关键字 五.子查询总结 六.关 ...

  9. oracle subquery是什么,如何让非关联子查询(uncorrelated subquery)先执行

    如何让非关联子查询(uncorrelated subquery)先执行 环境:10.2.0.4 / Solaris 9 有一个sql: [php] SELECT M.PROD_DATE, N.FAC_ ...

最新文章

  1. Linux下tomcat内存溢出分析及优化
  2. 读取手柄_中高端游戏手柄比选,北通宙斯才是游戏的最佳拍档
  3. 第二篇:Mysql---约束条件、修改表的结构、键值
  4. 【STM32】MDK5打开MDK4项目工程时出现的不兼容及解决方法
  5. Eclipse 3.7 3.x SWT/Jface 开发环境搭建
  6. 【数据结构与算法】之深入解析KMP算法的核心原理和实战演练
  7. coolite TreePanel CheckBox联动
  8. 趣挨踢 | 关于遗留代码的那些事儿
  9. Android蓝牙设备名显示修改
  10. 360怎么看电脑配置_怎么样查看电脑配置?5种方法查看电脑硬件配置好坏图文详解...
  11. HDU 1016 DFS
  12. Python入门学习三
  13. jsp数据库中文乱码处理
  14. Linux基本操作(实训一)
  15. CSS3实现360度循环旋转
  16. 快速掌握阿里云 OSS
  17. OOzie 入门 【转】
  18. Python&Opencv手势识别系统
  19. 如何根据快递单号物流信息自动识别快递状态
  20. R语言plot函数以及acf函数,随机性检验

热门文章

  1. 拼多多Temu下载量突破5000万次!但这其实没有意义?
  2. SQL Server 2017下载,安装,打开步骤
  3. Arduino - 热敏电阻MF58-104F3950K
  4. Tomcat运行一段时间后访问变慢分析历程
  5. UML类图和关系--idea使用PlantUML插件画类图
  6. notify() 和 notifyAll() 有什么区别?
  7. Lillian Shao用十年经验解读中国“公有云”落地为什么这么难?
  8. IEEE802.11g 标准的OFDM
  9. 操作系统实验Lab 1:Xv6 and Unix utilities(MIT 6.S081 FALL 2020)
  10. RISC-V 架构及MRS 开发环境介绍