如何在MySQL中计算NULL值数量?

23

我想知道如何在MySQL数据库中找到所有的NULL值,例如我想显示所有还没有平均值的用户。

以下是MySQL代码。

SELECT COUNT(average) as num
FROM users
WHERE user_id = '$user_id'
AND average IS_NULL

2
等一下,你是想展示用户还是数量?你的问题和示例不符。 - µBio
你的答案正确的次数。 - abbr
7个回答

37

一种更通用的版本(它不依赖于where子句,从而限制了您的整体结果):

SELECT 
    SUM(CASE WHEN average IS NULL THEN 1 ELSE 0 END) As null_num, 
    SUM(CASE WHEN average IS NOT NULL THEN 1 ELSE 0 END) AS not_null_num
FROM users

这种方法不如其他答案中提出的特定查询好,但它可以用于使用限制where子句不切实际的情况(由于需要其他信息)...


1
在MySQL中,对于这个特定的目的,使用ISNULL()函数在语法上比使用CASE简单得多。 - Air
也许你可以像这样使用IF子句:SELECT SUM(IF(IFNULL(average), 1, 0) AS null_num, SUM(IF(IFNULL(average), 0, 1) AS not_null_num FROM users - andy
SUM(ISNULL(average)) - todinov
这个解决方案非常适用于左连接的情况,例如当我们想要选择所有用户及其在左连接表中未读消息的计数时。因为 count(isnull(read_at)) 不起作用。举个例子。 - David Rinnan
也许我们可以使用一个计数和按此值分组,而不是使用2个结果(null_num和not_null_num)。 - Elizandro - SparcBR

19
SELECT
    COUNT(*) as num
FROM
    users
WHERE
    user_id = '$user_id' AND
    average IS NULL

2
"count(column)" 不会真正计算列值为 "null" 的行数。 - andy

10

另外,你可以:

Select Count(*) - Count(Average) as NullAverages
From Users
Where user_id = '$user_id' 

1
在MySQL中,这个方法对我来说似乎运行良好,并且比“case when”方法快得多。 - ChrisV
通常你在代码中需要这两个值(总数和空值数)。因此,这个解决方案对于任何用例都是快速和灵活的。 - Ruslan Stelmachenko

5
这是一个可以用于解决此问题的单行代码:
SELECT COUNT(IF(average IS NULL,1,0))
FROM table; 

对我来说,它的效果非常好!


这个答案非常有用并且很有帮助。 - Yagnesh bhalala
当if语句返回任何值时,外部的count函数会像Count(*)一样计算所有行。这里是更多信息的链接:https://learnsql.com/blog/difference-between-count-distinct/。在这里使用SUM()可能会更好。 - Ender

5

3
有点晚了,但您可以在MySQL 5.0.51中进行操作:
SELECT COUNT(*) AS total, COUNT(field1) AS notNullFields1
FROM table
GROUP BY field5, field6

致敬。


基于http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count - ATorras

3

我可能漏掉了MySQL特定的东西,但是在SQL Server中这将会起作用。

SELECT COUNT(*) as num
FROM users
WHERE user_id = '$user_id'
AND average IS NULL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接