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

ASh*_*ASh 10 sql count sql-server-2008 sql-server-2012

为了快速检查,我使用了一个查询

select COUNT(*) LargeTable
Run Code Online (Sandbox Code Playgroud)

并惊讶地看到

LargeTable
-----------
1
Run Code Online (Sandbox Code Playgroud)

几秒钟后,我意识到自己犯了错误

select COUNT(*) from LargeTable
Run Code Online (Sandbox Code Playgroud)

得到了预期的结果

(No column name)
-----------
1.000.000+
Run Code Online (Sandbox Code Playgroud)

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

如果我做它发生select COUNT(*)declare @x int = COUNT(*); select @x

另一个案例

declare @EmptyTable table ( Value int )
select COUNT(*) from @EmptyTable
Run Code Online (Sandbox Code Playgroud)

回报

(No column name)
-----------
0
Run Code Online (Sandbox Code Playgroud)

我没有在SQL标准中找到解释(http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt,在线源代码在这里给出/sf/answers/626483511/ 1506454)

为什么COUNT(*)返回1?

Mar*_*ith 12

在SQL Server中,SELECT没有FROM子句的操作就像对单个行表操作一样.

这不是标准的SQL.其他RDBMS提供DUAL具有单行的实用程序表.

所以这将被有效地对待

SELECT COUNT(*) AS LargeTable
FROM   DUAL 
Run Code Online (Sandbox Code Playgroud)

相关的Connect Item讨论

SELECT 'test'
WHERE  EXISTS (SELECT *) 
Run Code Online (Sandbox Code Playgroud)

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