iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL子查询(嵌套查询)
  • 124
分享到

MySQL子查询(嵌套查询)

mysql数据库sqlPoweredby金山文档 2023-09-04 20:09:14 124人浏览 安东尼
摘要

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

子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 Mysql 4.1 开始引入。 在SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一 个表或者多个表。子查询中常用的操作符有 ANY(SOME)、ALL、IN、EXISTS。子查询可以添 加到 SELECT、UPDATE 和 DELETE 语句中,而且可以进行多层嵌套。子查询中也可以使用比较 运算符,如“<”“<=”“>”“>=”和“!=”等。下面将介绍如何在 SELECT 语句中嵌套子查询。

  1. ANY、SOME 关键字的子查询

ANY 和 SOME 关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询 的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查 询的条件。 下面定义两个表 tbl1 和 tbl2:

CREATE table tbl1 ( num1 INT NOT NULL);CREATE table tbl2 ( num2 INT NOT NULL);

分别向两个表中插入数据:

INSERT INTO tbl1 values(1), (5), (13), (27);INSERT INTO tbl2 values(6), (14), (11), (20);

ANY 关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为 TRUE,则返 回 TRUE。 返回 tbl2 表的所有 num2 列,然后将 tbl1 中的 num1 的值与之进行比较,只要大于 num2 的任何 1 个值,即为符合查询条件的结果。

SELECT num1 FROM tbl1 WHERE num1 > ANY (SELECT num2 FROM tbl2);

在子查询中,返回的是 tbl2 表的所有 num2 列结果(6,14,11,20),然后将 tbl1 中的 num1 列 的值与之进行比较,只要大于 num2 列的任意一个数即为符合条件的结果。

  1. 带 ALL 关键字的子查询

ALL 关键字与 ANY 和 SOME 不同,使用 ALL 时需要同时满足所有内层查询的条件。例如, 修改前面的例子,用 ALL 关键字替换 ANY。 ALL 关键字接在一个比较操作符的后面,表示与子查询返回的所有值比较为 TRUE,则返回 TRUE。 返回 tbl1 表中比 tbl2 表 num2 列所有值都大的值,sql 语句如下:

 SELECT num1 FROM tbl1 WHERE num1 > ALL (SELECT num2 FROM tbl2);

在子查询中,返回的是 tbl2 的所有 num2 列结果(6,14,11,20),然后将 tbl1 中的 num1 列 的值与之进行比较,大于所有 num2 列值的 num1 值只有 27,因此返回结果为 27。

  1. 带 EXISTS 关键字的子查询

EXISTS 关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回 行,如果至少返回一行,那么 EXISTS 的结果为 true,此时外层查询语句将进行查询;如果子查询 没有返回任何行,那么 EXISTS 返回的结果是 false,此时外层语句将不进行查询。 查询 suppliers 表中是否存在 s_id=107 的供应商,如果存在,则查询 fruits 表中的 记录,SQL 语句如下:

SELECT * FROM fruits WHERE EXISTS (SELECT s_name FROM suppliers WHERE s_id = 107);

由结果可以看到,内层查询结果表明 suppliers 表中存在 s_id=107 的记录,因此 EXISTS 表达 式返回 true;外层查询语句接收 true 之后对表 fruits 进行查询,返回所有的记录。 EXISTS 关键字可以和条件表达式一起使用。 查询 suppliers 表中是否存在 s_id=107 的供应商,如果存在,则查询 fruits 表中的 f_price 大于 10.20 的记录,SQL 语句如下:

SELECT * FROM fruits WHERE f_price>10.20 AND EXISTS (SELECT s_name FROM suppliers WHERE s_id = 107); 

由结果可以看到,内层查询结果表明 suppliers 表中存在 s_id=107 的记录,因此 EXISTS 表达 式返回 true;外层查询语句接收 true 之后根据查询条件 f_price > 10.20 对 fruits 表进行查询,返回 结果为 4 条 f_price 大于 10.20 的记录。 NOT EXISTS 与 EXISTS 使用方法相同,返回的结果相反。子查询如果至少返回一行,那么 NOT EXISTS 的结果为 false,此时外层查询语句将不进行查询;如果子查询没有返回任何行,那 么 NOT EXISTS 返回的结果是 true,此时外层语句将进行查询。 查询 suppliers 表中是否存在 s_id=107 的供应商,如果不存在则查询 fruits 表中的 记录,SQL 语句如下:

 SELECT * FROM fruits WHERE NOT EXISTS (SELECT s_name FROM suppliers WHERE s_id = 107);

查询语句 SELECT s_name FROM suppliers WHERE s_id = 107,对 suppliers 表进行查询返回了 一条记录,NOT EXISTS 表达式返回 false,外层表达式接收 false,将不再查询 fruits 表中的记录。 提 示 :EXISTS 和 NOT EXISTS 的结果只取决于是否会返回行,而不取决于这些行的内容,所 以这个子查询输入列表通常是无关紧要的。

  1. 带 IN 关键字的子查询

IN 关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外 层查询语句进行比较操作。 在 orderitems 表中查询 f_id 为 c0 的订单号,并根据订单号查询具有订单号的客户 c_id,SQL 语句如下:

 SELECT c_id FROM orders WHERE o_num IN (SELECT o_num FROM orderitems WHERE f_id = 'c0');

查询结果的 c_id 有两个值,分别为 10001 和 10004。上述查询过程可以分步执行,首先内层 子查询查出 orderitems 表中符合条件的订单号,单独执行内查询,查询结果如下:

SELECT o_num FROM orderitems WHERE f_id = 'c0';

可以看到,符合条件的 o_num 列的值有两个:30003 和 30005,然后执行外层查询,在 orders 表中查询订单号等于 30003 或 30005 的客户 c_id。嵌套子查询语句还可以写为如下形式,实现相同 的效果:

 SELECT c_id FROM orders WHERE o_num IN (30003, 30005);

这个例子说明在处理 SELECT 语句的时候,mysql 实际上执行了两个操作过程,即先执行内 层子查询,再执行外层查询,内层子查询的结果作为外部查询的比较条件。 SELECT 语句中可以使用 NOT IN 关键字,其作用与 IN 正好相反。 与前一个例子类似,但是在 SELECT 语句中使用 NOT IN 关键字,SQL 语句如下:

SELECT c_id FROM orders WHERE o_num NOT IN (SELECT o_num FROM orderitems WHERE f_id = 'c0');

这里返回的结果有 3 条记录,由前面可以看到,子查询返回的订单值有两个,即 30003 和 30005, 但为什么这里还有值为 10001 的 c_id 呢?这是因为 c_id 等于 10001 的客户的订单不只一个,可以 查看订单表 orders 中的记录。

SELECT * FROM orders;

可以看到,虽然排除了订单号为 30003 和 30005 的客户 c_id,但是 o_num 为 30001 的订单与 30005 都是 10001 号客户的订单。所以结果中只是排除了订单号,但是仍然有可能选择同一个客户。

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

  1. 带比较运算符的子查询

在前面介绍的带 ANY、ALL 关键字的子查询时使用了“>”比较运算符,子查询时还可以使 用其他的比较运算符,如“<”“<=”“=”“>=”和“!=”等。 在 suppliers 表中查询 s_city 等于“Tianjin”的供应商 s_id,然后在 fruits 表中查询 所有该供应商提供的水果的种类,SQL 语句如下:

SELECT s_id, f_name FROM fruits WHERE s_id =(SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'Tianjin'); 

该嵌套查询首先在 suppliers 表中查找 s_city 等于 Tianjin 的供应商的 s_id,单独执行子查询查 看 s_id 的值,执行下面的操作过程:

 SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'Tianjin';

然后在外层查询时,在 fruits 表中查找 s_id 等于 101 的供应商提供的水果的种类,查询结果如 下:

SELECT s_id, f_name FROM fruits WHERE s_id = (SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'Tianjin');

结果表明,“Tianjin”地区的供应商提供的水果种类有 3 种,分别为“apple”“blackberry” “cherry”。 在 suppliers 表中查询 s_city 等于“Tianjin”的供应商 s_id,然后在 fruits 表中查询 所有非该供应商提供的水果的种类,SQL 语句如下:

SELECT s_id, f_name FROM fruits WHERE s_id <> (SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'Tianjin');

该嵌套查询执行过程与前面相同,在这里使用了不等于“<>”运算符,因此返回的结果和前 面正好相反。

来源地址:https://blog.csdn.net/weixin_45392969/article/details/129729763

您可能感兴趣的文档:

--结束END--

本文标题: MySQL子查询(嵌套查询)

本文链接: https://www.lsjlt.com/news/394232.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL子查询(嵌套查询)
    子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入。 在SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一 个表或者多个表。子查询中常用的操作符有 AN...
    99+
    2023-09-04
    mysql 数据库 sql Powered by 金山文档
  • MySQL基础篇 | 连接查询、子查询(嵌套)
    ✅作者简介:大家好我是@每天都要敲代码,希望一起努力,一起进步! 📃个人主页:@每天都要敲代码的个人主页 🔥系列专栏:MySQL专栏 目录 一:连接查询 1. 连接查询原理以及笛卡尔积现象 2. 内连接...
    99+
    2023-10-23
    数据库 sql
  • MySQL嵌套查询实现子查询的方法
    目录一个查询语句嵌套在另一个查询语句内部的查询1.带ANY(SOME)关键字的子查询2.带ALL关键字的子查询3.带EXISTS关键字的子查询4.带IN关键字的子查询5.带比较运算符...
    99+
    2024-04-02
  • 详解MySQL子查询(嵌套查询)、联结表、组合查询
    一、子查询 MySQL 4.1版本及以上支持子查询 子查询:嵌套在其他查询中的查询。 子查询的作用: 1、进行过滤: 实例1:检索订购物品TNT2的所有客户的ID = + 一般,在WHERE...
    99+
    2024-04-02
  • Mysql中的嵌套子查询问题
    目录Mysql嵌套子查询在WHERE子句中使用子查询单行单列子查询单行多列子查询。多行单列子查询FROM子查询:总结:select子查询用子查询用子查询Mysql嵌...
    99+
    2024-04-02
  • SpringBoot之QueryDsl嵌套子查询问题
    目录QueryDsl嵌套子查询这是MyBatis的查询格式这是JPA的QueryDsl格式需要注意的是还可以通过占位符的样式来写总结QueryDsl嵌套子查询 我项目中要求所有的SQ...
    99+
    2023-03-15
    SpringBoot QueryDsl QueryDsl嵌套子查询 SpringBoot嵌套子查询
  • nodejs查询json嵌套
    在前后端分离的项目中,常常需要前端向后端发送json数据,后端通过对json的操作进行数据处理后再返回给前端。而在这个过程中,涉及到对json数据的查询和嵌套查询,这也是nodejs常见的操作之一。在nodejs中,使用JSON对象可以方便...
    99+
    2023-05-23
  • thinkphp:数据库查询二,嵌套别的表的查询(别的表做子查询)
     例子 从 vendors 表中选择记录。在 vendors 表中,筛选出具有满足以下条件的 vendor_code 值: 对应的采购订单(在 po_headers_all 表中)存在未完全接收的采购行(在 po_lines_all 表...
    99+
    2023-09-13
    数据库 sql php
  • 怎么分析Mysql中的嵌套子查询问题
    小编今天带大家了解怎么分析Mysql中的嵌套子查询问题,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“怎么分析Mysql中的嵌套子查询...
    99+
    2023-06-29
  • Mysql---子查询的三种查询方式( 表子查询,条件子查询,列中子查询)
    mysql子查询 子查询分为: 列中子查询 单列单行表子查询 必须有别名条件子查询 单行单列 多行单列 下列示例表结构: grade表: result表: student表: subject表:...
    99+
    2023-09-04
    mysql sql 数据库
  • MySQL子查询详解(单行子查询、多行子查询与相关子查询)
    目录0.概念1.需求分析与问题解决1.1提出具体问题:1.2 子查询的基本使用: 子查询的基本语法结构:1.3 子查询的分类2.单行子查询2.1实例:2.2空值问题2.3非法使用子查...
    99+
    2024-04-02
  • MyBatis的嵌套查询解析
    Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-many、many-to-one、one-to-one。而是只有两种association(一)、collection(多),表现很简洁。下面通过一个实例,来展...
    99+
    2023-05-31
    mybatis 嵌套 查询
  • mysql中有没有嵌套查询语句
    本文小编为大家详细介绍“mysql中有没有嵌套查询语句”,内容详细,步骤清晰,细节处理妥当,希望这篇“mysql中有没有嵌套查询语句”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2024-04-02
  • MYSQL——子查询
       MYSQL的子查询1   求平均值   SELECT AVG (字段 如good_price) FROM  tdb_表名;...
    99+
    2024-04-02
  • mysql嵌套查询语句实例分析
    这篇文章主要讲解了“mysql嵌套查询语句实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql嵌套查询语句实例分析”吧! ...
    99+
    2024-04-02
  • Ent 查询中的嵌套聚合
    php小编苹果在本文中将为大家介绍“Ent 查询中的嵌套聚合”。在数据查询和分析中,嵌套聚合是一种强大的技术,可以在一个查询中进行多个层级的聚合操作。通过使用嵌套聚合,我们可以更加灵活...
    99+
    2024-02-09
  • SQLServer数据库中怎么实现嵌套子查询
    本篇文章给大家分享的是有关SQLServer数据库中怎么实现嵌套子查询,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  如何使用SQLServ...
    99+
    2024-04-02
  • SpringBoot之QueryDsl嵌套子查询问题怎么解决
    今天小编给大家分享一下SpringBoot之QueryDsl嵌套子查询问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-05
  • SQL 嵌套查询的具体使用
    目录插入数据  select子查询(外语句先执行,内语句后执行)总结嵌套查询又称子查询,有select子查询,where子查询,from子查询,exists子查询。 插入数据&nb...
    99+
    2023-01-28
    SQL嵌套查询
  • mysql多层嵌套查询的方法是什么
    在MySQL中,多层嵌套查询可以通过子查询或联合查询来实现。以下是两种常用的多层嵌套查询方法: 使用子查询: SELECT...
    99+
    2024-04-11
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作