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

Why COUNT(*) is equal to 1 without FROM clause?

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

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

returns

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

我没有在 SQL 标准中找到解释 (http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt, online source is given here )

为什么 COUNT(*) returns 1?

在 SQL 服务器中,没有 FROM 子句的 SELECT 就像它针对单个行运行一样 table.

这不标准SQL。其他 RDBMS 提供了一个实用程序 DUAL table 和单行。

所以这将被有效地视为与

相同
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

因为没有 FROM 子句,DBMS 无法知道 [LargeTable] 是一个 table。您欺骗了它,猜测它是 COLUMN NAME 别名

你可以试试看

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

前3个例子returnseklmnjdklfgm作为列名

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

1) 在第一个句子中,你占了一个 table 空,只有一行,因为你没有输入 table 想要访问的内容。

2) 第二种情况:

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

returns

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

你放了这个变量,但不确定要table实现他。为此,数一数,出0。