MySQL子查询Subquery语法介绍

发布时间:2020-05-19 15:48:10

来源:51CTO

阅读:187

作者:三月

下面讲讲关于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, NOTEXISTS为FALSE.下面的SQL只是为了便于理解EXISTS,一般不这样用.

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

+------+

| col1 |

+------+

|   3 |

|   9 |

+------+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 WHEREEXISTS(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相关内容,大家还有什么不明白的地方吗?或者想要了解更多相关,可以继续关注我们的行业资讯板块。

mysql子查询的语法_MySQL子查询Subquery语法介绍相关推荐

  1. mysql中子查询是什么_mysql子查询是什么

    MySql的子查询是多表查询的一个重要组成部分,常常和连接查询一起使用,是多表查询的基础.下面本篇文章就来带大家了解一下子查询,希望对你们有所帮助. 什么是子查询? 子查询,又叫内部查询.当一个查询是 ...

  2. mysql子查询过多慢_MySQL子查询慢现象的解决

    当你在用explain工具查看sql语句的执行计划时,若select_type 字段中出现"DEPENDENT SUBQUERY"时,你要注意了,你已经掉入了mysql子查询慢的& ...

  3. mysql子查询复杂操作_MySQL 子查询操作

    子查询 在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句 为什么会有子查询这种用法 数据库有没有记忆力 但查询结果需要的数据,本表已 ...

  4. mysql子查询是什么_mysql子查询

    1. 什么是子查询 ​ 当一个查询是另一个查询的条件时,这个查询称之为子查询(内层查询) ​ 什么时候用? ​ 当查询需求比较复杂,一次性查询无法得到结果,需要多次查询时, ​ 例如:给出一个部门名称 ...

  5. mysql获取查询策略语句_MySQL数据库查询性能优化策略

    优化查询 使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 通过对查询语句的分析,可以了解查询语句的执行 ...

  6. mysql数据库缓存为多久_mysql数据库查询缓存总结

    概述 查询缓存(Query Cache,简称QC),存储SELECT语句及其产生的数据结果.闲来无事,做一下这块的总结,也做个备忘! 工作原理 查询缓存工作原理如下: 缓存SELECT操作的结果集和S ...

  7. mysql外键约束分数_MySQL 高级查询

    我们使用SQL查询不能只使用很简单.最基础的SELECT语句查询.如果想从多个表查询比较复杂的信息,就会使用高级查询实现.常见的高级查询包括多表连接查询.内连接查询.外连接查询与组合查询等 以一个简单 ...

  8. mysql 联合查询后排序_MySQL的查询(联合查询,查询排序,正则表达式)

    MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询 联合查询实例 -- 联合查询 SELECT * FROM user union ...

  9. mysql外连接的含义_MySQL连接查询,内连接,外连接,全连接,交叉连接_cly_32的博客-CSDN博客...

    原文作者:起个花名好难 原文标题:MySQL连接查询,内连接,外连接,全连接,交叉连接 发布时间:2021-01-27 13:46:33 1.含义 当查询中涉及到多个表的字段,需要使用多表查询 sel ...

最新文章

  1. CF 1029E Tree with Small Distances
  2. 在游戏运营行业,Serverless 如何解决数据采集分析痛点?
  3. 自从安上了“AI”,这些商务经理天天按时下班了
  4. 如何方便记忆和理解类图里的线条
  5. 2021年财富世界500强,苹果是全球最赚钱公司,小米第338位,第一是它
  6. leetcode题库53-- 最大子序和
  7. 使用layoutParams设置控件高宽需要注意的问题
  8. css 为什么给span加vertical-align: middle不起作用?
  9. Java学习笔记 --- IDEA
  10. OpenDrive格式高精度地图详细解析及其使用(1.栅格地图、OpenDrive坐标系以及参考线介绍)
  11. 自然辩证法2018版_(完整word版)2018年《自然辩证法概论》已整理
  12. 防止 跨站请求伪造(CSRF)
  13. java计算机毕业设计房屋租赁系统源码+数据库+系统+lw文档+部署
  14. Injective Protocol官方文档翻译(九) -清盘、清算(Liquidation)
  15. excel计算机一级打不开,【2人回答】Excel表格太大,电脑打不开如何解决?-3D溜溜网...
  16. 中式风格装修,彰显东方迷人的魅力
  17. Java给定字符串形式的非负数,返回两个非负数的乘积
  18. 认知科学期末复习笔记
  19. C语言:搬砖问题(for循环)
  20. 《安富莱嵌入式周报》第312期:开源磁场照相机,仿生神经元PCB,开源无线耳机,手机系统PalmOS移植到各种单片机,开放系统组装协议OSAP

热门文章

  1. python异步asy_python异步编程asyncio
  2. codevs莫题解搞来的游戏 (题号1000)
  3. 来我主页的小仙女小帅哥给你们一道很有深度(底层原理)的题(能够看到这篇文章的人希望你做一下))
  4. 全球与中国织物保护喷雾市场现状及未来发展趋势
  5. 名流套套49只19.9/冈本套套21只29.9/360U盘/钢化膜/蓝牙耳机9.9/无线键鼠/等好物
  6. python int占几个字节_小白学python第1问: int 占几个字节?
  7. Knockout.js 组件
  8. selenium webdriver环境安装
  9. 如何订阅netflix会员_如何取消您的Netflix订阅
  10. chmod 命令用法