当前位置: 首页 > article >正文

mysql中的EXISTS和NOT EXISTS使用详解

本文来编写一个实例说下mysql中的EXISTS和NOT EXISTS使用详解

文章目录

  • exists用法
  • SQL中in, not in, exists, not exists的区别
  • 使用实例
  • 本文小结


exists用法

exists:

  • 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句。
  • 如果括号内子查询语句返回结果为空,说明where条件不成立,就不会执行主SQL语句。

not exists与exists相反

  • 如果括号内子查询语句结果为空,说明表示where条件成立,就会执行主SQL语句。
  • 如果括号内子查询语句结果不为空,说明表示where条件不成立,就不会执行主SQL语句。

SQL中in, not in, exists, not exists的区别

in

  • 确定给定的值是否与子查询或者列表中的值匹配
  • in关键字选择与列表中任意一个值匹配的行
  • in关键字之后的项目必须用逗号隔开,并且括在括号中

not in

  • 通过not in关键字引入的子查询也返回一列零值或更多值

exists

  • 指定一个子查询,检测行的存在
  • 相当于两个集合的交集
  • exists后面可以是整句的查询语句 ,in后面只能是单列查询语句

not exists

  • 相当于两个集合的差集

exists和not exists返回的结果类型是Boolean

  • 如果子查询包含行:
  • exists返回TRUE
  • not exists返回FALSE

exists与in的区别

  • in只能返回一个字段值。
  • exists强调是否返回结果集,不要求知道返回什么,exists允许返回多个字段。
  • exists适合外表的结果集小的情况。
  • in适合内外表都很大的情况。

使用实例

创建2个表结构

在这里插入图片描述
在这里插入图片描述

语句对比


select count(1) from orders o where o.user_id in(select u.id from users u);


select count(1) from orders o where exists (select 1 from users u where u.id = o.user_id);

1.in:先查询in后面的users表,然后再去orders中过滤,也就是先执行子查询,结果出来后,再遍历主查询,遍历主查询是根据user_id和id相等查询的。
即查询users表相当于外层循环,主查询就是外层循环

小结:in先执行子查询,也就是in()所包含的语句。子查询查询出数据以后,将前面的查询分为n次普通查询(n表示在子查询中返回的数据行数)

2.exists:主查询是内层循环,先查询出orders,查询orders就是外层循环,然后会判断是不是存在order_id和 users表中的id相等,相等才保留数据,查询users表就是内层循环

这里所说的外层循环和内层循环就是我们所说的嵌套循环,而嵌套循环应该遵循“外小内大”的原则,这就好比你复制很多个小文件和复制几个大文件的区别

小结:如果子查询查到数据,就返回布尔值true;如果没有,就返回布尔值false。返回布尔值true则将该条数据保存下来,否则就舍弃掉。也就是说exists查询,是查询出一条数据就执行一次子查询

结论

小表驱动大表。

in适合于外表大而内表小的情况,exists适合于外表小而内表大的情况。


本文小结

本文介绍了mysql中的EXISTS和NOT EXISTS使用,以及与in语句的区别。


http://www.kler.cn/a/393891.html

相关文章:

  • 微信小程序中使用离线版阿里云矢量图标
  • 软件测试:测试用例详解
  • 【HarmonyOS NEXT】一次开发多端部署(以轮播图、Tab栏、列表为例,配合栅格布局与媒体查询,进行 UI 的一多开发)
  • 申论1_概括、分析
  • qt QProcess详解
  • 类别变量分析——卡方独立性检验卡方拟合优度检验
  • 单例模式详解:如何优雅地实现线程安全的单例
  • 业务开发问题之ConcurrentHashMap
  • docker Network(网络)
  • 如何利用AI实现弯道超车:信息时代的新机遇
  • 《MYSQL45讲》误删数据怎么办
  • 【大数据学习 | flume】flume的概述与组件的介绍
  • QtWebServer
  • 【多线程】伪共享的概念
  • 无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍
  • LeetCode 86.分隔链表
  • Unity插件-Smart Inspector 免费的,接近虚幻引擎的蓝图Tab管理
  • Linux系统编程多线程之条件变量和信号量讲解
  • 力扣--树题总结
  • sql文件
  • UniApp 应用、页面与组件的生命周期详解
  • Codeforces Round 984 (Div. 3)
  • 【Ubuntu pip安装mpi4py时报错】
  • 基于单片机的客车载客状况自动检测系统(论文+源码)
  • 从0开始深度学习(29)——文本预处理
  • golang通用后台管理系统08(菜单路由数据vue对接)