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

导读:

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

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

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

擅长SQL优化 ,数据核对

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

640?wx_fmt=png


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

需求背景:

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

 
 

表中的数据如下

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

请再看:

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

这样就明白了吧!

我们回过头来看原来的SQL

 
 

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

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

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

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

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

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

640?wx_fmt=jpeg

嗯,果然,想法是对的!

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

640?wx_fmt=jpeg

果然,运行出结果了!

谢谢大家~ 欢迎转发

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

更多松华老师文章推荐:

END


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

640?wx_fmt=png

640?wx_fmt=png


640?wx_fmt=gif

扫码加入MySQL技术Q群

(群号:579036588)

   640?wx_fmt=jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值