昨天我问了一个关于按学生分数排名的问题。
[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;
这就是结果。
所以我想知道 NULL 值是否相同?这个查询不应该为我的数据库中的每个用户提供排名1 吗?为什么它会逐步排列空值?
答案 0 :(得分:4)
许多人认为NULL
含义为no value
或non-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
。
当然也有例外:
DISTINCT
和GROUP BY
认为NULL等于。
答案 2 :(得分:2)
NULL没有值 - 它是一种不存在的状态。因此,基于NULL的任何结果都是非确定性的。您应该明确地处理NULL值的可能性。
答案 3 :(得分:1)
布尔比较返回true,false或NULL
,NULL
通常被视为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;