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

ゞ 浴缸里的玫瑰 2023-08-17 15:39 183阅读 0赞

导读:

本文节选自松华老师的《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=10001in (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),并@骑兔子的龟 **就可与我联系

更多松华老师文章推荐:

有趣的SQL(一)

有趣的SQL(二)两个表没连接条件的JOIN

END


点击下图小程序订阅

《SQL优化专栏》

get更多优化技能

640?wx\_fmt=png

640?wx\_fmt=png

640?wx\_fmt=gif

扫码加入MySQL技术Q群

(群号:**579036588)**

640?wx\_fmt=jpeg

发表评论

表情:
评论列表 (有 0 条评论,183人围观)

还没有评论,来说两句吧...

相关阅读