SQL中IN和EXISTS用法的区别

2025-03-23 11:09:32
推荐回答(2个)
回答1:

总的来说in和exists在得到结果上差不太多,如果只有一个字段
where a.co1 in (select co1 from b) 和 where exists(select 1 from b where co1=a.co1)这两个效果真的是一样一样的,但是用exists有个好处,它可以写更加复杂的逻辑判断,而in用起来就显得不那么好用了(同时判断多个字段,更加复杂的逻辑,in基本就无能无力);还有一点,没有做个大数据量测试,感觉in的效率会高那么一丢丢……这个没仔细测过,仅供参考
重点是!not in 和not exists这俩东西,在有NULL的情况下,就会得到完全不一样的结果
假设b表的co1字段中存在NULL,ANSI_NULLS设置成on
where a.co1 not in (select co1 from b)--这样写会一条数据都得不到
where not exists(select 1 from b where co1=a.co1)--这样写你能得到结果
具体数据,卤煮自己测试下吧,我就不写了 有点晚。。

回答2:

IN的用法:列名 IN(子查询),IN子查询是将IN前面列的值与子查询返回的值进行比较,如果子查询中返回的值中与列名的取值有匹配的值,则条件成立,所以子查询中必须返回一列值,且只能返回一列值。
EXISTS的用法:EXISTS(子查询) ,EXISTS是一个函数,是根据子查询中有无记录返回确定条件是否成立,如果子查询有记录返回,则条件成立;如果子查询无记录返回,则条件不成立。由于EXISTS只是根据子查询有无记录返回确定条件是否成立,并不关心返回的是何值,因此子查询给出列名无意义,因此子查询的目标列通常是*,即语句格式为:
EXISTS(SELECT * FROM 表 WHERE 条件)