在mysql中 使用in关键字实现子查询_MySQL 之子查询

本文详细介绍了在MySQL中如何使用子查询,特别是IN关键字,以及如何结合ANY/SOME、ALL、EXISTS等运算符进行比较和存在性查询。通过多个实例演示了子查询在SELECT、UPDATE和DELETE语句中的应用,展示了如何通过子查询简化和优化查询逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:

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

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

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

子查询常用的运算符:

1) IN子查询

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

[NOT] IN

语法说明如下。

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

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

2) 比较运算符子查询

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

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

{ ALL | SOME | ANY}

语法说明如下。

:用于指定子查询。

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

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

3) EXIST子查询

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

EXIST

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

应用举例说明

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

tb_students_info数据表内容查询如下:

cbba534a463e44736a66c0028adf2500.png

tb_departments表内容查询如下:

2cd4639dce2b2dec241a61aeaa0dc47b.png

实例1条件查询结果如下:

6105226b400df49fb3630301cabdda23.png

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

c7178b9e4d45f633bfa212c03cf16ab7.png

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

7cf9e9a66e427f01ae305fac394c111e.png

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

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

be0f3955f7cbb63a631114271c145242.png

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

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

d3a4e37b67edc303f1d8799de731a287.png

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

4af20befed4fd118eb0ef3824bcca0ad.png

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

22b7281d689ea1550184f8ab025a69ba.png

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

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

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

ba060a13fab6627b1a448813263165de.png

由结果可以看到,内层查询结果表明 tb_departments 表中不存在 dept_id=10的记录,因此 EXSTS 表达式返回 FALSE,外层查询语句接收 FALSE之后对表 tb_students_info 进行查询,返回空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值