2011-12-06 13 views
7

私はデータベースがdatabase1で、2つのテーブル(Table 1Table2)が入っています。SELECT COUNT(*);

Table1には3行、Table2には2行あります。ここでdatabase1に次のSQLクエリSELECT COUNT(*);を実行すると、出力は"1"になります。

この"1"は何を表していますか?

2つのテーブルの定義は次のとおりです。それは常に任意のデータベースか1を返すテーブル名なし

CREATE TABLE Table1 
(
ID INT PRIMARY KEY, 
NAME NVARCHAR(20) 
) 

CREATE TABLE Table2 
(
ID INT PRIMARY KEY, 
NAME NVARCHAR(20) 
) 
+0

正確なクエリは何ですか? – Reactormonk

+0

私は 'SELECT COUNT(*)'以上のテーブル名は考えていません。それは常に1 – Matten

+0

こんにちはタス、クエリは、私はSQLクエリ "Select Count(*)"を実行すると、出力は1です。これは何を意味しますか?クエリにはテーブル名が指定されていないことに注意してください。 – IsmailBaig

答えて

0

....

2

あなたがテーブルを指定せずにselect count(*)を実行しているためです。

count関数は、指定されたデータセットの行数を返します。選択するテーブルを指定しない場合、1つの選択は1つの行のみを返します。したがって、count(*)は1を返します(Oracleなどの一部のバージョンのSQLではにはがあります)

1

通常、問合せ対象の表を指定せずにselect count(*)を実行することはありません。あなたのデータベースサーバは、クエリしているデフォルトのシステムテーブルに基づいて、おそらくあなたに "1"のカウントを与えています。

はそれが意味をなさないテーブル名がなければ

select count(*) from Table1 

を使用してみてください。

0

これはタグ付きSQLサーバーなので、MSDNとなります。

COUNTは常にintデータ型の値を返します。

また、

COUNT(*)は、グループ内のアイテムの数を返します。これにはNULL 値と重複が含まれます。デフォルト(仮定)、からCOUNTを行うためのテーブルを提供しなかったので、

したがって、それは1を返すということです。これは我々がSELECT 1 + 1 FROM SomeTableような何かを行うことができ、それがテーブルSomeTable内のすべての行の値が2でレコードセットを返します平野スカラー計算することができますので

+0

ゼロではなく1を返す理由はありますか? –

+1

@LukeGirvinはい、裸の選択は、1つの行を持つテーブルに対して実行するように動作します。私の答えを見てください。 –

6

は通常、すべての選択は、フォームSELECT [columns, scalar computations on columns, grouped computations on columns, or scalar computations] FROM [table or joins of tables, etc]

です。

ここで、テーブルを気にせずにスカラーを計算したければ、SELECT 1 + 1のような処理をしたいと思うかもしれません。これは標準では許可されていませんが、有用であり、ほとんどのデータベースで許可されています(Oracleは最近変更されていない限り、少なくとも使用していないことはありません)。

したがって、このような裸のSELECTは、1行と1列のテーブルを指定したfrom句を持っているかのように扱われます(もちろん不可能ですが、トリックはあります)。従ってSELECT 1 + 1はの値を持つ単一の列を持つ単一の行を返すSELECT 1 + 1 FROM ImaginaryTableWithOneRowになります。

ほとんどこれについては考えていませんが、裸のSELECTが結果をもたらし、1行を返すために選択された1行のものがなければならないという事実について考えることさえありません。あなたはもちろん、次も結果を返す同様の線に沿って1

6

を返すSELECT COUNT(*) FROM ImaginaryTableWithOneRowと同等のものをやったSELECT COUNT(*)やって

SELECT 'test' 
WHERE EXISTS (SELECT *) 

この動作の説明(this Connect item)は、あなたの質問にも当てはまります。 ANSI SQLでは

FROM句なしSELECT文は許可されていない - あなたがテーブルのソースを指定する必要があります。したがって、文「SELECT 'test' WHERE EXISTS(SELECT *)」には構文エラーがあります。これは正しい の動作です。

SQL Serverの実装に関しては、FROM 句はオプションで、常にこのように機能しています。したがって、 "SELECT 1"や "SELECT @v"などのようにテーブルを必要とせずに行うことができます。 他のデータベースシステムでは、 "SELECT 1 FROM dual;"または "SELECT @v FROM dual;"のようなSELECTステートメントを実行するために使用される 行を持つ "DUAL" というダミーテーブルがあります。今度は、EXISTS句- に来て、 クエリの構文または結果に関してプロジェクトリストは重要ではなく、SELECT *はサブクエリで有効です。これを と結びつけてSELECTFROMなしで許可すると、 が表示されます。私たちはそれを修正することができましたが、それを行う上で大きな価値はなく、 は既存のアプリケーションコードを壊す可能性があります。

0

COUNT関数は結果として行数を返します。テーブルを指定しない場合、デフォルトで1が返されます。すなわち、COUNT(*), COUNT(1), COUNT(2), ...は常に1を返します。

-1
Select * 

from句を付けずに、「宇宙からALLを選択」は何も除外していないためです。 あなたの場合、あなたは「どのくらいの宇宙? これは私がそれを教える方法です。最初の日にボードに書きます。 *を選択して、それが意味することを尋ねます。答え:私に世界を与えてください。 そこから私は、宇宙を意味のあるものにフィルタリングする方法を教えます。

セレクトカウント(*)は決して考えられませんでしたが、これはもっと興味深いものですが、それでも真の答えをもたらします。私たちは一つの世界しか持っていません。
スティーブンホーキングと相談することなく、SQLは1つしか争わなくてはなりません。

クエリの結果は正しいです。