(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的结果一样,查询的意思也一样。
(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)
外查询表大,子查询表小,选择IN;外查询表小,子查询表大,选择EXISTS;若两表差不多大,则差不多。
(1)IN中的SQL查询只会查询一次,然后把结果集存在临时文件中,然后再与外层查询sql进行匹配,其中外查询与子查询都可以使用html" target="_blank">索引
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比较内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
本文向大家介绍对比分析MySQL语句中的IN 和Exists,包括了对比分析MySQL语句中的IN 和Exists的使用技巧和注意事项,需要的朋友参考一下 背景介绍 最近在写SQL语句时,对选择IN 还是Exists 犹豫不决,于是把两种方法的SQL都写出来对比一下执行效率,发现IN的查询效率比Exists高了很多,于是想当然的认为IN的效率比Exists好,但本着寻根究底的原则,我想知道这个结论
本文向大家介绍MySQL中in与exists的使用及区别介绍,包括了MySQL中in与exists的使用及区别介绍的使用技巧和注意事项,需要的朋友参考一下 先放一段代码 分析以上代码可以看到两行代码除了循环的次序不一致意外,其他并无区别,在实际执行时两者所消耗的时间和空间应该也是一致的。但是这仅仅是在Java中,现在我们转化一下情景,最外层循环是数据库中的连接操作,内层循环为查找操作,那么现在两次
本文向大家介绍MySQL exists 和in 详解及区别,包括了MySQL exists 和in 详解及区别的使用技巧和注意事项,需要的朋友参考一下 MySQL exists 和in 详解及区别 有一个查询如下: 这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是
问题内容: 以下两个查询是子查询。两者相同,都对我有效。但是问题是方法1的查询大约需要10秒才能执行,而方法2的查询不到1秒。 我能够将方法1的查询转换为方法2,但是我不了解查询中正在发生什么。我一直想自己弄清楚。我真的很想了解以下两个查询之间的区别是什么,以及如何获得性能提升?它背后的逻辑是什么? 我是这些高级技术的新手。我希望有人能在这里帮助我。考虑到我阅读的文档并没有给我任何提示。 方法1:
问题内容: 这是我要使用的两条语句,但是它们返回错误消息: 和 之所以会有问号,是因为我在PHP的PDO中使用了参数化的,准备好的语句。但是,我也尝试过手动使用数据执行此操作,但这确实不起作用。 虽然我想知道为什么每个都不起作用,但如果可以使第一个查询起作用,我希望使用第一个查询。 问题答案: 您不能使用功能的IF控制块OUTSIDE。这样会影响您的两个查询。 将EXISTS子句改为IF函数中的子
本文向大家介绍详解sql中exists和in的语法与区别,包括了详解sql中exists和in的语法与区别的使用技巧和注意事项,需要的朋友参考一下 exists和in的区别很小,几乎可以等价,但是sql优化中往往会注重效率问题,今天咱们就来说说exists和in的区别。 exists语法: select … from table where exists (子查询) 将主查询的结果,放到子查询结果