社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

老叶茶馆 • 6 年前 • 443 次点击  

导读:

本文节选自松华老师的《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)

   


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/45185