mysql not exists用法(mysql中EXISTS和IN的使用方法比较)
mysql not exists用法
mysql中EXISTS和IN的使用方法比较1、使用方式:
(1)exists用法
|
select a.batchname,a.projectid from ucsc_project_batch a where exists ( select b.id from ucsc_project b where a.projectid = b.id) |
上面这条sql的意思就是:以ucsc_project_batch为主表查询batchname与projectid字段,其中projectid字段存在于ucsc_project表中。
exists 会对外表ucsc_project_batch进行循环查询匹配,它不在乎后面的内表子查询的返回值是什么,只在乎有没有存在返回值,存在返回值,则条件为真,该条数据匹配成功,加入查询结果集中;如果没有返回值,条件为假,丢弃该条数据。
例如我们这里改变一下子查询的查询返回字段,并不影响外查询的查询结果:
|
select a.batchname,a.projectid from ucsc_project_batch a where exists ( select b.companyid,b. name from ucsc_project b where a.projectid = b.id) |
(2)in用法
|
select a.batchname,a.projectid from ucsc_project_batch a where a.projectid in ( select b.id from ucsc_project b) |
上面这条sql的查询结果与刚才的exists的结果一样,查询的意思也一样。
2、注意点:
(1)exists写法需要注意子查询中的条件语句一般需要带上外查询的表做关联,不然子查询的条件可能会一直为真,或者一直为假,外查询的表进行循环匹配的时候,要么全部都查询出来,要么一条也没有。
|
select a.batchname,a.projectid from ucsc_project_batch a where exists ( select b.id from ucsc_project b) |
比如上述这种写法,由于ucsc_project 表存在值,子查询的条件一直为真,ucsc_project_batch 每条数据进行循环匹配的时候,都能匹配成功,查询出来的结果就成为了ucsc_project_batch整张表数据。
|
select a.batchname,a.projectid from ucsc_project_batch a where exists ( select b.id from ucsc_project b where b.id is null ) |
这种写法,子查询肯定查不到结果,所以子查询的条件为假,外查询的每条数据匹配失败,整个查询结果为空
(2)in语句在mysql中没有参数个数的限制,但是mysql中sql语句有长度大小限制,整段最大为4m
(3)exists的子查询语句不在乎查询的是什么,只在乎有没有结果集存在,存在则整个子查询可以看作一个条件为真的语句,不然就是一个条件为假的语句
(4)in语句对于子查询的返回字段只能由一个,不然会报错:
select a.batchname,a.projectid from ucsc_project_batch a where a.projectid in (select b.id,b.companyid from ucsc_project b)
[err] 1241 - operand should contain 1 column(s)
3、场景选择
外查询表大,子查询表小,选择in;外查询表小,子查询表大,选择exists;若两表差不多大,则差不多。
(1)in中的sql查询只会查询一次,然后把结果集存在临时文件中,然后再与外层查询sql进行匹配,其中外查询与子查询都可以使用索引
|
select a.batchname,a.projectid from ucsc_project_batch a where a.projectid in ( select b.id from ucsc_project b) |
等价于:
|
$result = []; $ucsc_project_batch = "select a.batchname,a.projectid from ucsc_project_batch a" ; $ucsc_project = "select b.id from ucsc_project b" ; for ($i = 0;$i < $ucsc_project_batch .length;$i++){ for ($j = 0;$j < $ucsc_project .length;$j++){ if($ucsc_project_batch [$i].projectid== $ucsc_project [$j].id){ $result[] = $ucsc_project_batch [$i]; break; } } } |
(2)exists会对外查询的表ucsc_project_batch 进行循环匹配,执行ucsc_project_batch.length次,其中子查询可以使用索引,外查询全表扫描
|
select a.batchname,a.projectid from ucsc_project_batch a where exists ( select b.id from ucsc_project b where a.projectid = b.id) |
等价于:
|
$result = []; $ucsc_project_batch = "select a.batchname,a.projectid from ucsc_project_batch a " ; for ($i = 0; $i < $ucsc_project_batch . length; $i++) { if (exists($ucsc_project_batch [$i] . projectid)) {//执行 select b.id from ucsc_project b where a.projectid=b.id $result[] = $ucsc_project_batch [$i]; } } |
通过两个的伪代码分析可知:子查询的表大的时候,使用exists可以有效减少总的循环次数来提升速度;当外查询的表大的时候,使用in可以有效减少对外查询表循环遍历来提升速度。
总结
到此这篇关于mysql中exists和in的使用方法比较的文章就介绍到这了,更多相关mysql exists和in比较内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
原文链接:https://blog.csdn.net/zhenwei1994/article/details/82145711
- mysql函数编写(MySQL中sum函数使用的实例教程)
- cent os7.0 安装mysql(mysql8.0.23 linuxcentos7安装完整超详细教程)
- mysql乐观锁一定比悲观锁性能高(mysql居然还能实现分布式锁的方法)
- mysqlnull所占空间(详解mysql三值逻辑与NULL)
- mysql定期备份(Mysql5.7定时备份的实现)
- 停止mysql服务命令(windows下实现定时重启Apache与MySQL方法)
- 怎么把csv文件导入mysql(mysql导入csv的4种报错的解决方法)
- php+mysql源码部署教程(在WIN主机IIS上支持PHP和MySQL实现方法)
- python操作mysql连接池(详解Python连接MySQL数据库的多种方式)
- mysql备份工具怎么选(MySQL使用Xtrabackup备份流程详解)
- mysql中innodb四种事务级别(MySQL InnoDB 锁的相关总结)
- mysql建立分区表指令(MySQL高级特性——数据表分区的概念及机制详解)
- mysql忽略大小写(MySQL大小写敏感的注意事项)
- mysql数据库简单操作(一篇文章教会你进行MySQL数据库和数据表的基本操作)
- mysql要先下服务端再下客户端吗(解读MySQL的客户端和服务端协议)
- mysql主键什么情况用uuid(Mysql主键UUID和自增主键的区别及优劣分析)
- 周杰伦演唱会门票(周杰伦演唱会门票多少钱一张2023)
- 焕然一新 成都轨道集团官方网站改版上线(成都轨道集团官方网站改版上线)
- 成都轨道交通19号线二期全线电通(成都轨道交通19号线二期全线电通)
- 19号线二期全线电通 轨道交通项目最新进展来了(19号线二期全线电通)
- 涉及3条地铁线路 成都这4座轨道交通站点有新名字了(涉及3条地铁线路)
- 来了 成都轨道交通5条线路刷新 进度条(成都轨道交通5条线路刷新)
热门推荐
- sql server清理日志(SQL Server 2008 清空删除日志文件瞬间缩小日志到几M)
- docker容器设置端口(Docker 实现容器端口绑定本地端口)
- css盒子模型有什么用处(深入理解CSS中的盒子模型)
- sql server数据库备份计划(SQL Server数据库设置自动备份策略的完整步骤)
- C#中ArrayList与Array的区别
- mysql实验总结分析(MySQL查询截取的深入分析)
- python取当前日期(Python实现根据日期获取当天凌晨时间戳的方法示例)
- MVC中BeginForm
- dedecms是静态吗(dedecms全站伪静态的实现方法及注意事项)
- sql server创建的表在哪(浅析SQL Server授予了CREATE TABLE权限但是无法创建表)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9