mysql中in和exists区别
目录
- `in` 和 `exists`
- `in`
- `exists`
- 概述
- 举例
- `in` 和 `exists` 用法区别
- 小结
in
和 exists
在 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
表中查询出的 id
在 m
条记录中是否存在,如果存在则将 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
条记录逐条取出,然后判断 n
遍 exists
条件
in
和 exists
用法区别
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
查询仅在内部表上可以使用到索引- 当子查询结果集很大,而外部表较小的时候,
exists
的Block
嵌套循环的作用开始显现,并弥补外部表无法用到索引的缺陷,查询效率会优于in
- 当子查询结果集较小,而外部表很大的时候,
exists
的Block
嵌套循环优化效果不明显,in
的外表索引优势占主要作用,此时in
的查询效率会优于exists
- 表的规模不是看内部表和外部表,而是外部表和子查询结果集
mysql中in和exists区别相关推荐
- 软件测试mysql面试题:mysql中 in 和 exists 区别?
mysql中 in 和 exists 区别? mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询.一直大家都认为exist ...
- MySQL中In与Exists的区别
MySQL中In与Exists的区别 1 例子 2 EXISTS和IN的介绍 2.1 exists 2.2 in 2.3 使用上的区别 3 EXISTS和IN的性能分析 4 总结 1 例子 有两个表需 ...
- MySQL中IN和EXISTS的用法
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...
- mysql中使用join exists in时该注意的问题
2019独角兽企业重金招聘Python工程师标准>>> 这是个老生常谈的问题,平时在简单使用过程中,都能得到想要的结果,但是对于各自的性能,以及适用场景,我们该注意什么?假如现在有表 ...
- Mysql中语言分类和区别
SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL 1.数据定义语言DDL(Data Definition Language) 对象: 数据库 ...
- 清官谈mysql中utf8和utf8mb4区别,请使用utf8mb4
一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.好在utf8mb4是utf8的超集,除了将编码改为ut ...
- 清官谈mysql中utf8和utf8mb4区别
转载地址: http://ourmysql.com/archives/1402 utf8mb4可以保存一些表情,然后utf8mb4是utf8的超集,我就记住这些哈下面转载内容 一.简介 MySQL在5 ...
- Oracle中to_char函数和MySQL中的str_to_date函数区别
标题Oracle中to_char函数和MySQL中的str_to_date函数 1. str_to_date()----->相当于Oracle中的to_char(): 字符串转换为日期格式 (1 ...
- mysql中in和exists的应用场景_mysql中关于in和exists的使用
使用的数据库如下: in语句:常用于where表达式中,其作用是查询某个范围内的数据,只执行一次. SELECT * FROM city WHERE pid IN(SELECT pid F ...
- mysql中utf8和utf8mb4区别,MySQL中utf8和utf8mb4的区别
一 .UTF8是什么 utf8"只是"utf8mb3"的一个别名,可以支持1-3字节表示的unicode字符. 而MySQL在5.5.3版本之后增加了一个utf8mb4的 ...
最新文章
- java nio 强制关闭_netty 处理远程主机强制关闭一个连接
- python网课一般多少钱-Python培训网课一般学费多少?毕业生能承担吗?
- 2017-2018-1 20155201 实验五 通讯协议设计
- Insertion Sort List(单链表插入排序)
- Maven基础了解及配置信息
- 如何写一个vue指令directive
- 代码分析 | 单细胞转录组Normalization详解
- typedef的使用详解
- 雷云3计算机不满足系统要求,电工进网作业许可考试(高压类)4、5、6章题库(无答案)...
- scrapy中文网学习笔记
- Java9 正式发布前的尝鲜之下载与配置环境变量
- python3 file_Python3-file
- 使用卷积神经网络(普通CNN和改进型LeNet)以及数据增强和迁移学习技巧识别猫和狗,并制作成分类器软件(基于Keras)
- Vue.js 入门 :去哪儿网APP案例 学习记录
- 数据通信与计算机网络A笔记
- 精雕细琢见真章《STM32Cube高效开发教程》
- 5xx 系列内部服务器错误
- 海量数据挖掘MMDS week3:社交网络之社区检测:基本技巧
- css|direction: rtl;填坑
- 手动修改设置VMware的IP地址
热门文章
- 自动驾驶 12-1: 实践中的状态估计 State Estimation in Practice
- Charles 导出所有request, response, cookie, 导出为HTTP Archive .har
- git merge/git rebase分支合并
- 利用函数指针实现累加
- linux容器安装crontab
- 用傅里叶分析得到频域信息 MATLAB,信号频谱分析
- python3.6下载opencv_ubuntu16.04+anaconda3+python3.6安装OpenCV3
- Python的中文处理
- ML--HMM(隐马尔可夫模型及python的实现2)
- Shallow Neural Network Week 3