web-dev-qa-db-ja.com

count(*)vs count(column-name)-どちらが正しいですか?

これらの2つの例のようにcount(*) vs count(column-name)を実行すると違いが生じますか?

私は、count(*)を常に書く傾向があります。なぜなら、それが理にかなっている場合、それが集約関数であるという概念で私の心によりよくフィットするようだからです。

しかし、*なしで記述されたサンプルコードを見ることが多いため、技術的に最適かどうかはわかりません。

カウント(*):

select customerid, count(*), sum(price) 
from items_ordered
group by customerid
having count(*) > 1;

vs。count(column-name):

SELECT customerid, count(customerid), sum(price)
FROM items_ordered
GROUP BY customerid
HAVING count(customerid) > 1;
94
bread
  • COUNT(*)はすべての行をカウントします
  • COUNT(column)は非NULLのみをカウントします
  • COUNT(1)COUNT(*) と同じです。1は非ヌル式であるためです

COUNT(*)またはCOUNT(column)の使用は、目的の出力onlyに基づいている必要があります。

128
gbn

これはMySQLに適用されます。他のものについてはわかりません。

違いは:

  • COUNT(*)は、レコード数をカウントします。
  • COUNT(column_name)は、column_nameがNULLでないレコードの数をカウントします。

したがって、COUNT(*)を使用する必要があります。 MyISAMを使用していてWHERE句がない場合、行数が既にキャッシュされているため、オプティマイザーはテーブルを見る必要さえありません。

32
nickf

それが識別子である場合(そして、NULLでないことが保証されている場合)、おそらく重要ではありません。

ただし、isCOUNT(*)COUNT(column)の違いは一般的です。COUNT(column)は、_NULL以外のカウントを返します。列の値。 COUNT(DISTINCT column)バリアントもあり、一意の非NULL値の数を返します。

17
Dean Harding

はい、パフォーマンスに違いがある可能性があります。クエリと、対象のテーブルのインデックス付けに応じて、データのテーブルに移動する代わりに、インデックスからカウントを取得する方が高速です。したがって、おそらく*を使用する代わりに、フィールド名を指定する必要があります。

5
Tommi

一般的には同じですが、詳細は知る限り"count(*)"の方が良い b/c "count(columnname)"は、DBにその列名を検索するためにもう少しコードを実行させます(ただし、必須ではありません)しかし)。

5
zed_0xff