MySQL讲义第 30 讲——select 查询之子查询

文章目录

  • MySQL讲义第 30 讲——select 查询之子查询
    • 一、标量子查询
      • 1、查询高于所有员工平均工资的员工信息
      • 2、查询工资比王涛的工资还低的员工信息
      • 3、查询工资最高的员工信息
    • 二、列子查询
      • 1、查询比财务部所有员工的工资都高的员工的信息
      • 2、查询比财务部任意一个员工的工资高的员工的信息
    • 三、表子查询
    • 四、exists 子查询
      • 1、查询有学生的系的信息
      • 2、查询没有学生的系的信息

在一个 select 语句中嵌入另外一个 select 语句,被嵌入的 select 语句称之为子查询。子查询要么充当条件,要么充当主查询的数据源。根据子查询返回的结果可以把子查询分为以下几类:
(1)标量子查询:子查询结果是一个数据(单行单列)。
(2)列子查询:子查询结果是一列(多行单列)。
(3)表子查询:子查询结果是一张临时表(多行多列)。
(4)exists 子查询:根据子查询是否有返回值决定主查询的返回结果。

一、标量子查询

标量子查询的结果是一个数据(单行单列)。一般和 =、>、<、>=、<=、!= 等操作符一起使用来构造主查询的条件。针对下面的员工(emp)表进行查询。

mysql> select * from emp;
+------+-----------+--------+---------+--------+-----------+
| e_id | e_name    | gender | salary  | leader | dept_name |
+------+-----------+--------+---------+--------+-----------+
| 1101 | 张美华    | 女     | 5000.00 |   1104 | 销售部    |
| 1102 | 王涛      | 男     | 5200.00 |   1104 | 销售部    |
| 1103 | 张学有    | 男     | 4700.00 |   1104 | 销售部    |
| 1104 | 刘得华    | 男     | 5200.00 |   1104 | 销售部    |
| 1105 | 董雯花    | 女     | 5900.00 |   1104 | 销售部    |
| 1106 | 宋族营    | 男     | 6500.00 |   1104 | 销售部    |
| 2201 | 李霜江    | 男     | 7200.00 |   2202 | 财务部    |
| 2202 | 梁美丽    | 女     | 6400.00 |   2202 | 财务部    |
| 2203 | 王大强    | 男     | 6100.00 |   2202 | 财务部    |
| 3301 | 张美华    | 女     | 7800.00 |   3302 | 技术部    |
| 3302 | 赵紫龙    | 男     | 6900.00 |   3302 | 技术部    |
| 3303 | 诸葛量    | 男     | 9200.00 |   3302 | 技术部    |
| 3304 | 曹梦德    | 男     | 8400.00 |   3302 | 技术部    |
+------+-----------+--------+---------+--------+-----------+
13 rows in set (0.00 sec)

1、查询高于所有员工平均工资的员工信息

mysql> SELECT-> *-> FROM-> emp-> WHERE-> salary > -> (SELECT avg(salary) FROM emp);
+------+-----------+--------+---------+--------+-----------+
| e_id | e_name    | gender | salary  | leader | dept_name |
+------+-----------+--------+---------+--------+-----------+
| 2201 | 李霜江    | 男     | 7200.00 |   2202 | 财务部    |
| 3301 | 张美华    | 女     | 7800.00 |   3302 | 技术部    |
| 3302 | 赵紫龙    | 男     | 6900.00 |   3302 | 技术部    |
| 3303 | 诸葛量    | 男     | 9200.00 |   3302 | 技术部    |
| 3304 | 曹梦德    | 男     | 8400.00 |   3302 | 技术部    |
+------+-----------+--------+---------+--------+-----------+
5 rows in set (0.02 sec)

2、查询工资比王涛的工资还低的员工信息

mysql> SELECT -> *-> FROM -> emp-> WHERE-> salary < -> (SELECT salary FROM emp WHERE e_name = '王涛');
+------+-----------+--------+---------+--------+-----------+
| e_id | e_name    | gender | salary  | leader | dept_name |
+------+-----------+--------+---------+--------+-----------+
| 1101 | 张美华    | 女     | 5000.00 |   1104 | 销售部    |
| 1103 | 张学有    | 男     | 4700.00 |   1104 | 销售部    |
+------+-----------+--------+---------+--------+-----------+
2 rows in set (0.00 sec)

3、查询工资最高的员工信息

mysql> SELECT-> *-> FROM -> emp-> WHERE -> salary = -> (SELECT min(salary) FROM emp);
+------+-----------+--------+---------+--------+-----------+
| e_id | e_name    | gender | salary  | leader | dept_name |
+------+-----------+--------+---------+--------+-----------+
| 1103 | 张学有    | 男     | 4700.00 |   1104 | 销售部    |
+------+-----------+--------+---------+--------+-----------+
1 row in set (0.02 sec)

二、列子查询

列子查询的结果是一列(多行单列),可以看成一个集合。一般搭配和 IN、ANY | SOME、ALL 等操作符一起使用。例如:

1、查询比财务部所有员工的工资都高的员工的信息

mysql> SELECT-> *-> FROM -> emp-> WHERE-> salary > ALL-> (SELECT salary FROM emp WHERE dept_name = '财务部');
+------+-----------+--------+---------+--------+-----------+
| e_id | e_name    | gender | salary  | leader | dept_name |
+------+-----------+--------+---------+--------+-----------+
| 3301 | 张美华    | 女     | 7800.00 |   3302 | 技术部    |
| 3303 | 诸葛量    | 男     | 9200.00 |   3302 | 技术部    |
| 3304 | 曹梦德    | 男     | 8400.00 |   3302 | 技术部    |
+------+-----------+--------+---------+--------+-----------+
3 rows in set (0.02 sec)--说明:以上查询等价于:
mysql> SELECT-> *-> FROM -> emp-> WHERE-> salary > -> (SELECT max(salary) FROM emp WHERE dept_name = '财务部');
+------+-----------+--------+---------+--------+-----------+
| e_id | e_name    | gender | salary  | leader | dept_name |
+------+-----------+--------+---------+--------+-----------+
| 3301 | 张美华    | 女     | 7800.00 |   3302 | 技术部    |
| 3303 | 诸葛量    | 男     | 9200.00 |   3302 | 技术部    |
| 3304 | 曹梦德    | 男     | 8400.00 |   3302 | 技术部    |
+------+-----------+--------+---------+--------+-----------+
3 rows in set (0.02 sec)

2、查询比财务部任意一个员工的工资高的员工的信息

mysql> SELECT-> *-> FROM -> emp-> WHERE-> salary > ANY-> (SELECT salary FROM emp WHERE dept_name = '财务部');
+------+-----------+--------+---------+--------+-----------+
| e_id | e_name    | gender | salary  | leader | dept_name |
+------+-----------+--------+---------+--------+-----------+
| 1106 | 宋族营    | 男     | 6500.00 |   1104 | 销售部    |
| 2201 | 李霜江    | 男     | 7200.00 |   2202 | 财务部    |
| 2202 | 梁美丽    | 女     | 6400.00 |   2202 | 财务部    |
| 3301 | 张美华    | 女     | 7800.00 |   3302 | 技术部    |
| 3302 | 赵紫龙    | 男     | 6900.00 |   3302 | 技术部    |
| 3303 | 诸葛量    | 男     | 9200.00 |   3302 | 技术部    |
| 3304 | 曹梦德    | 男     | 8400.00 |   3302 | 技术部    |
+------+-----------+--------+---------+--------+-----------+
7 rows in set (0.00 sec)--说明:以上查询等价于:
mysql> SELECT-> *-> FROM -> emp-> WHERE-> salary > -> (SELECT min(salary) FROM emp WHERE dept_name = '财务部');
+------+-----------+--------+---------+--------+-----------+
| e_id | e_name    | gender | salary  | leader | dept_name |
+------+-----------+--------+---------+--------+-----------+
| 1106 | 宋族营    | 男     | 6500.00 |   1104 | 销售部    |
| 2201 | 李霜江    | 男     | 7200.00 |   2202 | 财务部    |
| 2202 | 梁美丽    | 女     | 6400.00 |   2202 | 财务部    |
| 3301 | 张美华    | 女     | 7800.00 |   3302 | 技术部    |
| 3302 | 赵紫龙    | 男     | 6900.00 |   3302 | 技术部    |
| 3303 | 诸葛量    | 男     | 9200.00 |   3302 | 技术部    |
| 3304 | 曹梦德    | 男     | 8400.00 |   3302 | 技术部    |
+------+-----------+--------+---------+--------+-----------+
7 rows in set (0.00 sec)

三、表子查询

表子查询结果是一张临时表(多行多列),一般作为主查询的数据源。例如:查询比本部门平均工资高的员工的信息。

mysql> SELECT-> e.*,-> d.salary_avg-> FROM -> emp e JOIN (SELECT dept_name,avg(salary) salary_avg FROM emp GROUP BY dept_name) d -> ON e.dept_name = d.dept_name-> WHERE-> e.salary > d.salary_avg;
+------+-----------+--------+---------+--------+-----------+-------------+
| e_id | e_name    | gender | salary  | leader | dept_name | salary_avg  |
+------+-----------+--------+---------+--------+-----------+-------------+
| 1105 | 董雯花    | 女     | 5900.00 |   1104 | 销售部    | 5416.666667 |
| 1106 | 宋族营    | 男     | 6500.00 |   1104 | 销售部    | 5416.666667 |
| 2201 | 李霜江    | 男     | 7200.00 |   2202 | 财务部    | 6566.666667 |
| 3303 | 诸葛量    | 男     | 9200.00 |   3302 | 技术部    | 8075.000000 |
| 3304 | 曹梦德    | 男     | 8400.00 |   3302 | 技术部    | 8075.000000 |
+------+-----------+--------+---------+--------+-----------+-------------+
5 rows in set (0.00 sec)

四、exists 子查询

根据子查询是否有返回值决定主查询的返回结果。例如有以下两张表:

mysql> select * from dept;
+---------+--------------+
| dept_id | dept_name    |
+---------+--------------+
| D01     | 管理系       |
| D02     | 计算机系     |
| D03     | 数学系       |
| D04     | 法律系       |
| D05     | 艺术系       |
+---------+--------------+
5 rows in set (0.00 sec)mysql> select * from stu;
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| stu_id    | stu_name  | gender | birth               | height | phone       | dept_id |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
| 201801101 | 王占峰    | 男     | 1999-12-30 00:00:00 |  177.0 | 15937320987 | D02     |
| 201801102 | 刘国强    | 男     | 2000-08-14 00:00:00 |  174.0 | 15937320789 | D02     |
| 201801103 | 巩莉      | 女     | 2000-06-18 00:00:00 |  170.0 | 15937320456 | D02     |
| 201801104 | 宋丹风    | 女     | 1999-11-20 00:00:00 |  165.0 | 15937320444 | D02     |
| 201801201 | 王艳艳    | 女     | 1999-09-30 00:00:00 |  162.0 | NULL        | NULL    |
| 201801202 | 赵牡丹    | 女     | 2001-08-10 00:00:00 |  160.0 | 15937320666 | D03     |
| 201801203 | 王鹏飞    | 男     | 2000-10-19 00:00:00 |  174.0 | 15937320555 | D03     |
| 201901002 | 王宏伟    | 男     | 2001-02-15 00:00:00 |  180.0 | 15937320255 | D01     |
| 201901003 | 张静静    | 女     | 2001-08-17 00:00:00 |  167.0 | 15937320123 | D01     |
| 201901004 | 李刚      | 男     | 2000-12-25 00:00:00 |  178.0 | 15937320321 | D01     |
| 201901005 | 刘鹏      | 男     | 2001-12-18 00:00:00 |  176.0 | NULL        | D01     |
+-----------+-----------+--------+---------------------+--------+-------------+---------+
11 rows in set (0.00 sec)

1、查询有学生的系的信息

mysql> SELECT-> *-> FROM-> dept-> WHERE-> exists (SELECT * FROM stu WHERE dept_id = dept.dept_id);
+---------+--------------+
| dept_id | dept_name    |
+---------+--------------+
| D01     | 管理系       |
| D02     | 计算机系     |
| D03     | 数学系       |
+---------+--------------+
3 rows in set (0.00 sec)
--说明:把每一个系的系编号带入学生表,只要查询到一条记录,就表示该系有学生。

2、查询没有学生的系的信息

mysql> SELECT-> *-> FROM-> dept-> WHERE-> not exists (SELECT * FROM stu WHERE dept_id = dept.dept_id);
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
| D04     | 法律系    |
| D05     | 艺术系    |
+---------+-----------+
2 rows in set (0.00 sec)

MySQL讲义第 30 讲——select 查询之子查询相关推荐

  1. MySQL讲义第 41 讲——select 查询之函数(4):流程控制函数

    MySQL讲义第41讲--select 查询之函数(4):流程控制函数 文章目录 MySQL讲义第41讲--select 查询之函数(4):流程控制函数 一.数据准备 二.MySQL 流程控制函数介绍 ...

  2. MySQL讲义第 40 讲——select 查询之函数(3):数学函数

    MySQL讲义第40讲--select 查询之函数(3):数学函数 文章目录 MySQL讲义第40讲--select 查询之函数(3):数学函数 一.数据准备 二.MySQL 数学函数介绍 1.ABS ...

  3. MySQL讲义第 35 讲——select 查询之正则表达式

    MySQL讲义第 35 讲--select 查询之正则表达式 文章目录 MySQL讲义第 35 讲--select 查询之正则表达式 一.正则表达式匹配规则 二.数据准备 三.查询包含某些字符的字段信 ...

  4. MySQL讲义第 39 讲——select 查询之函数(2):日期时间型函数

    MySQL讲义第39讲--select 查询之函数(2):日期时间型函数 文章目录 MySQL讲义第39讲--select 查询之函数(2):日期时间型函数 一.数据准备 二.MySQL 日期时间型函 ...

  5. MySQL讲义第 33 讲——select 查询之静态交叉表查询

    MySQL讲义第 33 讲--select 查询之静态交叉表查询 文章目录 MySQL讲义第 33 讲--select 查询之静态交叉表查询 一.数据准备 二.交叉表的形式 三.静态交叉表的实现 1. ...

  6. MySQL讲义第27讲——select 查询之自连接查询

    MySQL讲义第27讲--select 查询之自连接查询 文章目录 MySQL讲义第27讲--select 查询之自连接查询 一.数据准备 二.对自连接的理解 三.把以上的查询用自连接表示 顾名思义, ...

  7. MySQL讲义第 32 讲——select 查询之 select 语句的执行顺序

    MySQL讲义第 32 讲--select 查询之 select 语句的执行顺序 文章目录 MySQL讲义第 32 讲--select 查询之 select 语句的执行顺序 一.SELECT 语句的语 ...

  8. MySQL讲义第 36 讲——select 查询之 INTO OUTFILE参数

    MySQL讲义第 36 讲--select 查询之 INTO OUTFILE参数 文章目录 MySQL讲义第 36 讲--select 查询之 INTO OUTFILE参数 一.SELECT ... ...

  9. MySQL讲义第 31 讲—— DML 语句与 select 查询

    MySQL讲义第 31 讲-- DML 语句与 select 查询 文章目录 MySQL讲义第 31 讲-- DML 语句与 select 查询 一. INSERT ... SELECT 语句 二.D ...

最新文章

  1. saltStack运维工具的部署及master迁移实现的过程详解
  2. kafka入门:简介、使用场景、设计原理、主要配置及集群搭建--转载
  3. Jenkins【环境搭建 01】两种方式+两种环境部署最新版本 Jenkins v2.303.2 WAR包(直接使用 java -jar+使用Tomcat的Web端部署)
  4. 【STM32】SPI简介
  5. 取消数据源的自动创建,使用Seata对数据源进行代理
  6. C++实现有向图最短路径-Dijkstra单源最短路径算法
  7. 自动配置jdk_JDK 15中自动自动发送更好的NullPointerException消息
  8. 代理模式用来初始化的延迟下载
  9. flask 上传头像
  10. 输出三角形字符阵列 (15 分)
  11. 本地储存数据_你的爬虫数据储存在哪?MongoDB入门篇
  12. 有关Silverlight3.0在浏览器外运行的问题
  13. C++STL优先队列小根堆大根堆自定义的应用
  14. matlab绘图颜色RGB
  15. [黑客光盘2009年更新]100张黑客光盘 数百G黑客资源~~~~~~~~~~~~~
  16. 3G爱立信告警信息提取
  17. 2021年美容师(初级)考试内容及美容师(初级)实操考试视频
  18. 网易AI工程师面试常见知识
  19. 二分法求三次方根代码
  20. 鸿蒙内核手机,华为和安卓说再见,推出鸿蒙内核手机,不再更新安卓

热门文章

  1. libcurl POST GET 完整步骤与源码
  2. Tableau实战 NBA赛事分析
  3. java线程同时执行_Java 多线程同时执行
  4. 企业数字化转型,财务应该做些什么?
  5. 极域电子教室的万能密码
  6. python学习框架图-Python Scrapy爬虫框架学习
  7. 普中单片机怎么接霍尔传感器_基于51单片机的数字测速系统的设计方案
  8. 使用Nessus进行漏洞扫描
  9. Android各种访问权限Permission详解
  10. 微型计算机原理daa,微机原理中十进制调整码DAA如何使?