时
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)
再次编辑:我调查了一下,经验教训:当我尝试了解这些事情时,我应该保持清醒。
答案 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
声明的执行计划,您可以看到前两个没有区别:
答案 4 :(得分:0)
您的第一个代码示例是正确的,但第二个没有任何意义。 您只需选择所有数据两次,无需任何操作。 因此,第一个和第二个样本的输出将是相等的。