メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
COUNT(*) は行がいくつあるかに答えます。COUNT(DISTINCT column) は異なる値が いくつあるかに答えます。初めて見る列については、たいていこちらのほうが興味深い 質問です。 始める前に mysql -u root -p sakila でクライアントを開いてください。

COUNT DISTINCT の仕組み

COLUMN_NAME を異なる値を数えたい列に、TABLE_NAME をテーブルに置き換えます。 サーバーはすべての行を読み、重複を捨て、残ったものを数えます。 これは SELECT DISTINCT が返すものの件数を、それを 返さずに得るものです。

例

  1. 異なる値はいくつあるか

1,000 本の映画が 5 つのレーティングに分類されています。

  1. 異なる組み合わせ

複数の列を指定すると、GROUP BY と同じように、1 つの組み合わせが 1 回 数えられます。
5 つのレーティングかける 3 つの料金で、すべての組み合わせが現れます。指定した 列のいずれかが NULL の行は、まったく数えられません。

NULL を飛ばすため、答えが間違って見えることがある

address2 は 4 行で NULL、残りの 599 行で空文字列です。
答えは 1 です。空文字列は異なる値として 1 つ数えられ、NULL はそれ自体の値として 数えられるのではなく飛ばされます。つまり、一部の行が空のとき、この関数が答える のは「この列には何種類の異なるものがあるか」ではありません。答えるのは「異なる 値はいくつあるか」で、NULL は値の不在です。 両方の数が必要なときは、2 つ目のクエリで欠けている行を数えます。 SELECT COUNT(*) FROM address WHERE address2 IS NULL です。

まとめ

  • 行ではなく異なる値を数えるには COUNT(DISTINCT column) を使います。
  • 異なる組み合わせを数えるには、複数の列を指定します。
  • NULL は値として数えられず、飛ばされると考えてください。
  • 両方の数が必要なときは、欠けている行を別に数えます。

関連項目