mysql where非常规用法_MySQL where 条件的这个坑你碰到过没

导读:

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

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

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

擅长SQL优化 ,数据核对

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

78514072f95b92938f2a82675da7e7f5.png

大家好,我是知数堂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)

表中的数据如下

8f9fb27505df7e103bfd5b3ef9ae60b5.png

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

d2e7fb7f4dde60ec472c5b7aa381a3dc.png

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

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

ba6d02e9e603dd54432db6c748948c54.png

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

2338190cdb1e19a601b736b5bbd8aeed.png

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

07274b36265162183045f982ab217498.png

请再看:

28c22f7319acd916c5fd5655eafb293c.png

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

d553869d97010152f107e803fe10bf9b.png

这样就明白了吧!

我们回过头来看原来的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:

b091fc8d8229246fe3374846ed5f80f1.png

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

b80ea675356eb1fb059d81856d5687d6.png

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

8c7eab7393a5939a76f620ec347b6928.png

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

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

d2ab8a5b897f3ae65136e2a825849d8f.png

嗯,果然,想法是对的!

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

2f9d7cc2a34f2f2f047aef34c2ec9da6.png

果然,运行出结果了!

谢谢大家~ 欢迎转发

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

更多松华老师文章推荐:

END

点击下图小程序订阅

《SQL优化专栏》

get更多优化技能

78514072f95b92938f2a82675da7e7f5.png

be5004670b38213c6372907abc6dc2d9.png

758af604a623a84f3677425470b2af2d.gif

扫码加入MySQL技术Q群

(群号:579036588)

89c4499dca002cea39f7082790907033.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值