子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入,在 SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。

子查询中常用的操作符有 ANY(SOME)、ALL、IN 和 EXISTS。

子查询可以添加到 SELECT、UPDATE 和 DELETE 语句中,而且可以进行多层嵌套。子查询也可以使用比较运算符,如“”、“>=”、“!=”等。

子查询中常用的运算符

一、 IN子查询

结合关键字 IN 所使用的子查询主要用于判断一个给定值是否存在于子查询的结果集中。其语法格式为:

[NOT] IN

语法说明如下。

1、:用于指定表达式。当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回的值正好相反。

2、:用于指定子查询。这里的子查询只能返回一列数据。对于比较复杂的查询要求,可以使用 SELECT 语句实现子查询的多层嵌套。

二、比较运算符子查询

比较运算符所使用的子查询主要用于对表达式的值和子查询返回的值进行比较运算。其语法格式为:

{= | < | > | >= | <= | <=> | <> | != }

{ ALL | SOME | ANY}

语法说明如下。

1、:用于指定子查询。

2、:用于指定要进行比较的表达式。

3、ALL、SOME 和 ANY:可选项。用于指定对比较运算的限制。其中,关键字 ALL 用于指定表达式需要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较关系时,会返回 TRUE,否则返回 FALSE;关键字 SOME 和 ANY 是同义词,表示表达式只要与子查询结果集中的某个值满足比较关系,就返回 TRUE,否则返回 FALSE。

三、 EXIST子查询

关键字 EXIST 所使用的子查询主要用于判断子查询的结果集是否为空。其语法格式为:

EXIST

若子查询的结果集不为空,则返回 TRUE;否则返回 FALSE。

子查询的应用

【实例 1】在 测试表2 表中查询 dept_type 为 A 的学院 ID,并根据学院 ID 查询该学院学生的名字,输入的 SQL 语句和执行结果如下所示。

mysql> SELECT name FROM 测试表1 WHERE dept_id IN (SELECT dept_id FROM 测试表2 WHERE dept_type= 'A' );

+-------+

| name  |

+-------+

| Dany  |

| Henry |

| Jane  |

| Jim   |

| John  |

+-------+

5 rows in set (0.01 sec)

上述查询过程可以分步执行,首先内层子查询查出 测试表2 表中符合条件的学院 ID,单独执行内查询,查询结果如下所示。

mysql> SELECT dept_id FROM 测试表2 WHERE dept_type='A';

+---------+

| dept_id |

+---------+

|       1 |

|       2 |

+---------+

2 rows in set (0.00 sec)

可以看到,符合条件的 dept_id 列的值有两个:1 和 2。然后执行外层查询,在 测试表1 表中查询 dept_id 等于 1 或 2 的学生的名字。嵌套子查询语句还可以写为如下形式,可以实现相同的效果。

mysql> SELECT name FROM 测试表1 WHERE dept_id IN(1,2);

+-------+

| name  |

+-------+

| Dany  |

| Henry |

| Jane  |

| Jim   |

| John  |

+-------+

5 rows in set (0.03 sec)

上例说明在处理 SELECT 语句时,MySQL 实际上执行了两个操作过程,即先执行内层子查询,再执行外层查询,内层子查询的结果作为外部查询的比较条件。

【实例 2】与前一个例子类似,但是在 SELECT 语句中使用 NOT IN 关键字,输入的 SQL 语句和执行结果如下所示。

mysql> SELECT name FROM 测试表1 WHERE dept_id NOT IN (SELECT dept_id FROM 测试表2 WHERE dept_type='A');

+--------+

| name   |

+--------+

| Green  |

| Lily   |

| Susan  |

| Thomas |

| Tom    |

+--------+

5 rows in set (0.04 sec)

提示:子查询的功能也可以通过连接查询完成,但是子查询使得 MySQL 代码更容易阅读和编写。

【实例 3】在 测试表2 表中查询 dept_name 等于“Computer”的学院 id,然后在 测试表1 表中查询所有该学院的学生的姓名,输入的 SQL 语句和执行过程如下所示。

mysql> SELECT name FROM 测试表1 WHERE dept_id =(SELECT dept_id FROM 测试表2 WHERE dept_name='Computer');

+------+

| name |

+------+

| Dany |

| Jane |

| Jim  |

+------+

3 rows in set (0.00 sec)

【实例 4】在 测试表2 表中查询 dept_name 不等于“Computer”的学院 id,然后在 测试表1 表中查询所有该学院的学生的姓名,输入的 SQL 语句和执行过程如下所示。

mysql> SELECT name FROM 测试表1 WHERE dept_id<>(SELECT dept_id FROM 测试表2 WHERE dept_name='Computer');

+--------+

| name   |

+--------+

| Green  |

| Henry  |

| John   |

| Lily   |

| Susan  |

| Thomas |

| Tom    |

+--------+

7 rows in set (0.00 sec)

【实例 5】查询 测试表2 表中是否存在 dept_id=1 的供应商,如果存在,就查询 测试表1 表中的记录,输入的 SQL 语句和执行结果如下所示。

mysql> SELECT * FROM 测试表1 WHERE EXISTS (SELECT dept_name FROM 测试表2 WHERE dept_id=1);

+----+--------+---------+------+------+--------+------------+

| id | name   | dept_id | age  | sex  | height | login_date |

+----+--------+---------+------+------+--------+------------+

|  1 | Dany   |       1 |   25 | F    |    160 | 2015-09-10 |

|  2 | Green  |       3 |   23 | F    |    158 | 2016-10-22 |

|  3 | Henry  |       2 |   23 | M    |    185 | 2015-05-31 |

|  4 | Jane   |       1 |   22 | F    |    162 | 2016-12-20 |

|  5 | Jim    |       1 |   24 | M    |    175 | 2016-01-15 |

|  6 | John   |       2 |   21 | M    |    172 | 2015-11-11 |

|  7 | Lily   |       6 |   22 | F    |    165 | 2016-02-26 |

|  8 | Susan  |       4 |   23 | F    |    170 | 2015-10-01 |

|  9 | Thomas |       3 |   22 | M    |    178 | 2016-06-07 |

| 10 | Tom    |       4 |   23 | M    |    165 | 2016-08-05 |

+----+--------+---------+------+------+--------+------------+

10 rows in set (0.00 sec)

由结果可以看到,内层查询结果表明 测试表2 表中存在 dept_id=1 的记录,因此 EXSTS 表达式返回 TRUE,外层查询语句接收 TRUE 之后对表 测试表1 进行查询,返回所有的记录。

EXISTS 关键字可以和条件表达式一起使用。

【实例 6】查询 测试表2 表中是否存在 dept_id=7 的供应商,如果存在,就查询 测试表1 表中的记录,输入的 SQL 语句和执行结果如下所示。

mysql> SELECT * FROM 测试表1 WHERE EXISTS (SELECT dept_name FROM 测试表2 WHERE dept_id=7);

Empty set (0.00 sec)

mysql 分号子查询_MySQL子查询详解相关推荐

  1. mysql rand() 子查询_MySQL ------ 子查询(十三)

    查询(query):任何SQL 都是查询,但此术语一般指select 语句 子查询(subquery):嵌套在查询中的查询,MySQL4.1 引入对子查询的支持. 接下来得就比较有意思了,需要你对于表 ...

  2. mysql 什么是子查询_MySQL 子查询

    什么是子查询 为什么要使用子查询 子查询的分类 怎样使用子查询 关联子查询 要使用的数据表 image.png 1. 什么是子查询? 子查询顾名思义就是在正常查询之前先查询出来一条数据或者一个表. 子 ...

  3. mysql分表全局查询_mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表...

    之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...

  4. mysql useing查询_mysql explain语法详解--优化你的查询

    先解析一条sql语句,看出现什么内容 EXPLAINSELECTs.uid,s.username,s.name,f.email,f.mobile,f.phone,f.postalcode,f.addr ...

  5. mysql not exists 用法_mysql 子查询 exists 和 not exists使用方法和实例

    MySQL EXISTS 和 NOT EXISTS 介绍 SELECT ... FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询的数据,放到子查询中做条 ...

  6. mysql的where子查询_mysql子查询

    原标题:mysql子查询 一.mysql子查询基本知识 子查询就是在原有的查询语句中,嵌入新的查询,来得到我们想要的结果集. 子查询一般分为:where型子查询.from型子查询和exists型子查询 ...

  7. mysql 优化子查询_MySQL子查询的优化

    一.MySQL子查询的位置当一个查询是另一个查询的子部分是,称之为子查询(查询语句中嵌套含有查询语句).子查询也是使用频率比较高的一种查询类型.因此,优化 一.MySQL子查询的位置 当一个查询是另一 ...

  8. mysql limit 后子查询_Mysql子查询用limit

    执行带有Limit子查询是有问题的: SELECT * FROM task_and_device WHERE job_id IN (SELECT id FROM wx_device_task_job ...

  9. 如何查看mysql备份的情况_MySQL数据库备份详解(示例代码)

    原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...

最新文章

  1. Warning message:In a + b : longer object length is not a multiple of shorter object length
  2. 图像上添加噪声 并滤波
  3. HDU 4417 Super Mario(莫队 + 树状数组 + 离散化)
  4. org.hibernate.MappingException: Could not determine type for: java.util.List, at table: user, for...
  5. 是否可以改变 宏的值_宋轶白成一道光??抓住美白季你也可以
  6. hlg1492盒子【最小路径覆盖】
  7. 常见 CentOS 7 安装问题
  8. 百度地图InfoWindow弹窗圆角
  9. java 使用JEP 进行节点计算
  10. Wilcoxon符号秩+秩和检验学习[转载]
  11. CAD 2014 删除 Autodesk 360
  12. 基于Web的svg编辑器(2)——层次结构设计(DOM结构)
  13. SECS/GEM介绍
  14. Win10环境下VS2003安装教程
  15. UVA1389 Hard Life
  16. Gos —— 搭建基础环境
  17. AI行业全面复苏,秋招AI岗位竞争激烈!Tesra超算网络助力找到合适的岗位!
  18. 【20210910】【机器/深度学习】lightGBM模型训练中报错:“Cannot set reference after freed raw data“
  19. 真心话大冒险..你敢接吗?
  20. rnnlm源码分析(七)

热门文章

  1. Linux文件系统:Linux 内核文件描述符表的演变
  2. 2018.10.22 20:10
  3. 启动mysq服务_mysql安装、启动
  4. python之集合操作
  5. netty的channel介绍
  6. python四分位数_分位函数(四分位数)概念与pandas中的quantile函数
  7. AD19 add pins to nets错误_NGINX 502 Bad Gateway错误疑难解答
  8. Docker安装实践Jenkins
  9. 生成介于0.95-1的随机数MATLAB,matlab生成随机数函数
  10. OpenShift 4 - 对镜像进行合规扫描,加固应用镜像安全