0%

SQL中因为null导致的空结果

问题

无论SQL执行怎么样,都是得到空结果

结论

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

验证

我用一个干净的数据测试了一下确实是这样的

参考

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

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);