MySQL where 条件的这个坑你碰到过没
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),并@骑兔子的龟 就可与我联系
END
这里有好课,为职场助攻
现招聘课程销售助理数枚
不限地区,不限年龄
若您懂“数”又自带流量
欢迎投简历加入我们
扫码了解岗位详情
扫码加入MySQL技术Q群
(群号:579036588)