欢迎关注方志朋的博客,回复”666“获面试宝典

来源:cnblogs.com/hydor/p/5391556.html

  • WHY?

    • 1、效率低

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

  • HOW?

    • 1、用 EXISTS 或 NOT EXISTS 代替

    • 2、用JOIN 代替


WHY?

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

1、效率低

项目中遇到这么个情况:

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

但是这样一句查询 ↓

select * from t1 where phone not in (select phone from t2)

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

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

select * from t1
where  not  EXISTS (select phone from t2  where t1.phone =t2.phone)

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

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

create table test1 (id1 int)
create table test2 (id2 int)insert into test1 (id1) values (1),(2),(3)
insert into test2 (id2) values (1),(2)

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

select id1 from test1
where id1 in (select id2 from test2)

结果是:

图片

OK 木有问题!

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

select id1 from test1
where id1 in (select id1 from test2)

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

结果是:

图片

EXCUSE ME!为什么不报错?

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

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

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

给test2插入一个空值:

insert into test2 (id2) values (NULL)

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

select id1 from test1
where id1 not in (select id2 from test2)

结果是:

图片

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

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

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

HOW?

1、用 EXISTS 或 NOT EXISTS 代替

select *  from test1 where EXISTS (select * from test2  where id2 = id1 )select *  FROM test1  where NOT EXISTS (select * from test2  where id2 = id1 )

2、用JOIN 代替

select id1 from test1 INNER JOIN test2 ON id2 = id1 select id1 from test1 LEFT JOIN test2 ON id2 = id1 where id2 IS NULL

妥妥的没有问题了!

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

热门内容:
  • 网传铁饭碗职业排名,公务员仅排第八!

  • 为什么 Java 中“1000==1000”为false,而”100==100“为true?

  • 别再写 main 方法测试了,太 Low!这才是专业 Java 测试方法!

  • 新来的同事问我 where 1=1 是什么意思

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

面试官:为什么要尽量避免使用 IN 和 NOT IN 呢?相关推荐

  1. 【266期】面试官问:为什么 SQL 要尽量避免使用 IN 和 NOT IN?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... IN 和 ...

  2. 京东面试官:给我说说你简历上的订单系统是如何设计的?尽量详细点~

    热门文章推荐: 2021年电商基础面试总结 视频 |Java高性能优化电商秒杀 Redis 的 8 大数据类型,写得非常好! 面试中问什么问题最能让面试官记忆犹新? 一个人决定离职的征兆有哪些?202 ...

  3. 从面试官角度观察到的程序员工资瓶颈,同时给出突破瓶颈的建议

    原文链接: https://gitbook.cn/books/5d98575e0f43867cba9d84a0/index.html 我在做技术面试官的时候,大多数面试的是初级开发和高级开发,偶尔也会 ...

  4. mysql longtext可以存储多少文字_MySQL 四万字精华总结 + 面试100 问,和面试官扯皮绰绰有余(收藏系列)

    作者:派大新 链接:https://juejin.im/post/5f0d4fadf265da22f3250eaa 写在之前:不建议那种上来就是各种面试题罗列,然后背书式的去记忆,对技术的提升帮助很小 ...

  5. 摊牌了:我就靠这几点,搞定了算法面试官

    很多时候,你即使提前复习了这些最常见的面试算法题,你依旧无法通过算法面试! 为什么? 1. 你在提前准备复习的时候,在网上找了半天相应题目的分析文章,但你看了就是不懂. 2. 你在面试的时候,卡壳了, ...

  6. 面试官三连问:你这个数据量多大?分库分表怎么做?用的哪个组件?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1.  概述 ShardingSphere是一套开源的分布 ...

  7. 被面试官问懵B了,十亿级数据ES搜索怎么优化?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 面试题 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊 ...

  8. 怎么样做一个合格而又可爱的面试官

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作为技术面试官,面试过程很少考虑候选人的感受.上来就是问,不合适就 ...

  9. mysql lbs 附近的人_一口气说出 4种 LBS “附近的人” 实现方式,面试官笑了

    引言 昨天一位公众号粉丝和我讨论了一道面试题,个人觉得比较有意义,这里整理了一下分享给大家,愿小伙伴们面试路上少踩坑.面试题目比较简单:"让你实现一个附近的人功能,你有什么方案?" ...

  10. 如何写一份让面试官眼前一亮的简历?

    一份好的简历,能给面试官一个好的印象,可能你接下来的面试就很顺利.一份糟糕的简历,可能连简历筛查都过不了,所以写好一份简历很重要. 可是笔者发现很多伙伴根本不会写简历,有的内容不全,有的重点不突出,有 ...

最新文章

  1. poj 1737男人八题之一 orz ltc
  2. FreeMarker的优点和缺点
  3. @EnableWebMvc启动springmvc特性
  4. mysql hash分区 创建_如何建mysql hash数据库分区
  5. mysql函数与事件_mysql事件函数的应用
  6. 模板字符串竟然还有这种用法
  7. uniapp ios时间戳获取不到_个人小程序uniapp实战开发(三):数据库设计与文章列表...
  8. 网络:简述传统CPE向VCPE的演进
  9. 【英语魔法俱乐部——读书笔记】 3 高级句型-简化从句倒装句(Reduced Clauses、Inverted Sentences) 【完结】...
  10. Java面经-海康威视
  11. iOS使用自定义字体,比如楷体
  12. PHP进销存软件源代码ERP多仓储管理系统源码
  13. amf webgame
  14. 微信小程序之店铺评分组件及vue中用svg实现的评分显示组件
  15. Types of light 光照类型 光照系列4
  16. iPhone的快捷键
  17. [健康]肾的保健按摩
  18. 挂载ISO镜像文件作为本地yum源
  19. 游戏计算机电源,吃鸡一族看过来,游戏PC应配什么电源?
  20. Precision(精确率,正确率), Recall(召回率,查全率),Accuracy(准确率),F-Measure(F值)...

热门文章

  1. 接口限流算法:漏桶算法令牌桶算法
  2. 常见基本不等式的几何解释
  3. #pragma pack 内存对齐
  4. C/C++、嵌入式秋招之SQL篇
  5. 一起学WPF系列(2):第一个WPF应用程序
  6. chrdev字符设备几种注册方式的差异
  7. Java 学习笔记(4)——java 常见类
  8. Android Q 变更和新特性
  9. 1008: [HNOI2008]越狱(计数问题)
  10. U盘安装Ubuntu14.4时遇到分区问题记录