データベースは、「あるタイプのデータがテーブルに何回出現するか」という質問に使用されることがよくあります。たとえば、ペットの数または所有者ごとのペットの数を調べる場合や、ペットについてさまざまな個体数調査を実行する場合などです。
ペットの総数をカウントすることは、「pet
テーブルには何行あるか」という質問と等価です。このテーブルにはペットごとに
1
つのレコードが存在するからです。COUNT(*)
は行数をカウントするため、ペットの数をカウントするクエリーは次のようになります。
mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+
前の節で、ペットの所有者の名前を取得しました。COUNT()
を使用して、各所有者のペットの数を調べることができます。
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner | COUNT(*) |
+--------+----------+
| Benny | 2 |
| Diane | 2 |
| Gwen | 3 |
| Harold | 2 |
+--------+----------+
このクエリーは GROUP
BY
を使用して各
owner
のすべてのレコードをグループ化しています。COUNT()
を GROUP BY
とともに使用すると、さまざまなグループ化の下でデータの特徴を示すことができます。次の例では、ペットの個体数調査を実行するさまざまな方法を示します。
種ごとのペット数
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird | 2 |
| cat | 2 |
| dog | 3 |
| hamster | 1 |
| snake | 1 |
+---------+----------+
性別ごとのペット数
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex | COUNT(*) |
+------+----------+
| NULL | 1 |
| f | 4 |
| m | 4 |
+------+----------+
(この出力で、NULL
は性別不明を示します。)
種と性別の組み合わせごとのペット数
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| bird | NULL | 1 |
| bird | f | 1 |
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| hamster | f | 1 |
| snake | m | 1 |
+---------+------+----------+
COUNT()
を使用するときにテーブル全体を取り出す必要はありません。たとえば、このクエリーを犬と猫だけに対して実行する場合は、次のようになります。
mysql>SELECT species, sex, COUNT(*) FROM pet
->WHERE species = 'dog' OR species = 'cat'
->GROUP BY species, sex;
+---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | +---------+------+----------+
または、性別のわかっているペットについてのみ性別ごとのペット数を調べるには、次のクエリーを使用します。
mysql>SELECT species, sex, COUNT(*) FROM pet
->WHERE sex IS NOT NULL
->GROUP BY species, sex;
+---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
COUNT()
値に加え、選択するカラムを指定する場合は、それらのカラムを
GROUP BY
節で指定する必要があります。そうでない場合は、次のようになります。
ONLY_FULL_GROUP_BY
SQL
モードが有効である場合は、エラーが発生します。
mysql>SET sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT owner, COUNT(*) FROM pet;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause
ONLY_FULL_GROUP_BY
が有効でない場合、このクエリーはすべての行を
1
つのグループと見なして処理されますが、指定した各カラムに選択される値は不確定です。サーバーによって任意の行の値が自由に選択されます。
mysql>SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT owner, COUNT(*) FROM pet;
+--------+----------+ | owner | COUNT(*) | +--------+----------+ | Harold | 8 | +--------+----------+ 1 row in set (0.00 sec)
項7.12.3. 「非常時カラムとの GROUP BY
および HAVING
」
も参照してください。