两种使用Count的方法,它们是等价的吗?

时间:2011-06-30 12:35:02

标签: sql count

SELECT COUNT(a.attr)
FROM TABLE a

相当于

SELECT B
FROM (SELECT COUNT(a.attr) as B
      FROM TABLE a)

我猜不,但我不确定。

我也假设对于min,max,avg等函数的答案是否相同?

编辑:

这完全出于好奇,我还是新手。对于以下计数和上面的计数返回的值是否存在差异?

SELECT B, C
FROM (SELECT COUNT(a.attr) as B, a.C
      FROM TABLE a
      GROUP BY c)

再次编辑:我调查了一下,经验教训:当我尝试了解这些事情时,我应该保持清醒。

5 个答案:

答案 0 :(得分:6)

从技术上讲,它们不一样,第一个是简单选择,第二个是带子选择的选择。
但是每个理智的优化器都会为它们生成相同的执行计划。

答案 1 :(得分:2)

结果相同,并且与以下内容相同:

SELECT E
FROM
(SELECT D as E
    FROM
    (SELECT C as D
        FROM
        (SELECT B as C
            FROM 
            (SELECT COUNT(a.attr) as B
                FROM TABLE a))))

同样毫无意义。

第二个查询基本上是混淆了COUNT,应该避免使用。

修改

是的,您添加到OP的已编辑查询是相同的。它只是无缘无故地添加一个子查询。

答案 2 :(得分:1)

是的。你在第二个中所做的就是命名返回的计数B.它们将返回相同的结果。

http://www.roseindia.net/sql/sql-as-keyword.shtml

修改 更好的例子: http://www.w3schools.com/sql/sql_alias.asp

第三个例子会有所不同,因为它包含一个group by。它将返回每个不同的a.C条目的计数。实施例

B          C
w/e        a
w/e        a
w/e        b
w/e        a
w/e        c

会返回

3       a
1       b
1       c

不一定按照该顺序

检查所有这些的最简单方法是亲自尝试并查看它返回的内容。

答案 3 :(得分:1)

发布此答案以补充其他答案中已经说过的内容,并且因为您无法格式化评论:)

您始终可以检查执行计划以查看查询是否相同;这就是SQL Server的用法:

DECLARE @A TABLE
(
  attr int,
  c int
)

INSERT @A(attr,c) VALUES(1,1)
INSERT @A(attr,c) VALUES(2,1)
INSERT @A(attr,c) VALUES(3,1)
INSERT @A(attr,c) VALUES(4,2)
INSERT @A(attr,c) VALUES(5,2)

SELECT count(attr) FROM @A

SELECT B
FROM (SELECT COUNT(attr) as B
      FROM @A) AS T

SELECT B, C
FROM (SELECT COUNT(attr) as B, c AS C
      FROM @A
      GROUP BY c) AS T

以下是SELECT声明的执行计划,您可以看到前两个没有区别:

enter image description here

答案 4 :(得分:0)

您的第一个代码示例是正确的,但第二个没有任何意义。 您只需选择所有数据两次,无需任何操作。 因此,第一个和第二个样本的输出将是相等的。