首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL 查询尽量避免使用 IN 和 NOT IN

SQL 查询尽量避免使用 IN 和 NOT IN

作者头像
喵叔
发布2022-03-13 09:30:46
发布2022-03-13 09:30:46
1.5K00
代码可运行
举报
文章被收录于专栏:喵叔's 专栏喵叔's 专栏
运行总次数:0
代码可运行

在编写 SQL 语句的时候大部分开发人员都会用到 IN 和 NOT IN 来辅助查询多个内容,例如查询 包含在 b 表中的 a 表数据,通常会这么来编写语句:

代码语言:javascript
代码运行次数:0
运行
复制
select * from a where id in (select aid from b)

这么写看似没错但世界上存在两个问题:效率低下、查询结果有误,下面我就来说一说。

效率低下

这里以 NOT IN 为例子,有这样一个要求,存在两个表 a 和 b 这两个表的数据都在 10 万条以上,需要查出来身份证号只存在于 a 表但不存在于 b 表的数据。根据经验,大部分开发人员会这么写:

代码语言:javascript
代码运行次数:0
运行
复制
select * from a where IDCar not in (select IDCar from b)

语句看着很简单对吧,但是执行这个语句后就会发现运行的时间很长,即使是说我们已经在 IDCar 这个列上加上了索引,它还是很慢。这是因为 NOT IN 并不会命中索引,那么解决这个问题的好办法就是使用 NOT EXISTS ,改进后的 SQL 语句如下:

代码语言:javascript
代码运行次数:0
运行
复制
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| 同样,根据经验大部分开发人员会这么写:
代码语言:javascript
代码运行次数:0
运行
复制
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 来解决。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/03/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 效率低下
  • 查询结果有误
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档