2013-08-17 20 views
24

最近私はインタビューでこの質問をしました。 私はこれをmySQLで試してみて、同じ結果を得ました(最終結果)。 すべては、その特定の表の行数を示しました。 誰もそれらの間の主な違いを説明することができます。mySQL/SQLのcount(0)、count(1)..、count(*)の違いは何ですか?

+1

カラムに 'null'値があります。次に列を数えます。カウントがどのように異なるかを確認してください。 「0」または「1」を選択すると、各行に対して定数を選択するだけであり、「null」は関係しません。 – Glenn

+0

[SQLでは、count(column)とcount(\ *)の違いは何ですか?](http://stackoverflow.com/questions/59294/in-sql-whats-the-difference-between-countcolumn -and-count) – newtover

答えて

30

何も本当に、あなたは、テーブル内のフィールドまたは代わりに定数値の括弧内の式または*を指定しない限り、

は、私はあなたに詳細な回答を与えてみましょう。 Countは、与えられたフィールドのnull以外のレコード番号を返します。 A

select 1 from A 
select 0 from A 
select * from A 

は、すべて同じ数のレコード、つまりテーブルAの行数を返します。出力はまだ異なります。テーブルに3つのレコードがある場合。フィールド名としてXとYを使用する場合

select 1 from A will give you 

1 
1 
1 

select 0 from A will give you 
0 
0 
0 

select * from A will give you (assume two columns X and Y is in the table) 
X  Y 
--  -- 
value1 value1 
value2 (null) 
value3 (null) 

したがって、3つのクエリはすべて同じ番号を返します。あなたは

select count(Y) from A 

を使用しない限り、唯一つの非NULL値があるので、あなたはCOUNT(expression)が発現とCOUNT(column)意志で非NULL値をカウントする一方、出力

+1

なぜ、積分値はcount関数に渡されるのですか? – Dhruv

+0

@DhruvSinghは私の答えで詳細を教えてくれました – Bren

+0

@Brenパフォーマンス面での違いはありますか? –

20

COUNT(*)として1は、行の数をカウントします取得します列のすべてのNULLでない値を数えます。

0と1の両方がヌル値ではないため、COUNT(0)=COUNT(1)であり、両方とも行番号COUNT(*)に相当します。それは別のコンセプトですが、結果は同じになります。

+0

@brhneserは、私のような初心者のための非常にdetailled答えを持っています。 – Dhruv

+1

はい、そうですが、 'count(*)'は 'count(1)'よりも時間がかかりますね。もしそうなら、 'count(1)'を使うとパフォーマンスが向上します。 :) – Yubaraj

+3

@Yubaraj count(1)は、少なくとも一部のdbmsではcount(*)よりも優れたパフォーマンスを使用していましたが、最近ではオプティマイザがcount(1)と同等のカウントを行えます。 – fthiella

10

今、それらはすべて同じように実行する必要があります。

クエリの最適化コードが不適切なため、カウントを実行する前にデータベースがすべてのフィールドデータを取得するため、COUNT(1)(またはあなたが選んだ定数)をCOUNT(* 。したがって、COUNT(1)はより高速でしたが、今は問題ではありません。

関連する問題