これらの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;
COUNT(*)
はすべての行をカウントしますCOUNT(column)
は非NULLのみをカウントしますCOUNT(1)
はCOUNT(*)
と同じです。1は非ヌル式であるためですCOUNT(*)
またはCOUNT(column)
の使用は、目的の出力onlyに基づいている必要があります。
これはMySQLに適用されます。他のものについてはわかりません。
違いは:
COUNT(*)
は、レコード数をカウントします。COUNT(column_name)
は、column_nameがNULLでないレコードの数をカウントします。したがって、COUNT(*)
を使用する必要があります。 MyISAMを使用していてWHERE
句がない場合、行数が既にキャッシュされているため、オプティマイザーはテーブルを見る必要さえありません。
それが識別子である場合(そして、NULL
でないことが保証されている場合)、おそらく重要ではありません。
ただし、isCOUNT(*)
とCOUNT(column)
の違いは一般的です。COUNT(column)
は、_NULL
以外のカウントを返します。列の値。 COUNT(DISTINCT column)
バリアントもあり、一意の非NULL
値の数を返します。
はい、パフォーマンスに違いがある可能性があります。クエリと、対象のテーブルのインデックス付けに応じて、データのテーブルに移動する代わりに、インデックスからカウントを取得する方が高速です。したがって、おそらく*を使用する代わりに、フィールド名を指定する必要があります。
一般的には同じですが、詳細は知る限り"count(*)"の方が良い b/c "count(columnname)"は、DBにその列名を検索するためにもう少しコードを実行させます(ただし、必須ではありません)しかし)。