iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL子查询Subquery语法介绍
  • 462
分享到

MySQL子查询Subquery语法介绍

2024-04-02 19:04:59 462人浏览 八月长安
摘要

下面讲讲关于Mysql子查询Subquery,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完mysql子查询Subquery这篇文章你一定会有所受益。子查询, 是指在sql语句中

下面讲讲关于Mysql子查询Subquery,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完mysql子查询Subquery这篇文章你一定会有所受益。

子查询, 是指在sql语句中内嵌了一个SELECT查询, 该SELECT称为内层查询, 包含SELECT的SQL称为外层查询. 其按照内层查询是否依赖于外层查询, 可以分为独立子查询和相关子查询.

为了演示方便, 有测试表tb1 和tb2, 数据如下:

mysql> SELECT * FROM tb1;

+------+

| col1 |

+------+

|   3 |

|   9 |

+------+

2 rows in set (0.00 sec)

 

mysql> SELECT * FROM tb2;

+------+

| col1 |

+------+

|   2 |

|   3 |

|   8 |

+------+

3 rows in set (0.00 sec)

 

独立子查询, 是指内层和外层查询没有关联,不用进行联合查询. 和其相关的有三组关键字: ANY/ IN/ SOME, ALL和EXISTS.

 

ANY/ IN/ SOME的语法是:

operand comparison_operator ANY (subquery)

operand IN (subquery)

operand comparison_operator SOME (subquery)

 

a. ANY关键字的含义是, 对于在子查询返回的列中的任一值, 如果表达式结果为TRUE的话, 则返回TRUE.

 

对于如下SQL, 表tb1包含(3, 9), tb2包含(2, 3, 8), 表达式结果为TRUE.

mysql> SELECT col1 FROM tb1 WHERE col1> ANY (SELECT col1 FROM tb2);

+------+

| col1 |

+------+

|   3 |

|   9 |

+------+

2 rows in set (0.00 sec)

 

b. 在子查询中, = ANY的别名是IN, 下面两个SQL返回是相同的.

mysql> SELECT col1 FROM tb1WHERE col1 = ANY (SELECT col1 FROM tb2);

+------+

| col1 |

+------+

|   3 |

+------+

1 row in set (0.00 sec)

 

mysql> SELECT col1 FROM tb1WHERE col1 IN (SELECT col1 FROM tb2);

+------+

| col1 |

+------+

|   3 |

+------+

1 row in set (0.00 sec)

 

c. ANY的别名是SOME, 下面两个SQL返回是相同的.

mysql> SELECT col1 FROM tb1WHERE col1 <> ANY (SELECT col1 FROM tb2);

+------+

| col1 |

+------+

|   3 |

|   9 |

+------+

2 rows in set (0.00 sec)

 

mysql> SELECT col1 FROM tb1WHERE col1 <> SOME (SELECT col1 FROM tb2);

+------+

| col1 |

+------+

|   3 |

|   9 |

+------+

2 rows in set (0.00 sec)

 

ALL的语法是:

operand comparison_operator ALL (subquery)

 

a. ALL关键字的含义是, 对于在子查询返回的列中的所有值, 如果表达式结果为TRUE的话, 则返回TRUE.

mysql> SELECT col1 FROM tb1WHERE col1 > ALL (SELECT col1 FROM tb2);

+------+

| col1 |

+------+

|   9 |

+------+

1 row in set (0.00 sec)

 

b. <> ALL的别名是NOT IN, 下面两个SQL返回是相同的.

mysql> SELECT col1 FROM tb1 WHERE col1 <> ALL (SELECT col1 FROM tb2);

+------+

| col1 |

+------+

|    9 |

+------+

1 row in set (0.00 sec)

 

mysql> SELECT col1 FROM tb1WHERE col1 NOT IN (SELECT col1 FROM tb2);

+------+

| col1 |

+------+

|    9 |

+------+

1 row in set (0.00 sec)

 

最后一组关键字是EXISTS.

 

a. EXISTS的含义是, 若子查询返回非空集, 则EXISTS为TRUE, NOT EXISTS为FALSE. 下面的SQL只是为了便于理解EXISTS,一般不这样用.

mysql>SELECT col1 FROM tb1 WHERE EXISTS (SELECT * FROMtb2);

+------+

| col1 |

+------+

|   3 |

|   9 |

+------+

  1. rows in set (0.00 sec)

 

b. 如下EXISTS子查询比较接近实际情况, 获取表tb1和tb2中相同的记录. 可以看到其内层关联了外层表,这也就是下面说的相关子查询.

mysql> SELECTcol1 FROM tb1 WHERE EXISTS (SELECT * FROM tb2 WHERE tb2.col1 = tb1.col1);

+------+

| col1 |

+------+

|   3 |

+------+

1 row in set (0.00 sec)

 

 

相关子查询, 是指内层查询需要和外层查询的表相关联, 进行联合查询. 在上面已经看到了相关子查询的例子, 仔细体会下其和独立子查询语法上的差异.

 

 

另外, 如上面的SELECT col1 FROM tb1 WHERE EXISTS (SELECT * FROM tb2WHERE tb2.col1 = tb1.col1), 是和再上面的SELECT col1 FROM tb1 WHERE col1 IN (SELECT col1 FROM tb2)等价的,即可将IN的独立子查询和EXISTS的相关子查询相互改写, 那么两者有什么不同呢 …

 

在表tb2中加入一条记录(NULL), 其数据如下, tb1的不变:

mysql> SELECT * FROM tb2;

+------+

| col1 |

+------+

|   2 |

|   3 |

|   8 |

| NULL |

+------+

4 rows in set (0.00 sec)

 

找出在表tb1, 不在tb2中的记录, 目测结果应为9, 但返回却为空.

mysql> SELECT * FROM tb1 WHERE col1 NOTIN (SELECT col1 FROM tb2);

Empty set (0.00 sec)

 

为什么呢, 测试如下, 原来在有NULL值的情况下, NOT IN只返回NOT TRUE和NULL, 即FALSE. 就是在NULL的情况下, NOT IN永远不会返回结果.

mysql> SELECT 'a' NOT IN ('a', 'b',NULL);

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

| 'a' NOT IN ('a', 'b', NULL) |

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

|                    0 |

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

1 row in set (0.00 sec)

 

mysql> SELECT 'c' NOT IN ('a', 'b',NULL);

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

| 'c' NOT IN ('a', 'b', NULL) |

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

|                 NULL |

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

1 row in set (0.00 sec)

 

若想NOT IN返回结果, 要先过滤掉NULL值, 这里也说明了不建议把数据存为NULL的原因.

mysql> SELECT * FROM tb1 WHERE col1 NOTIN (SELECT col1 FROM tb2 WHERE col1 IS NOT NULL);

+------+

| col1 |

+------+

|   9 |

+------+

1 row in set (0.00 sec)

 

使用EXISTS来写的话, 由于其是相关子查询,不用特殊考虑NULL的情况.

mysql> SELECT * FROM tb1 WHERE NOTEXISTS (SELECT col1 FROM tb2 WHERE tb2.col1 = tb1.col1);

+------+

| col1 |

+------+

|    9 |

+------+

1 row in set (0.00 sec)

  

对于子查询的性能优化, 以及改写为JOIN等, 稍后会进行整理, 感兴趣可关注订阅号”数据库最佳实践”(DBBestPractice).

对于以上MySQL子查询Subquery相关内容,大家还有什么不明白的地方吗?或者想要了解更多相关,可以继续关注我们的数据库板块。

 

您可能感兴趣的文档:

--结束END--

本文标题: MySQL子查询Subquery语法介绍

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

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

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

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

下载Word文档
猜你喜欢
  • MySQL子查询Subquery语法介绍
    下面讲讲关于MySQL子查询Subquery,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完MySQL子查询Subquery这篇文章你一定会有所受益。子查询, 是指在SQL语句中...
    99+
    2022-10-18
  • mysql的查询方法介绍
    本篇内容主要讲解“mysql的查询方法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql的查询方法介绍”吧!  本文主要介绍的是MySQL慢查询分析方...
    99+
    2022-10-18
  • mysql查询控制语句的介绍
    这篇文章主要讲解了“mysql查询控制语句的介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql查询控制语句的介绍”吧!mysql查询的控制语句字段去重**关键字:distinct*...
    99+
    2023-06-14
  • mysql数据库查询语句的语法格式介绍
    这篇文章给大家分享的是mysql数据库查询语句的语法格式的介绍。小编觉得挺实用的,因此分享给大家学习。如下资料是关于查询语句的语法格式的内容。mysql数据库使用SELECT语句来查询数据。通用语法...
    99+
    2022-10-18
  • 案例分析:mysql子查询,DEPENDENT SUBQUERY特别小心
    案例分析:开发提了个订正update数据的sql,一开始没注意看,就直接跑了,结果跑了半天,没动静,以为是在等锁,看线程状态是running的,那说明是没堵的,那就奇怪,为什么会跑半天,因为s...
    99+
    2022-10-18
  • MySQL实现多表查询语句介绍
    下面一起来了解下MySQL实现多表查询语句介绍,相信大家看完肯定会受益匪浅,文字在精不在多,希望MySQL实现多表查询语句介绍这篇短内容是你想要的。        &...
    99+
    2022-10-18
  • 举例介绍mysql多表查询方法
    本文主要给大家举例介绍mysql多表查询方法,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql多表查询方法吧。   &nb...
    99+
    2022-10-18
  • Mysql日期查询的详细介绍
    查询当前日期 SELECT CURRENT_DATE(); SELECT CURDATE(); 查询当前日期和时间 SELECT NOW(); 查询今天的数据 SELECT * FROM...
    99+
    2022-05-31
    Mysql 日期查询 Mysql 时间查询
  • mysql慢查询功能详细介绍
    这篇文章主要讲解了“mysql慢查询功能详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql慢查询功能详细介绍”吧!开启mysql慢查询日志1....
    99+
    2022-10-18
  • SQL数据查询之DQL语言介绍
    目录1.DQL类型的SQL语句基本概述2.准备一张可以练习查询的数据表3.DQL语句之简单的基础查询3.1.查询表中指定的多个字段的数据3.2.查询表中所有字段的数据3.3.查询表中数据时为字段设置别名3.4.查询表中所...
    99+
    2022-08-17
    SQL DQL数据查询 SQL DQL类型
  • mysql子查询语句怎么写
    小编给大家分享一下mysql子查询语句怎么写,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! mysql子查询语句是指在另一个查询语句中的SELECT子句...
    99+
    2022-10-19
  • mysql标量子查询和非法子查询的区别
    这篇文章主要讲解了“mysql标量子查询和非法子查询的区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql标量子查询和非法子查询的区别”吧!#whe...
    99+
    2022-10-18
  • MySQL创建表及分组查询介绍
    下面一起来了解下MySQL创建表及分组查询,相信大家看完肯定会受益匪浅,文字在精不在多,希望MySQL创建表及分组查询这篇短内容是你想要的。1.创建表create table score(id int,pl...
    99+
    2022-10-18
  • MySQL高级查询示例详细介绍
    目录1.左关联2.右关联3.子查询4.联合查询5.分组查询1.左关联 mysql中的左关联(Left Join)是一种基于共同列的连接操作, 它将左侧表中的所有行与右侧表中匹配的行结合在一起, 如果右侧表中没有匹配的行,...
    99+
    2023-02-16
    MySQL高级查询语句 MySQL高级查询知识点
  • MySQL数据库子查询语法规则详解
    目录子查询简介WHERE 子查询FROM 子查询SELECT 子查询子查询是在查询语句里面再嵌套一个查询,这是因为我们在提取数据的时候有很多不知道的数据产生了依赖关系。此时我们就需要先查询一组数据的结果集...
    99+
    2022-08-08
    MySQL子查询语法 MySQL子查询
  • SQL结构化查询语言分类介绍
    SQL结构化查询语言分类介绍SQL:结构化查询语言,它是一种对关系型数据进行定义和操作的语言方法。SQL结构化查询语言包含6个部分:一、数据查询语言(DQL)DQL全称Data Query Language...
    99+
    2022-10-18
  • mysql和mssql以及oracle的分页查询方法介绍
    本篇内容介绍了“mysql和mssql以及oracle的分页查询方法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2022-10-18
  • 详细介绍PHP中SQL查询语句的使用方法
    PHP是一种流行的服务器端编程语言,MySQL是一种广泛应用的关系型数据库管理系统,它们的结合能够为Web应用程序提供强大的查询和数据处理能力。在PHP开发过程中,SQL查询语句是必须掌握的知识之一。本文将详细介绍PHP中SQL查询语句的使...
    99+
    2023-05-14
    SQL php
  • MySQL子查询语句怎么使用
    这篇“MySQL子查询语句怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL...
    99+
    2023-03-06
    mysql
  • mysql查询语法(一)
    原文:https://www.cnblogs.com/zehuang/p/14491150.html...
    99+
    2014-09-15
    mysql查询语法(一) 数据库入门 数据库基础教程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作