0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么要尽量避免使用IN和NOT IN呢?

Android编程精选 来源:博客园 作者:博客园 2022-03-18 09:46 次阅读

  • WHY?
    • 1、效率低
    • 2、容易出现问题,或查询结果有误 (不能更严重的缺点)
  • HOW?
    • 1、用 EXISTS 或 NOT EXISTS 代替
    • 2、用JOIN 代替

WHY?

IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?

1、效率低

项目中遇到这么个情况:

t1表 和 t2表 都是150w条数据,600M的样子,都不算大。

但是这样一句查询 ↓

select*fromt1wherephonenotin(selectphonefromt2)

直接就把我跑傻了。。。十几分钟,检查了一下 phone在两个表都建了索引,字段类型也是一样的。原来not in 是不能命中索引的。。。。

改成 NOT EXISTS 之后查询 20s ,效率真的差好多。

select*fromt1
wherenotEXISTS(selectphonefromt2wheret1.phone=t2.phone)

2、容易出现问题,或查询结果有误 (不能更严重的缺点)

以 IN 为例。建两个表:test1 和 test2

createtabletest1(id1int)
createtabletest2(id2int)

insertintotest1(id1)values(1),(2),(3)
insertintotest2(id2)values(1),(2)

我想要查询,在test2中存在的 test1中的id 。使用IN的一般写法是:

selectid1fromtest1
whereid1in(selectid2fromtest2)

结果是:

402b60b0-9474-11ec-952b-dac502259ad0.jpg图片

OK 木有问题!

但是如果我一时手滑,写成了:

selectid1fromtest1
whereid1in(selectid1fromtest2)

不小心把id2写成id1了 ,会怎么样呢?

结果是:

404094bc-9474-11ec-952b-dac502259ad0.jpg图片

EXCUSE ME!为什么不报错?

单独查询 select id1 from test2 是一定会报错: 消息 207,级别 16,状态 1,第 11 行 列名 'id1' 无效。

然而使用了IN的子查询就是这么敷衍,直接查出 1 2 3

这仅仅是容易出错的情况,自己不写错还没啥事儿,下面来看一下 NOT IN 直接查出错误结果的情况:

给test2插入一个空值:

insertintotest2(id2)values(NULL)

我想要查询,在test2中不存在的 test1中的id 。

selectid1fromtest1
whereid1notin(selectid2fromtest2)

结果是:

4050c22e-9474-11ec-952b-dac502259ad0.jpg图片

空白!显然这个结果不是我们想要的。我们想要3。为什么会这样呢?

原因是:NULL不等于任何非空的值啊!如果id2只有1和2, 那么3<>1 且 3<>2 所以3输出了,但是 id2包含空值,那么 3也不等于NULL 所以它不会输出。

跑题一句:建表的时候最好不要允许含空值,否则问题多多。

HOW?

1、用 EXISTS 或 NOT EXISTS 代替

select*fromtest1
whereEXISTS(select*fromtest2whereid2=id1)

select*FROMtest1
whereNOTEXISTS(select*fromtest2whereid2=id1)

2、用JOIN 代替

selectid1fromtest1
INNERJOINtest2ONid2=id1

selectid1fromtest1
LEFTJOINtest2ONid2=id1
whereid2ISNULL

妥妥的没有问题了!

PS:那我们死活都不能用 IN 和 NOT IN 了么?并没有,一位大神曾经说过,如果是确定且有限的集合时,可以使用。如 IN (0,1,2)。

审核编辑 :李倩



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6899

    浏览量

    88842
  • Join
    +关注

    关注

    0

    文章

    9

    浏览量

    3247

原文标题:面试官:为什么要尽量避免使用 IN 和 NOT IN 呢?

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    长鑫已重新设计DRAM芯片,尽量避免使用美国原产技术

    6月12日,日经新闻引述未具名消息人士报导,合肥长鑫已经重新设计了其DRAM芯片,以尽量减少对美国原产技术的使用。 日经:长鑫已重新设计DRAM芯片,尽量避免使用美国原产技术 据日经新闻亚洲评论报导
    发表于 06-13 18:30 3402次阅读

    PCB走线时为什么要尽量避免锐角和直角?

    出现,直角走线一般是布线中要求尽量避免的情况,也几乎成为衡量布线好坏的标准之一,那么直角走线究竟会对信号传输产生多大的影响?  从原理上说,锐角、直角走线会使传输线的线宽发生变化,造成阻抗的不连续
    发表于 09-21 11:48

    C2000程序中全局变量的使用应该尽量减少吗

    一般来说,编程时我们应该尽量减少使用全局变量,但是在DSP程序中,我们是不是应该也要尽量减少使用全局变量?
    发表于 12-11 13:50

    如何去避免heisenbug

    frangi黑森矩阵是什么意思?如何去避免heisenbug?有哪些解决办法?
    发表于 10-19 09:03

    为什么C语言要避免使用Null指针

    为什么C语言要避免使用Null指针?指针作为数组的应用有哪些
    发表于 12-20 07:19

    如何避免高频干扰?

    如何避免高频干扰? 避免高频干扰的基本思路是尽量降低高频信号电磁场的干扰,也就是所谓的串扰(Crosstalk)。可用拉大高速信号和
    发表于 01-02 11:14 6248次阅读

    目前最不值得入手的4款华为手机,遇到时要尽量避开 都是“坑”!

    。每年华为都会给用户带来种种的惊喜,在这期间,它发布不少高性价比的手机,无论性能、外观等综合方面表现的都格外出色,成为不少发烧友的首选。然而并不是每一款华为手机都值得入手,有很多华为手机表面看上去毫无瑕疵,实际上都是坑,为避免大家入坑,小编盘点了目前最不值得入手的4款华为手机,遇到时
    的头像 发表于 08-21 17:18 7204次阅读

    为什么PCB布线中要尽量避免锐角和直角走线

    如果是射频线,在转角的地方如果是直角,则有不连续性,而不连续性将易导致高次模的产生,对辐射和传导性能都有影响。RF信号线如果走直角,拐角处的有效线宽会增大,阻抗不连续,引起信号反射。为了减小不连续性,要对拐角进行处理,有两种方法:切角和圆角。圆弧角的半径应足够大,一般来说,要保证:R>3W。
    发表于 09-16 11:49 5764次阅读
    为什么PCB布线中<b class='flag-5'>要尽量</b><b class='flag-5'>避免</b>锐角和直角走线

    PCB设计中的EMC问题怎么避免

    在文章的开篇就说过,EMC和SI、PI息息相关,很多时候我们会告诉大家,我们没法进行EMC仿真,但我们会从板级来尽量避免一些EMC问题的发生,说白了其实就是尽量保证SI及PI的性能(这是我们的专长),从源头上来
    发表于 10-13 09:43 1851次阅读

    电路设计中为什么要尽量提高输入阻抗?

    级的电流输出能力减少了很大负担。所以电路设计中尽量提高输入阻抗。 再说输出阻抗,它可以看做输出端内阻 r,可以等效为一个理想信号源(电源)和这个内阻 r 的串联。把它和下级电路的输入阻抗结合起来看,就相当于一个理想信号源(电源)和
    的头像 发表于 03-02 10:52 1.4w次阅读

    电磁骚扰源为什么要尽量远离孔洞开口

    电磁骚扰源为什么要尽量远离孔洞开口?  电磁骚扰源指的是任何能够生成电磁场或电磁波的设备或设施,这些电磁波可以干扰无线信号、危害人体健康或者破坏电子设备等。在现代社会中,电磁骚扰已经成为了一个
    的头像 发表于 09-12 14:52 509次阅读

    时钟与复位信号设计方案

    我们设计时要尽可能避免在内部产生时钟,如果操作不当,会导致设计功能和时序问题。总而言之,尽量在代码中避免操作时钟。
    的头像 发表于 09-19 09:26 1254次阅读
    时钟与复位信号设计方案

    SMT贴片打样如何尽量避免出现锡不饱满

    在SMT贴片打样过程中,焊接上锡是很重要的一步骤。焊点不饱满对电路板的使用性能以及外形美观度都会有非常严重的影响。
    的头像 发表于 10-24 16:33 823次阅读

    如何避免PLC程序卡死

    编写稳定的程序:编写良好的、稳定的PLC程序是避免程序卡死的关键。确保程序逻辑清晰、简洁,并遵循编程最佳实践。避免死循环、逻辑错误和冲突的发生。
    的头像 发表于 01-26 09:14 613次阅读

    在选取rc元件参数时,为什么应尽量避免选取小电阻

    在选取RC元件(电阻和电容)参数时,应尽量避免选取小电阻,这主要基于以下几个方面的考虑: 1. 电压分压效应 降低电压输出 :小电阻作为负载时,会与信号源的内阻形成分压电路,从而大幅度降低信号源输出
    的头像 发表于 09-18 15:32 375次阅读