为什么没有 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。
为了快速检查,我使用了一个查询
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。