MySQL数据查询之子查询

MySQL数据查询之子查询

子查询是指一个查询语句嵌套在另一个查询语句内部的查询。在select子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。

子查询中常用的操作符有any(some)、all、in、exists。子查询可以添加到select、update和delete语句中,而且可以进行多层嵌套。子查询中也可以使用比较运算符,如”<","”,”>=“和”!=”。

(1)带any、some关键字的子查询
(2)带all关键字的子查询
(3)带exists关键字的子查询
(4)带in关键字的子查询
(5)带比较运算符的子查询

(免费学习推荐:mysql视频教程

(1)、带any、some关键字的子查询

any和some关键字是同义词,表示满足其中任一条件,允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。

下面定义两个表tbl1和tbl2,并向两个表中插入数据:

mysql> create table tbl1( num1 int not null);Query OK, 0 rows affected (0.13 sec)mysql> create table tbl2(num2 int not null);Query OK, 0 rows affected (0.10 sec)mysql> insert into tbl1 values(1),(5),(13),(27);Query OK, 4 rows affected (0.05 sec)Records: 4  Duplicates: 0  Warnings: 0mysql> insert into tbl2 values(6),(14),(11),(20);Query OK, 4 rows affected (0.06 sec)Records: 4  Duplicates: 0  Warnings: 0

any关键字接在一个比较操作符后面,表示若与子查询返回的任何职比较为true,则返回true。

【例】返回tbl2表的所有num2列,然后将tbl1中的num1的值与之进行比较,只要大于num2的任何一个值,即为符合条件的结果。

mysql> select num1 from tbl1 where num1 > any(select num2 from tbl2);+------+| num1 |+------+|   13 ||   27 |+------+2 rows in set (0.00 sec)
(2)、带all关键字的子查询

all关键字需要同时满足所有内层查询的条件。all关键字接在一个比较操作符后面,表示与子查询返回的所有值比较为true,则返回true。

【例】返回tbl1表中比tbl2表num2列所有值都大的值,SQL语句如下:

mysql> select num1 from tbl1 where num1 > all(select num2 from tbl2);+------+| num1 |+------+|   27 |+------+1 row in set (0.00 sec)
(3)、带exists关键字的子查询

exists关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么exists的结果为true,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么exists返回的结果是false,此时外层语句将不进行查询。

【例1】查询suppliers表中是否存在s_id=107的的供应商,如果存在,则查询fruits表中的记录,SQL语句如下:

mysql> select * from fruits    -> where exists    -> (select s_name from suppliers where s_id = 107);+------+------+------------+---------+| f_id | s_id | f_name     | f_price |+------+------+------------+---------+| 12   |  104 | lemon      |    6.40 || a1   |  101 | apple      |    5.20 || a2   |  103 | apricot    |    2.20 || b1   |  101 | blackberry |   10.20 || b2   |  104 | berry      |    7.60 || b5   |  107 | xxxx       |    3.60 || bs1  |  102 | orange     |   11.20 || bs2  |  105 | melon      |    8.20 || c0   |  101 | cherry     |    3.20 || m1   |  106 | mango      |   15.70 || m2   |  105 | xbabay     |    2.60 || m3   |  105 | xxtt       |   11.60 || o2   |  103 | coconut    |    9.20 || t1   |  102 | banana     |   10.30 || t2   |  102 | grape      |    5.30 || t4   |  107 | xbabay     |    3.60 |+------+------+------------+---------+16 rows in set (0.00 sec)

由结果可知,内层查询结果表明suppliers表中存在s_id=107的记录,因此exists表达式返回true;外层查询语句接收true之后对表fruits进行查询,返回所有记录。

【例2】查询suppliers表中是否存在s_id=107的供应商,如果存在,则查询fruits表中的f_price大于10.20的记录,SQL语句如下:

mysql> select * from fruits    -> where f_price > 10.20 and exists    -> (select s_name from suppliers where s_id = 107);+------+------+--------+---------+| f_id | s_id | f_name | f_price |+------+------+--------+---------+| bs1  |  102 | orange |   11.20 || m1   |  106 | mango  |   15.70 || m3   |  105 | xxtt   |   11.60 || t1   |  102 | banana |   10.30 |+------+------+--------+---------+4 rows in set (0.00 sec)

可以看到,内层查询表名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,此时外层语句将进行查询。

【例3】查询suppliers表中是否存在s_id =107的供应商,如果不存在就查询fruits表中的记录,SQL语句如下:

mysql> select * from fruits    -> where not exists    -> (select s_name from suppliers where s_id = 107);Empty set (0.00 sec)

可以看到,内层查询返回结果为false,外层表达式接收false将不再查询fruits表中的记录。

注意:exists 和 not exists的结果只取决于是否会返回行,而不取决于这些行的内容,所以这个子查询输入列表通常是无关紧要的。

(4)、带in关键字的子查询

in关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。

【例1】在orderitems表中查询f_id为c0的订单号,并根据订单号查询具有订单号的客户c_id,SQL语句如下:

mysql> select c_id from orders where o_num in    -> (select o_num from orderitems where f_id = 'c0');+-------+| c_id  |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)

上面的语句是下面查询方式的简写:

mysql> select o_num from orderitems where f_id = 'c0';+-------+| o_num |+-------+| 30003 || 30005 |+-------+2 rows in set (0.00 sec)mysql> select c_id from orders where o_num in (30003,30005);+-------+| c_id  |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)

下面介绍与in相反的not in关键字:

【例2】与例1类似,但select语句中使用not in 关键字。SQL语句如下:

mysql> select c_id from orders where o_num not in    -> (select o_num from orderitems where f_id ='c0');+-------+| c_id  |+-------+| 10001 || 10003 || 10005 |+-------+3 rows in set (0.00 sec)

可以看到返回了三个表,查看orders中的记录可知,c_id等于10001的客户的订单不止一个:

mysql> select * from orders;+-------+---------------------+-------+| o_num | o_date              | c_id  |+-------+---------------------+-------+| 30001 | 2008-09-01 00:00:00 | 10001 || 30002 | 2008-09-12 00:00:00 | 10003 || 30003 | 2008-09-30 00:00:00 | 10004 || 30004 | 2008-10-03 00:00:00 | 10005 || 30005 | 2008-10-08 00:00:00 | 10001 |+-------+---------------------+-------+5 rows in set (0.00 sec)

结果只是排除了订单号,但仍然有可能选择同一个客户。

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

(5)、带比较运算符的子查询

【例1】在suppliers表中查询s_city等于”Tianjin”的供应商s_id,然后在fruits表中查询所有该供应商提供的水果的种类,SQL语句如下:

mysql> select s_id,f_name from fruits    -> where s_id =    -> (select s1.s_id from suppliers as s1 where s1.s_city = 'Tianjin');+------+------------+| s_id | f_name     |+------+------------+|  101 | apple      ||  101 | blackberry ||  101 | cherry     |+------+------------+3 rows in set (0.00 sec)

【例2】在suppliers表中查询s_city等于”Tianjin”的供应商,s_id,然后在fruits表中查询所有非该供应商提供的水果的种类,SQL语句如下:

mysql> select s_id , f_name from fruits    -> where s_id     -> (select s1.s_id from suppliers as s1 where s1.s_city ='Tianjin');+------+---------+| s_id | f_name  |+------+---------+|  104 | lemon   ||  103 | apricot ||  104 | berry   ||  107 | xxxx    ||  102 | orange  ||  105 | melon   ||  106 | mango   ||  105 | xbabay  ||  105 | xxtt    ||  103 | coconut ||  102 | banana  ||  102 | grape   ||  107 | xbabay  |+------+---------+13 rows in set (0.00 sec)

更多相关免费学习推荐:mysql教程(视频)

以上就是MySQL数据查询之子查询的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/187943.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月1日 11:49:39
下一篇 2025年11月1日 11:50:01

相关推荐

  • MySQL ERROR 1045出现的原因及怎么解决

    在命令行输入mysql -u root –p,输入密码,或通过工具连接数据库时,经常出现下面的错误信息,相信该错误信息很多人在使用mysql时都遇到过。 ERROR 1045 (28000): Access denied for user ‘root’@’loca…

    2025年12月5日 数据库
    000
  • linux上安装docker容器和mysql镜像拉取的方法

    docker pull xxxx 拉取镜像 docker run -it xxxx /bin/bash 启动镜像 启动docker服务 docker ps 查询运行中的容器 docker ps -a 查询所有容器,包括未运行的 mysql容器启动:docker run -itd –nam…

    数据库 2025年12月5日
    000
  • ubuntu下mysql 8.0.28怎么安装配置

    修改密码改了挺长时间,记录下安装过程 安装ssh服务: sudo apt-get install openssh-server 启动ssh服务: service sshd start 安装mysql服务器端: sudo apt install -y mysql-server 安装mysql客户端: …

    2025年12月5日
    000
  • MySQL事件调度器如何使用_能实现哪些自动化任务?

    mysql事件调度器是内置的定时任务工具,用于自动化周期性操作。一、开启方法:用show variables查看event_scheduler状态,若为off则在配置文件添加event_scheduler=on或临时执行set global开启;二、创建语法:create event定义触发时间、频…

    2025年12月5日 数据库
    000
  • mysql临键锁如何使用

    1、默认情况下,innodb使用临键锁锁定记录。 select … for update 2、当查询索引包含唯一属性时,临键锁将被优化并降级为记录锁,即只锁定索引本身,而不是范围。 3、不同场景下的临键锁会退化。 实例 事务1 start transaction;select SLEEP(4);…

    数据库 2025年12月5日
    000
  • MySQL命令行中如何修改MySQL密码

    方法一: mysql admin -u 用户名 -p 旧密码 passw 新密码 ‘u’为 username 的简称,‘p’为原 password 简称。 方法二: 我们先登录 MySQL 数据库。之后输入: mysql>set password for root@localhost = pa…

    数据库 2025年12月5日
    000
  • MySQL8如何设置自动创建时间和自动更新时间

    业务场景: 1、在数据库表中的数据,要求记录每一条新增数据的创建时间,时间格式要求明确至:年月日:时分秒。 2、在数据库表中的数据,要求记录每一条更新数据的更新时间,时间格式要求明确至:年月日:时分秒。 功能实现: 1、为每张业务表添加create_time 和update_time 字段,且将字段…

    数据库 2025年12月5日
    000
  • mysql InnoDB的四种锁定范围是什么

    1、记录锁,锁定索引中的记录。 2、间隙锁。 要么锁定索引记录中间的值,要么锁定第一个索引记录前面的值,要么锁定最后一个索引记录后面的值。 3、临键锁,是索引记录上的记录锁和索引记录前的间隙锁的组合。 4、插入意向锁,在insert操作中添加记录id的锁。 实例 — id 列为主键列或唯一索引列U…

    数据库 2025年12月5日
    000
  • MySQL中FROM_DAYS函数怎么用

    FROM_DAYS(date) SELECT FROM_DAYS(367) -> 0001-01-02 返回西元0年至今多少天的DATE值 以上就是MySQL中FROM_DAYS函数怎么用的详细内容,更多请关注创想鸟其它相关文章!

    数据库 2025年12月5日
    000
  • rocks mysql数据库多实例数据库配置的示例分析

    mysql数据库默认路径修改 启动httpd服务 mkdir -p /run/httpdsystemctl start httpd.service 1.什么是多实例? 在linux系统中代表:多个进程+多个线程+多个预分配内存结构 一般用来测试环境中,测试主从,高可用等。 多实例配置方案:(多个数据…

    数据库 2025年12月5日
    000
  • Linux怎样查看mysql密码

    相信很多小伙伴都经历过忘记密码,如果在Linux下忘记MySQL密码该怎么办? Linux查看mysql密码具体方法。 查看默认密码 grep ‘temporary password’ /var/log/mysqld.log 或者 cat /var/log/mysqld.log | grep ‘te…

    数据库 2025年12月5日
    000
  • MySQL数据库的基本操作实例分析

    一、MySQL简介 1、数据库管理软件分类 主要分为关系型和非关系型。 可以简单的理解为,关系型数据库需要有表结构,非关系型数据库是key-value存储的,没有表结构。 关系型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql语句通用。 非关系型…

    数据库 2025年12月5日
    000
  • mysql内连接查询实例分析

    1、分为隐式内连接查询和显示内连接查询,通过是否包含inner join关键字进行区别。 2、主表和从表中的数据都是满足连接条件则能够查询出来,不满足连接条件则不会查询出来。 实例 — 2.1 隐式内连接方式select *from t_category c, t_product p WHERE …

    数据库 2025年12月5日
    000
  • MySQL中binlog/redolog/undolog区别是什么

    MySQL binlog/redolog/undolog 的区别? 想和大家聊聊 innodb 中的锁机制,那么不可避免的要涉及到 mysql 的日志系统,binlog、redo log、undo log 等,看到有小伙伴总结的这三个日志还不错,赶紧拿来和各位小伙伴分享。 日志是mysql数据库的重…

    2025年12月5日 数据库
    000
  • phpstudy安装后mysql无法启动如何解决

    原因分析 我去网上查找phpstudy和mysql冲突的问题, 哦原来是 这两个mysql都占用的是3306端口, 而系统原来的mysql会开机启动(就是这里,会让原来的mysql作为服务开机启动监听)。那么当你打开phpstudy的时候, 便会再启动一个mysql服务,这个时候因为是同一个端口的关…

    2025年12月5日
    000
  • MySQL与PHP中的内置函数怎么用

    MySQL 内置函数 mysql 内置函数可以帮助我们更方便的处理表中的数据, 简化操作. 数学函数: 函数 描述 ABS()取绝对值SQRT()取根号MOD()取模FLOOR()返回不大于的最大整数值CELLING()返回不小于的最小整数值ROUND()四舍五入SIN()取正弦COS()取余弦 字…

    2025年12月5日
    000
  • 怎么在MySQL中设置时间

    MySQL支持多种时间格式,其中包括DATE、TIME、DATETIME和TIMESTAMP。这四种格式都有其特定的用途。 DATE格式表示日期,格式为“YYYY-MM-DD”,其中“YYYY”表示年份,“MM”表示月份,“DD”表示日期。 TIME格式表示时间,格式为“HH:MM:SS”,其中“H…

    数据库 2025年12月5日
    000
  • 如何安装和配置ThinkPHP开发环境?

    如何安装和配置thinkphp开发环境?首先,安装php 7.2+和web服务器(如xampp或wamp);其次,使用composer安装thinkphp框架;最后,配置应用和web服务器指向thinkphp的public目录。 在开始我们的ThinkPHP之旅前,让我们先回答一个关键问题:如何安装…

    2025年12月5日
    000
  • mysql左外连接查询的语法是什么

    1、以join左表为主表,显示主表的所有数据,并根据条件查询连接右表的数据。如果满足条件,则显示;如果不满足,则显示为null。 2、可以理解为在内部连接的基础上,确保左表的所有数据都显示。 语法 select 字段 from a left [outer] join b on 条件 实例 使用左连接…

    数据库 2025年12月5日
    000
  • 基于springboot+bootstrap+mysql+redis怎么搭建完整的权限架构

           首先将已经封装好的bootstrap脚本引入到我们现有的工程,目录如下:        到此我们的bootstraop框架引入完成,那么基于bootstrap框架我们现在开始开发属于我们的第一个bootstrap页面登陆页,打开我们的templates文件在底下找到我们login.ht…

    2025年12月5日 数据库
    100

发表回复

登录后才能评论
关注微信