赞
踩
tab1
tab2
SELECT * FROM tab1 WHERE size IN (
SELECT size FROM tab2
)
SELECT * FROM tab1 WHERE size NOT IN (
SELECT size FROM tab2
)
SELECT * FROM tab1 WHERE size IN (
10,20,50,NULL
)
SELECT * FROM tab1 WHERE size NOT IN (
10,20,50,NULL
)
对于not in查询,内表存在空值将导致最终的查询结果为空
EXISTS 用来判断查询到的结果是否为空,它并不返回任何值,
NOT EXISTS 也是一样
SELECT * FROM tab1 WHERE EXISTS(
SELECT size FROM tab2 WHERE tab1.size=tab2.size
)
SELECT * FROM tab1 WHERE NOT EXISTS(
SELECT size FROM tab2 WHERE tab1.size=tab2.size
)
对于not exists查询,内表存在空值对查询结果没有影响;
1、对于not exists查询,内表存在空值对查询结果没有影响;对于not in查询,内表存在空值将导致最终的查询结果为空。
2、对于not exists查询,外表存在空值,存在空值的那条记录最终会输出;对于not in查询,外表存在空值,存在空值的那条记录最终将被过滤,其他数据不受影响。
select * from A where cc in(select cc from B) -->效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc) -->效率高,用到了B表上cc列的索引。
相反的:
select * from B where cc in(select cc from A) -->效率高,用到了B表上cc列的索引
select * from B where exists(select cc from A where cc=B.cc) -->效率低,用到了A表上cc列的索引。
如果查询语句使用了not in,那么对内外表都进行全表扫描,无法命中索引.
而not exists的子查询依然能用到表上的索引
所以无论哪个表大,用not exists都比not in 要快。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。