关于mysql中的not in的坑

171 阅读1分钟

上周进行业务开发的时候有个逻辑是大概意思是某一张表中如果有数据,那么就不通知相关人员,我一看那不就是只要跟对其子查询然后not in不就行了嘛,而且作为新手的我一直觉得not in 就是in的互补数据,然而结果是浪费了我两个小时的工时。 我这个情况是,我有一张主表a,子表b,其中a表、b表有一个关联字段,称之为guid,然后我需要通过b表中的stat字段去筛选掉一些数据。我当时写的语句是: select fileid1,fileid2,fileid3 from a where guid not in (select guid from b where stats = '3');

咋一看这sql写的没问题吧,我当时也觉得没问题,但是一直查询不到数据,我觉得很奇怪,怎么会呢?然后我就面向百度编程,结果发现如果子表b中的guid存在数据为null的情况的时候,a表中的guid与之匹配返回的就是null,从而导致查不到数据。 blog.csdn.net/qq_42902673…

谢谢这位博主的博客让我知道了这个坑,我当时的优化是在子查询里面做一个判断is not null 但是我感觉这个太捞了,我就使用了not exists,我想我以后都不会使用not in了,它已经被我抛弃了,成为忠实的not exists 用户了。

还是平时的sql写少了,后面会加强自己的能力,不再犯这种低级错误。(为了凑够这四百字太难了我!!!)