Contents

SQL中因为null导致的空结果

问题

无论SQL执行怎么样,都是得到空结果 https://cdn.jsdelivr.net/gh/wolfdan666/BlogPic/SQL/null.png

结论

原因是 group bywhere 之后只认识true or false , 然而我的数据里面有null, null 和 比较运算符得到的结果是 UNKNOW , 所以就会像上图中任何运算符都没有结果,所以大家如果遇到了同样的问题可以查看一下自己的数据

验证

我用一个干净的数据测试了一下确实是这样的 https://cdn.jsdelivr.net/gh/wolfdan666/BlogPic/SQL/%E9%AA%8C%E8%AF%81.jpg

参考

这里有很详细的探讨和代码,建议有兴趣的拓展阅读

https://www.cnblogs.com/killkill/archive/2010/09/04/1817266.html

提取上文大佬的结论

  • in/not in 的结果是依赖于“=”等值判断的结果;exists/not exists 虽然是判断集合是否为空,但通常里面的子查询做的是值判断
  • minus消灭了重复行!这就是前文所说的 not in 和 not exists 并非真正意义上的差集。

优化(写出鲁棒性更好的SQL!)

优化依据

in/not in 的结果是依赖于“=”等值判断的结果;exists/not exists 虽然是判断集合是否为空,但通常里面的子查询做的是值判断

执行

所以在group by之前都执行以下where \*.\* is not null

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
select student.sno,sname,avg(Grade)
from student,sc
where student.sno=sc.sno
    and sdept='CS'
    and sc.Grade is not null
group by sc.sno having avg(grade) >=
    all(
        select avg(grade) from student,sc where
            student.sno=sc.sno
            and sdept='CS'
            and sc.grade is not null
        group by student.sno);

https://cdn.jsdelivr.net/gh/wolfdan666/BlogPic/SQL/%E4%BC%98%E5%8C%96.jpg