我当然应该使用SUM()进行条件聚合吗?

时间:2016-07-03 16:57:14

标签: mysql sql

在专业程序员使用SUM() (不是COUNT()进行条件聚合之前,我看到过。例如,请查看this

SELECT COUNT(field1), COUNT(field2), COUNT(field3),
       SUM(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 ELSE 0 END)
FROM (SELECT t.*
      FROM mytable t
      WHERE ...
      ORDER BY id
      LIMIT 500000
     ) rq;

有什么具体原因吗?实际测试它,COUNT()在有条件时也能正常工作。那么之间的区别是什么:

SUM(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 ELSE 0 END)

COUNT(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 ELSE 0 END)

换句话说,为什么有时会在{em>(第一次查询)上面的查询中使用COUNT(),有时还会使用SUM()

2 个答案:

答案 0 :(得分:3)

SUM(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 ELSE 0 END)

COUNT(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 ELSE 0 END)

有两个不同的东西,我不知道你是如何得到相同的答案(可能是因为你正在使用的数据集)。但是在这个设置中,最好使用COUNT但是你有一点改变代码

COUNT(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 END)

但是我不认为他们中的任何一个会产生高性能影响。

答案 1 :(得分:1)

@Malinga解释说这些方法确实没有区别,我同意他的看法。我个人偏好使用SUM()只是因为在SQL中将NULL视为UNKNOWN并且有很多规则/细微差别需要知道,所以任何时候我都可以消除我喜欢这样做。

如果不满足条件,则表示如果您未将ELSE语句置于NULL中,则表示快速注释。如此。

COUNT(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 ELSE NULL END)

可以写作

COUNT(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 END)

然而,关于表现,我会对两件事感到好奇。

1你的内部选择中的顺序并不是必需的,只会为sql引擎添加一个任务。因此,您可以通过删除它来提高性能。注意只需选择总和或计数方法,无论哪个是首选。

SELECT COUNT(field1), COUNT(field2), COUNT(field3),
       SUM(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 ELSE 0 END)
      ,COUNT(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 END)
FROM (SELECT t.*
      FROM mytable t
      WHERE ...
      LIMIT 500000
     ) rq;

接下来我知道这看起来很奇怪,但LIMIT实际上也会降低你的性能,具体取决于表中的记录数,索引数等等。所以,如果您真的想要整个表格的结果,您可以直接编写查询。

SELECT COUNT(field1), COUNT(field2), COUNT(field3),
       SUM(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 ELSE 0 END)
      ,COUNT(CASE WHEN field4 IS NOT NULL AND field5 IS NOT NULL AND field6 IS NOT NULL THEN 1 END)
FROM mytable t
WHERE ...
;