为什么COUNT(*)等于1没有FROM子句?

时间:2015-10-09 10:49:12

标签: sql sql-server-2008 count sql-server-2012

快速检查我使用了查询

select COUNT(*) LargeTable

并且惊讶地看到了

LargeTable
-----------
1
几秒钟后,我意识到自己的错误,做到了

select COUNT(*) from LargeTable

并获得预期结果

(No column name)
-----------
1.000.000+

但现在我不明白为什么COUNT(*)返回1

如果我select COUNT(*)declare @x int = COUNT(*); select @x

,就会发生这种情况

另一个案例

declare @EmptyTable table ( Value int )
select COUNT(*) from @EmptyTable

返回

(No column name)
-----------
0

我没有在SQL标准中找到解释(http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt,此处提供了在线资源https://stackoverflow.com/a/8949764/1506454

为什么COUNT(*)会返回1?

3 个答案:

答案 0 :(得分:12)

在SQL Server中,没有SELECT子句的FROM就像对单行表一样运行。

这不是标准SQL。其他RDBMS提供了一个带有单行的实用程序DUAL

因此,这将与

有效对待
SELECT COUNT(*) AS LargeTable
FROM   DUAL 

相关的Connect Item讨论

SELECT 'test'
WHERE  EXISTS (SELECT *) 

https://connect.microsoft.com/SQLServer/feedback/details/671475/select-test-where-exists-select

答案 1 :(得分:0)

因为没有 FROM 子句,DBMS无法知道[LargeTable]是一个表。你猜它是一个 COLUMN NAME 别名

你可以尝试看看

select count(*) 'eklmnjdklfgm'
select count(*) eklmnjdklfgm
select count(*) [eklmnjdklfgm]
select count(*)

前3个示例将 eklmnjdklfgm 作为列名返回

答案 2 :(得分:-1)

Count(*)返回1,因为你的句子不是SQL。

1)在第一句话中,您将一个表空了一个表,只有一行,因为您没有放入要访问的表。

2)在第二种情况下:

declare @EmptyTable table ( Value int )
select COUNT(*) from @EmptyTable

返回

(No column name)
-----------
0

你把变量放了,但不确定哪个表实现了他。为此,请计数并外出0。