|
|
|
|
公众号矩阵

SQL数据分析之子查询

子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制,通常将一个查询(子查询)的结果作为另一个查询(主查询)的数据来源或判断条件,常见的子查询有WHERE子查询,HAVING子查询,FROM子查询,SELECT子查询,EXISTS子查询。

作者: 尚天强 来源: 大话数据分析|2021-06-30 20:49

子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制,通常将一个查询(子查询)的结果作为另一个查询(主查询)的数据来源或判断条件,常见的子查询有WHERE子查询,HAVING子查询,FROM子查询,SELECT子查询,EXISTS子查询。

子查询是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询,可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中,同逻辑运算符一起使用。

示例工具:MySQL8.0、Navicat Premium 12

本文讲解内容:SQL子查询

适用范围:子查询在SQL数据分析中的应用

使用子查询必须遵循以下几个规则:

  • 子查询必须括在圆括号中。
  • 子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较。
  • 子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用。
  • 返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符。
  • SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用。
  • 子查询不能直接用在聚合函数中。
  • BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中。

创建数据表

通常情况下子查询都与 SELECT 语句一起使用,其基本语法如下所示:

  1. SELECT column_name [, column_name ] 
  2. FROM   table1 [, table2 ] 
  3. WHERE  column_name OPERATOR (SELECT column_name [, column_name ] 
  4.                              FROM table1 [, table2 ] 
  5.                              [WHERE]) 

对于子查询的数据演示创建两个表,一个是薪水表,另一个是职位表,并且插入数据。

  1. #创建薪水表SALARY 
  2. CREATE TABLE SALARY ( 
  3. ID VARCHAR ( 10 ), 
  4. NAME VARCHAR ( 10 ), 
  5. AGE VARCHAR ( 10 ), 
  6. ADDRESS VARCHAR ( 10 ), 
  7. SAL INT(10) ); 

给薪水表插入数据,数据内容如下所示:

  1. # 给薪水表插入数据 
  2. INSERT INTO SALARY(ID,NAME,AGE,ADDRESS,SAL) 
  3. VALUES 
  4. ('C001','Rmesh',35,'Ahmedabad',2000), 
  5. ('C002','Khilan',25,'Delhi',1500), 
  6. ('C003','Kaushik',23,'Kota',2000), 
  7. ('C004','Chaitali',25,'Mumbai',6500), 
  8. ('C005','Hardik',27,'Bhopal',8500), 
  9. ('C006','Komal',22,'MP',4500), 
  10. ('C007','Tom',26,'MP',5500), 
  11. ('C008','Muffy',24,'Indore',10000); 

查询所有的薪水数据如下所示:

  1. SELECT * FROM  SALARY; 

同理创建一个职位表。

  1. #创建职位表JOB 
  2. CREATE TABLE JOB ( 
  3. JID VARCHAR ( 10 ), 
  4. JB VARCHAR ( 10 )); 

给职位表插入数据,数据内容如下所示:

  1. # 给职位表插入数据 
  2. INSERT INTO JOB(JID,JB) 
  3. VALUES 
  4. ('C001','Teacher'), 
  5. ('C002','Docter'), 
  6. ('C003','Teacher'), 
  7. ('C004','Worker'), 
  8. ('C005','Nurse'), 
  9. ('C006','Teacher'), 
  10. ('C007','Docter'), 
  11. ('C008','Teacher'); 

查询所有的职位数据如下所示:

  1. SELECT * FROM  JOB; 

子查询过滤

子查询最常见的使用是在WHERE子句的IN操作符中,以及用来填充计算列。先看一个简单的例子,要查询所有医生的薪水情况,这里首先在职位表中查询所有医生的JID,查询结果如下:

  1. SELECT JID 
  2. FROM JOB 
  3. WHERE JB='Docter'

然后在薪水表中查询ID为'C002','C007'的薪水情况,查询结果如下:

  1. SELECT SAL 
  2. FROM SALARY 
  3. WHERE ID IN('C002','C007'); 

这里使用子查询更加简便,子查询从内向外依次处理,在下面的SELECT语句中,MySQL实际上执行了两个操作,首先查询返回两个ID号:C002和C007。

然后,这两个值以IN操作符要求的逗号分隔的格式传递给外部查询的WHERE子句,可以看到输出的结果是正确的,并且与前面WHERE子句所返回的值相同。

  1. SELECT SAL 
  2. FROM SALARY 
  3. WHERE ID IN(SELECT JID 
  4.             FROM JOB 
  5.             WHERE JB='Docter'); 

使用子查询查询薪水大于8000的员工的所有信息,首先内部查询薪水大于8000的ID,然后外部使用一个WHERE查询即可得到结果。

  1. SELECT * 
  2. FROM SALARY 
  3. WHERE ID IN (SELECT ID 
  4.              FROM SALARY 
  5.              WHERE SAL > 8000); 

作为计算字段使用子查询

使用子查询的另一方法是创建计算字段,创建计算字段需要使用聚合函数,例如count,sum,avg,max,min等,这里首先计算平均薪水作为一个内查询,然后在外部使用WHERE子句进行查询,得出薪资比平均薪资低的员工的所有信息。

  1. SELECT * 
  2. FROM SALARY 
  3. WHERE SAL < (SELECT AVG(SAL)  
  4.              FROM SALARY); 

除使用WHERE过滤,还可以使用HAVING过滤,HAVING子句对分组统计函数进行过滤,也可以在HAVING子句中使用子查询,要查询薪资最高的人及其薪资情况,首先内部查询最高工资,然后外部以人名分组后使用HAVING子句过滤,查询结果如下。

  1. SELECT NAME,SAL 
  2. FROM SALARY 
  3. GROUP BY NAME 
  4. HAVING SAL = (SELECT MAX(SAL)  
  5.               FROM SALARY); 

本文转载自微信公众号「大话数据分析」,作者「尚天强」。可以通过以下二维码关注。转载本文请联系大话数据分析公众号。

【编辑推荐】

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区
  2. MySQL 开源工具集合
  3. MySQL系列之执行SQL 语句时发生了什么?
  4. 7 个超实用的 MySQL 语句写法,让同事们眼前一亮!
  5. CPU 以及内存从哪些方面影响 MySQL 性能?
  6. 讲讲 MySQL 中的 WAL 策略和 CheckPoint 技术
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

带你轻松入门 RabbitMQ

带你轻松入门 RabbitMQ

轻松入门RabbitMQ
共4章 | loong576

18人订阅学习

数据湖与数据仓库的分析实践攻略

数据湖与数据仓库的分析实践攻略

助力现代化数据管理:数据湖与数据仓库的分析实践攻略
共3章 | 创世达人

10人订阅学习

云原生架构实践

云原生架构实践

新技术引领移动互联网进入急速赛道
共3章 | KaliArch

40人订阅学习

视频课程+更多

linux网络基础

linux网络基础

讲师:周玉强27402人学习过

以太坊源码定制国密与修改共识算法为dpos

以太坊源码定制国密与修改共识算法为dpos

讲师:水木未名533人学习过

渗透测试之信息收集

渗透测试之信息收集

讲师:Margin2860人学习过

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微