Zan*_*ien 5 sql count query-optimization
就像一个非常简单的例子一样,假设我有一个test包含样本数据的表,如下所示:
a | b
-------------
1 | 18
1 | 24
1 | 64
1 | 82
1 | 10
1 | 7
2 | 5
2 | 18
2 | 66
2 | 72
3 | 81
3 | 97
Run Code Online (Sandbox Code Playgroud)
对于每一个a,我要计算有多少b是<50的结果.结果看起来像:
a | bcnt
--------------
1 | 4
2 | 2
3 | 0
Run Code Online (Sandbox Code Playgroud)
现在我可以用两种方式之一来实现这个结果:
SELECT a, COUNT(CASE WHEN b < 50 THEN 1 ELSE NULL END) AS bcnt
FROM test
GROUP BY a
Run Code Online (Sandbox Code Playgroud)
要么:
SELECT a, SUM(CASE WHEN b < 50 THEN 1 ELSE 0 END) AS bcnt
FROM test
GROUP BY a
Run Code Online (Sandbox Code Playgroud)
我知道这可能看起来像是一个微不足道的小问题,但我的问题是,在使用一种方法而不是另一种方法方面会有任何优势(无论多么轻微):性能?......他们将使用多少个其他DBMS ?......陈述的清晰度......等等
性能?
哦,差别,如果有的话,将是微不足道的,我敢肯定.对我来说没什么可担心的.
他们将使用多少个其他DBMS?
我毫不怀疑它们至少可以在任何主要的 SQL产品中使用,所以,这也不是一个值得关注的问题,不管怎样对我来说都不是.
陈述的清晰度?
当然COUNT更清楚地表明你想要计算的东西,而不是添加一些任意值.有了SUM,你只有在THEN 1浏览完这个条件后到达这个部分才会意识到它的实际意图.
此外,如果我使用COUNT我可以省略该ELSE NULL部分,因为这ELSE是缺席时隐含的内容.如果我ELSE 0在SUM表达式中省略,我可能会得到一个NULL结果而不是可能的结果0.
另一方面,可能存在相反的情况,即返回NULL而不是0计数的结果更方便.所以,如果我使用COUNT,我将不得不做一些类似的事情NULLIF(COUNT(CASE ...), 0),而SUM(CASE ...)这样就足以省略该ELSE条款.但即使在这种情况下,我仍然可能更喜欢稍微更清晰一点的简洁(其他条件相同).
| 归档时间: |
|
| 查看次数: |
4459 次 |
| 最近记录: |