在专业程序员使用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()
?
答案 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)
如果不满足条件,则表示如果您未将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 ...
;