查看原文
其他

MySQL where 条件的这个坑你碰到过没

知数堂 2023-03-11

The following article is from SQL开发与优化 Author SQL开发与优化

导读:

本文节选自松华老师的《SQL优化专栏》

郑松华,知数堂SQL 优化班老师 

现任 CCmediaService DBA,主要负责数据库优化相关工作

擅长SQL优化 ,数据核对

想阅读更多内容请点击订阅专栏


大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子

需求背景:

今天给大家带来的是 MySQL where 条件的一个坑!

show create table employees\G
*************************** 1. row ***************************
Table: employees
Create Table: CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` enum('M','F') NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`),
KEY `ix_tt` (`first_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

表中的数据如下


我们一般都进行如下的查询

以上的操作都是正常的操作,没有什么特殊之处


现在开始进行,非常规操作:


第一眼看到如上的SQL ,很有可能发蒙状态!!这是什么骚操作!


那我们应该怎样理解这种操作呢?我们先看下下面的SQL:


请再看:


现在我们把子查询第一个SQL中的子查询打开,然后 把a 列换成 1=1


这样就明白了吧!

我们回过头来看原来的SQL

select * from employees where emp_no=10001 in (10002,10003);

这个其实是不是可以分成:

emp_no=10001 in (10002,10003) 两部分

其中 emp_no=10001 从上面的例子可以看出返回 1 或者 0

然后在跟 in (10002,10003) 比较 显然这里没有 1或者 0 所以结果肯定返回空


接着我们写下了如下的SQL:


根据我们的分析这个应该返回记过才对啊!怎么还是空集?


我们继续在show warnings\G 中找一些端倪


看来好像 10001 in (10001,10003,1,0) 这部分先运算了

我们加个括号看是不是满足我们的条件 :


嗯,果然,想法是对的!


综合之前的分析结果,把SQL 改成如下:


果然,运行出结果了!

谢谢大家~ 欢迎转发

如有关于SQL优化方面疑问需要交流的,请加入QQ群(579036588),并@骑兔子的龟 就可与我联系


更多松华老师文章推荐:
有趣的SQL(一)
有趣的SQL(二)两个表没连接条件的JOIN
有趣的SQL(三)行转列,列转行和复制
变化多端的SQL写法,你get到了吗?
从MySQL5.5到MySQL8.0子查询进化之路


END



点击下图小程序订阅
《SQL优化专栏》
get更多优化技能






这里有好课,为职场助攻

免费兑换知数堂的课程和周边,戳此了解

现招聘课程销售助理数枚

不限地区,不限年龄

若您懂“数”又自带流量

欢迎投简历加入我们

扫码了解岗位详情




扫码加入MySQL技术Q群

(群号:579036588)

   


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存