目录

  • `in` 和 `exists`
    • `in`
    • `exists`
      • 概述
      • 举例
    • `in` 和 `exists` 用法区别
  • 小结

inexists

mysql 的多表查询中,始终要遵循的一个原则:小表驱动大表

in

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

SELECT * FROM A WHERE id IN (SELECT id FROM B);

如上述 sql 语句,它的执行流程

  • 先执行 in 中的查询,即 SELECT id FROM B
  • 其次在执行 SELECT * FROM A WHERE A.id = B.id

假设 SELECT id FROM B 查询出有 m 条记录,然后检查 A 表中查询出的 idm 条记录中是否存在,如果存在则将 A 的查询数据加入到结果集中,直到遍历完 A 表中所有的结果集为止

  • B 表数据量很大的时候不适合用 in,因为它有可能最多会将 B 表数据全部扫描一次
  • 如果 A 表有 1000 条记录,B 表有 10000 条记录,那么最多有可能扫描10000 * 1000 次表,效率很差
  • 如果 A 表有1000 条记录,B表有 100 条记录,那么最多有可能扫描 100 * 1000 次,扫描表次数大大减少,效率大大提升

总结:当外层查询表数据量大于子查询表时,则用 in,此时也正是遵循了 小表驱动大表 的原则

exists

概述

exists 关键字后面的参数是一个 任意的子查询sql 对子查询进行运算以判断它是否返回行

  • 如果至少返回一行,那么 exists 的结果为 true,此时外层的查询语句将进行查询
  • 如果子查询没有返回任何行,那么 exists 的结果为 false,此时外层语句将不进行查询
  • 注意:当我们的子查询为 SELECT NULL 时,mysql 仍然认为它是 true

exists 对外表用 loop 逐条查询,每次查询都会查看 exists 的子查询语句,当 exists 里的子查询语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前 loop 到的这条记录;反之,如果 exists 里的条件语句不能返回记录行,则当前 loop 到的这条记录被丢弃

举例

select * from user where exists (select 1);

user 表的记录逐条取出,由于子条件中的 select 1 永远能返回记录行,那么 user 表的所有记录都将被加入结果集,所以与 select * from user 是一样的

select * from A where exists (select * from B where user_id = 0);

可以知道对 A 表进行 loop 时,检查条件语句 select * from B where user_id = 0 由于 user_id 永远不为 0,所以条件语句永远返回空集,条件永远为 false,那么 A 表的所有记录都将被丢弃

总结:如果 A 表有 n 条记录,那么 exists 查询就是将这 n 条记录逐条取出,然后判断 nexists 条件

inexists 用法区别

in 查询的子查询返回结果必须只有一个字段,例如

select * from user where user_id in (select id from B);

不能是

select * from user where user_id in (select id, age from B);

exists 就没有这个限制,可以是任意的子查询

小结

  • in 查询在内部表和外部表上都可以使用到索引
  • exists 查询仅在内部表上可以使用到索引
  • 当子查询结果集很大,而外部表较小的时候,existsBlock 嵌套循环的作用开始显现,并弥补外部表无法用到索引的缺陷,查询效率会优于 in
  • 当子查询结果集较小,而外部表很大的时候,existsBlock 嵌套循环优化效果不明显,in 的外表索引优势占主要作用,此时 in 的查询效率会优于 exists
  • 表的规模不是看内部表和外部表,而是外部表和子查询结果集

mysql中in和exists区别相关推荐

  1. 软件测试mysql面试题:mysql中 in 和 exists 区别?

    mysql中 in 和 exists 区别? mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询.一直大家都认为exist ...

  2. MySQL中In与Exists的区别

    MySQL中In与Exists的区别 1 例子 2 EXISTS和IN的介绍 2.1 exists 2.2 in 2.3 使用上的区别 3 EXISTS和IN的性能分析 4 总结 1 例子 有两个表需 ...

  3. MySQL中IN和EXISTS的用法

    exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...

  4. mysql中使用join exists in时该注意的问题

    2019独角兽企业重金招聘Python工程师标准>>> 这是个老生常谈的问题,平时在简单使用过程中,都能得到想要的结果,但是对于各自的性能,以及适用场景,我们该注意什么?假如现在有表 ...

  5. Mysql中语言分类和区别

    SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL   1.数据定义语言DDL(Data Definition Language) 对象: 数据库 ...

  6. 清官谈mysql中utf8和utf8mb4区别,请使用utf8mb4

    一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.好在utf8mb4是utf8的超集,除了将编码改为ut ...

  7. 清官谈mysql中utf8和utf8mb4区别

    转载地址: http://ourmysql.com/archives/1402 utf8mb4可以保存一些表情,然后utf8mb4是utf8的超集,我就记住这些哈下面转载内容 一.简介 MySQL在5 ...

  8. Oracle中to_char函数和MySQL中的str_to_date函数区别

    标题Oracle中to_char函数和MySQL中的str_to_date函数 1. str_to_date()----->相当于Oracle中的to_char(): 字符串转换为日期格式 (1 ...

  9. mysql中in和exists的应用场景_mysql中关于in和exists的使用

    使用的数据库如下: in语句:常用于where表达式中,其作用是查询某个范围内的数据,只执行一次. SELECT * FROM  city  WHERE  pid  IN(SELECT  pid  F ...

  10. mysql中utf8和utf8mb4区别,MySQL中utf8和utf8mb4的区别

    一 .UTF8是什么 utf8"只是"utf8mb3"的一个别名,可以支持1-3字节表示的unicode字符. 而MySQL在5.5.3版本之后增加了一个utf8mb4的 ...

最新文章

  1. java nio 强制关闭_netty 处理远程主机强制关闭一个连接
  2. python网课一般多少钱-Python培训网课一般学费多少?毕业生能承担吗?
  3. 2017-2018-1 20155201 实验五 通讯协议设计
  4. Insertion Sort List(单链表插入排序)
  5. Maven基础了解及配置信息
  6. 如何写一个vue指令directive
  7. 代码分析 | 单细胞转录组Normalization详解
  8. typedef的使用详解
  9. 雷云3计算机不满足系统要求,电工进网作业许可考试(高压类)4、5、6章题库(无答案)...
  10. scrapy中文网学习笔记
  11. Java9 正式发布前的尝鲜之下载与配置环境变量
  12. python3 file_Python3-file
  13. 使用卷积神经网络(普通CNN和改进型LeNet)以及数据增强和迁移学习技巧识别猫和狗,并制作成分类器软件(基于Keras)
  14. Vue.js 入门 :去哪儿网APP案例 学习记录
  15. 数据通信与计算机网络A笔记
  16. 精雕细琢见真章《STM32Cube高效开发教程》
  17. 5xx 系列内部服务器错误
  18. 海量数据挖掘MMDS week3:社交网络之社区检测:基本技巧
  19. css|direction: rtl;填坑
  20. 手动修改设置VMware的IP地址

热门文章

  1. 自动驾驶 12-1: 实践中的状态估计 State Estimation in Practice
  2. Charles 导出所有request, response, cookie, 导出为HTTP Archive .har
  3. git merge/git rebase分支合并
  4. 利用函数指针实现累加
  5. linux容器安装crontab
  6. 用傅里叶分析得到频域信息 MATLAB,信号频谱分析
  7. python3.6下载opencv_ubuntu16.04+anaconda3+python3.6安装OpenCV3
  8. Python的中文处理
  9. ML--HMM(隐马尔可夫模型及python的实现2)
  10. Shallow Neural Network Week 3