sql 種類 COUNT(*)がFROM句なしで1に等しい理由は何ですか?




sql 種類 カウント (3)

この質問には既に回答があります:

クイックチェックのために私はクエリを使用しました

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 @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を返すのですか?


あなたの文がSQLでないため、Count(*)が1を返しました。

1)最初の文章では、アクセスしたいテーブルを置かないので、空の行だけを持つテーブルを説明します。

2)第2の場合:

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

返品

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

変数を置くが、彼を実装するテーブルを決定しないでください。 このために、カウントをして0を出す。


FROM節がなければ、DBMSは[LargeTable]を知ることができないため、テーブルです。 COLUMN NAMEエイリアスだと推測して、それを騙した

あなたはそれを試して見ることができます

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

最初の3つの例は、列名としてeklmnjdklfgmを返します


SQL Serverでは、 FROM句のないSELECT 、単一の行テーブルに対して動作するかのように動作します。

これは標準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です







sql-server-2012