mysql中if+in,mysql中EXISTS和IN的使⽤⽅法⽐较
1、使⽤⽅式:
(1)EXISTS⽤法
lect a.batchName,a.projectId from ucsc_project_batch a where EXISTS (lect b.id from ucsc_project b where a.projectId = b.id)
甘露之变
上⾯这条SQL的意思就是:以ucsc_project_batch为主表查询batchName与projectId字段,其中projectId字段存在于ucsc_project表中。
EXISTS 会对外表ucsc_project_batch进⾏循环查询匹配,它不在乎后⾯的内表⼦查询的返回值是什么,只在乎有没有存在返回值,存在返回值,则条件为真,该条数据匹配成功,加⼊查询结果集中;如果没有返回值,条件为假,丢弃该条数据。
例如我们这⾥改变⼀下⼦查询的查询返回字段,并不影响外查询的查询结果:
lect a.batchName,a.projectId from ucsc_project_batch a where EXISTS (panyId,b.name from ucsc_project b where a.projectId = b.id)
(2)IN⽤法
帕累托原则lect a.batchName,a.projectId from ucsc_project_batch a where a.projectId in (lect b.id from ucsc_project b)
上⾯这条SQL的查询结果与刚才的EXISTS的结果⼀样,查询的意思也⼀样。
2、注意点:
(1)EXISTS写法需要注意⼦查询中的条件语句⼀般需要带上外查询的表做关联,不然⼦查询的条件可能会⼀直为真,或者⼀直为假,外查询的表进⾏循环匹配的时候,要么全部都查询出来,要么⼀条也没有。
lect a.batchName,a.projectId from ucsc_project_batch a where EXISTS (lect b.id from ucsc_project b)
⽐如上述这种写法,由于ucsc_project 表存在值,⼦查询的条件⼀直为真,ucsc_project_batch 每条数据进⾏循环匹配的时候,都能匹配成功,查询出来的结果就成为了ucsc_project_batch整张表数据。
lect a.batchName,a.projectId from ucsc_project_batch a where EXISTS (lect b.id from ucsc_project b where b.id is null)
这种写法,⼦查询肯定查不到结果,所以⼦查询的条件为假,外查询的每条数据匹配失败,整个查询结果为空
(2)IN语句在mysql中没有参数个数的限制,但是mysql中SQL语句有长度⼤⼩限制,整段最⼤为4M
(3)EXISTS的⼦查询语句不在乎查询的是什么,只在乎有没有结果集存在,存在则整个⼦查询可以看作⼀个条件为真的语句,不然就是⼀个条件为假的语句
(4)IN语句对于⼦查询的返回字段只能由⼀个,不然会报错:
lect a.batchName,a.projectId from ucsc_project_batch a where a.projectId in (lect b.panyId from ucsc_project b)
[Err] 1241 - Operand should contain 1 column(s)
柳泉居士>含近义词
3、场景选择
外查询表⼤,⼦查询表⼩,选择IN;外查询表⼩,⼦查询表⼤,选择EXISTS;若两表差不多⼤,则差不多。
(1)IN中的SQL查询只会查询⼀次,然后把结果集存在临时⽂件中,然后再与外层查询sql进⾏匹配,其中外查询与⼦查询都可以使⽤索引
lect a.batchName,a.projectId from ucsc_project_batch a where a.projectId in (lect b.id from ucsc_project b)
等价于:
$result = [];
网球简笔画$ucsc_project_batch = "lect a.batchName,a.projectId from ucsc_project_batch a";
$ucsc_project = "lect 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次,其中⼦查询可以使⽤索引,外查询全表扫描
lect a.batchName,a.projectId from ucsc_project_batch a where EXISTS (lect b.id from ucsc_project b where a.projectId = b.id)
等价于:
$result = [];
$ucsc_project_batch = "lect 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)) {//执⾏lect b.id from ucsc_project b where a.projectId=b.id
$result[] = $ucsc_project_batch [$i];
}
}乳胶床垫那个牌子的好
通过两个的伪代码分析可知:⼦查询的表⼤的时候,使⽤EXISTS可以有效减少总的循环次数来提升速度;当外查询的表⼤的时候,使⽤IN 可以有效减少对外查询表循环遍历来提升速度。
爆炒皮皮虾总结
到此这篇关于mysql中EXISTS和IN的使⽤⽅法⽐较的⽂章就介绍到这了,更多相关mysql EXISTS和I
N⽐较内容请搜索脚本之家以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持脚本之家!