前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MYSQL not in not exists 我们不一样, 坑你还得入?

MYSQL not in not exists 我们不一样, 坑你还得入?

作者头像
AustinDatabases
发布2020-02-13 17:53:59
1.4K0
发布2020-02-13 17:53:59
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

MYSQL 8 这个版本已经和简单的查询慢慢的说再见了,MYSQL 8.017的功能Antijoin 也登录了,但问题大面积的MYSQL 5.X 怎么办,NOT IN 和 NOT EXISTS 大部分情况下,大部分人认为他们是相等的,但实际上是吗?在解决一个问题之前应该要理解他到底是一个什么情况,否则搞不清情况,往往会惹来一些麻烦。

下面是表结构

在salaries 表中插入一条在employees 表中没有的雇员的工资数据

select * from salaries as em where em.emp_no

not in (select emp_no from employees as sa );

select * from salaries as em where

not exists (select * from employees as sa where sa.emp_no = em.emp_no)

两种方式都可以查询到数据,

代码语言:javascript
复制
SET @@profiling = 1;

not in 很“聪明” 走了一个时间的索引,因为发现通过对比时间的方式可以找到“捷径”。

所以NOT IN 并不与预想的,会比较慢。NOT EXISTS 也没有预想的那样。

那我们在换一种方式,看看 NOT IN 和 NOT EXISTS 还有什么会让你觉得和你想的不一样。NOT IN 会让查询的准确性大打折扣吗?

我们生成两个表 proc proc1,表结构没有任何的不一样,这是数据会有一些不同。

只是数据有不同

上面的图已经看出,NOT IN 给出的结果是不对的,也就是说如果表中的对比字段有NULL的情况,你将获得的结果与 not exists 是不一样的。查询在其结果中返回NULL,那么NOT in条件将失败。

所以还得在说一遍,表中的字段有没有NULL ,可绝对没有你想象的那么简单,很多时候想当然的结果可不是实际的结果。

最后还是要强调两点

1 初期的设计不好,后期的查询遇到的问题就会很多

2 认为和实际有些时候是不一样的

有问题共同分享,共同提高

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档