在编写 SQL 语句的时候大部分开发人员都会用到 IN 和 NOT IN 来辅助查询多个内容,例如查询 包含在 b 表中的 a 表数据,通常会这么来编写语句:
select * from a where id in (select aid from b)
这么写看似没错但世界上存在两个问题:效率低下、查询结果有误,下面我就来说一说。
效率低下
这里以 NOT IN 为例子,有这样一个要求,存在两个表 a 和 b 这两个表的数据都在 10 万条以上,需要查出来身份证号只存在于 a 表但不存在于 b 表的数据。根据经验,大部分开发人员会这么写:
select * from a where IDCar not in (select IDCar from b)
语句看着很简单对吧,但是执行这个语句后就会发现运行的时间很长,即使是说我们已经在 IDCar 这个列上加上了索引,它还是很慢。这是因为 NOT IN 并不会命中索引,那么解决这个问题的好办法就是使用 NOT EXISTS ,改进后的 SQL 语句如下:
select * from a where not exits (select IDCar from b where a.IDCar=b.IDCar)
查询结果有误
这里以 IN 为例,同样存在两个表 a 和 b,查询出 b 表中存在的 a 表数据。表结构如下:
-
a 表 colum type aid int -
b 表 colum type bid int 同样,根据经验大部分开发人员会这么写:
select * from a where aid in (select bid from b)
上面的执行结果一切正常没问题,但是当我们不小心将 bid 写成的 aid 时结果就不一样了,他会查出 a 表的所有数据。
当然,如果你没有把 bid 写成 aid 的话那也不能保证查询出来的结果完全没问题。在 b 表中存在一个 bid 为 null 的情况,那么当我们受用 NOT IN 来查询的时候,有可能得到的结果没有任何内容。这时因为 null 不等于任何非空值。这种情况我们一般使用 EXISTS 或者 NOT EXISTS 以及 表连接 JOIN 来解决。