为什么null值在mysql中的排名不一样?

时间:2016-01-07 11:57:08

标签: mysql sql database null ranking

昨天我问了一个关于按学生分数排名的问题。

[Rank users in mysql by their points ]

我实际上已经通过其他问题收到的帮助解决了我的问题(感谢所有帮助过我的人)。
与此同时,我意外地想出了一些东西。如果我尝试按照他们的积分对我的学生进行排名,如果积分列为空(NULL),我的查询没有给出错误,它也排序等级为1-2-3-4,但所有值都是 NULL < / strong>

这是我试过的查询

select er.*,
       (@rank := if(@points = points, 
                    @rank, 
                    if(@points := points,    
                       @rank + 1, 
                       @rank + 1                       
                      )
                   )                  
       ) as ranking
from examresults er cross join
     (select @rank := 0, @points := -1) params
order by points desc;

这就是结果。

enter image description here

所以我想知道 NULL 值是否相同?这个查询不应该为我的数据库中的每个用户提供排名1 吗?为什么它会逐步排列空值?

4 个答案:

答案 0 :(得分:4)

许多人认为NULL含义为no valuenon-existent。即使Wikipedia也这样解释。

将其视为unknown value,一切都会更有意义。

无法比较两个unknown values,因为它们不为人所知。他们并不平等但他们也没有什么不同。它们都不比另一个大。

两个unknown values的比较结果也是unknown value(即NULL)。

答案 1 :(得分:2)

您比较@points = points,结果为@points=NULL

但与NULL的任何比较都会产生UNKNOWN

value= NULL -> UNKNOWN
value<>NULL -> UNKNOWN
value< NULL -> UNKNOWN
value> NULL -> UNKNOWN

即使NULL=NULL也会产生UNKNOWN

当然也有例外:

DISTINCTGROUP BY认为NULL等于。

答案 2 :(得分:2)

NULL没有值 - 它是一种不存在的状态。因此,基于NULL的任何结果都是非确定性的。您应该明确地处理NULL值的可能性。

答案 3 :(得分:1)

布尔比较返回true,false或NULLNULL通常被视为false。您可以轻松修改查询以使用NULL - 安全平等:

select er.*,
       (@rank := if(@points <=> points, 
                    @rank, 
                    if(@points := points,    
                       @rank + 1, 
                       @rank + 1                       
                      )
                   )                  
       ) as ranking
from examresults er cross join
     (select @rank := 0, @points := -1) params
order by points desc;