MySQLのCOUNTとは?
MySQLで使われるCOUNT関数とは、引指定したフィールド(カラム)の行数を取得(カウント)する機能です。
MySQLの操作でも頻繁に使用されるため、覚えておくのは必須と言えるでしょう。
この記事では、そんなCOUNT関数の使い方について解説します。
COUNT関数のさまざまな使い方
ここではCOUNT関数について、次の5通りの記述方法・使い方を紹介します。
- COUNT関数の基本的な使い方
- DISTINCTで重複するデータを除外してCOUNTする
- COUNT関数でWHERE句を使う方法
- GROUP BYでグループ化したデータをCOUNTする
- COUNT関数でif文を使う方法
ひとつずつ解説していきますね。
1.COUNT関数の基本的な使い方
COUNT関数を使うには、次のように記述します。
COUNT(expr)
COUNT関数の引数に取得したいデータを記述すればOKです。
では、具体的な使い方をテーブルを作成してみていきましょう。
まずは「name」「type」「value」の3つのフィールドがあるテーブル「counttb」を作成します。
mysql> CREATE TABLE counttb (name VARCHAR(10), type VARCHAR(10), value INT);
テーブルを作成したらレコードを挿入します。
ここでは、次のようなレコードを挿入しました。
mysql> INSERT INTO counttb VALUES ('Potepan1', 'Type1', 55), ('Potepan2', 'Type3', 80); mysql> INSERT INTO counttb VALUES ('Potepan3', 'Type1', 99), ('Potepan4', 'Type3', 60); mysql> INSERT INTO counttb VALUES ('Potepan5', 'Type3', 77), ('Potepan6', 'Type2', 43); mysql> INSERT INTO counttb VALUES ('Potepan7', NULL, 77), (NULL, 'Type2', NULL); mysql> SELECT * FROM counttb; +----------+-------+-------+ | name | type | value | +----------+-------+-------+ | Potepan1 | Type1 | 55 | | Potepan2 | Type3 | 80 | | Potepan3 | Type1 | 99 | | Potepan4 | Type3 | 60 | | Potepan5 | Type3 | 77 | | Potepan6 | Type2 | 43 | | Potepan7 | NULL | 77 | | NULL | Type2 | NULL | +----------+-------+-------+ 8 rows in set (0.00 sec)
作成したデータをCOUNT関数で取得してみましょう。
mysql> SELECT COUNT(*) FROM counttb; +----------+ | COUNT(*) | +----------+ | 8 | +----------+ 1 row in set (0.01 sec)
挿入したデータ8個が取得できているのがわかります。
COUNT関数は、次のようにフィールドごとに取得することも可能です。
mysql> SELECT COUNT(name), COUNT(type), COUNT(value) FROM counttb; +-------------+-------------+--------------+ | COUNT(name) | COUNT(type) | COUNT(value) | +-------------+-------------+--------------+ | 7 | 7 | 7 | +-------------+-------------+--------------+ 1 row in set (0.00 sec)
NULLはCOUNTされないため、取得されているのは7個になっているのがわかります。
2.DISTINCTで重複するデータを除外してCOUNTする
DISTINCTとは、重複するデータを除外してまとめた結果を出力できる構文です。
DISTINCTはCOUNT関数で次のように記述します。
COUNT(DISTINCT expr)
では、先ほど作成したテーブルをDISTINCTを使ってCOUNTしてみましょう。
mysql> SELECT COUNT(DISTINCT name), COUNT(DISTINCT type), COUNT(DISTINCT value) FROM counttb; +----------------------+----------------------+-----------------------+ | COUNT(DISTINCT name) | COUNT(DISTINCT type) | COUNT(DISTINCT value) | +----------------------+----------------------+-----------------------+ | 7 | 3 | 6 | +----------------------+----------------------+-----------------------+ 1 row in set (0.01 sec)
このように、typeで重複していたデータはひとつにまとめられ、3種類存在することが確認できました。
valueも「77」が重複しているため「6」が出力されているのがわかります。
一方、nameには重複がないためDISTINCTを使用していない場合と同じ値が出力されました。
3.COUNT関数でWHERE句を使う方法
COUNT関数でWHERE句を使うと、フィールドの指定した値だけをCOUNTして取得可能になります。
WHERE句の基本的な使い方を知りたい方は、次の記事を参考にしてみるとよいでしょう。
【関連記事】
▶︎SQL where句のサンプルコード集 ワイルドカードやサブクエリを使った複雑な条件指定
ここでは、「Type2」をCOUNT関数とWHERE句で取得してみます。
mysql> SELECT COUNT(*) FROM counttb WHERE type = 'Type2'; +----------+ | COUNT(*) | +----------+ | 3 | +----------+ 1 row in set (0.00 sec)
このように、特定のレコードをCOUNTしたい場合はWHERE句を使いましょう。
4.GROUP BYでグループ化したデータをCOUNTする
例えば、「Type1のデータはいくつあるんだろう」と思った時に、テーブルに格納されているレコードが少ないうちは目視で数えてもよいですが、数が増えてきたら目視で確認は難しいですよね。
そんな時は、GROUP BY句でグループごとに分類してCOUNTします。
COUNT関数を使うには、次のように記述します。
SELECT フィールド名, COUNT FROM テーブル名 GROUP BY フィールド名;
GROUP BY句の後のフィールド名は何個指定してもOKです。
ここでは、counttbテーブルのtypeフィールドをグループ化してCOUNTしてみましょう。
なお、レコード数は一番はじめから少し増やしてあります。
mysql> SELECT type, COUNT(*) FROM counttb GROUP BY type; +-------+----------+ | type | COUNT(*) | +-------+----------+ | Type1 | 3 | | Type3 | 5 | | Type2 | 3 | | NULL | 1 | +-------+----------+ 4 rows in set (0.00 sec)
typeフィールドに含まれる値ごとにデータの数が取得できました。
5.COUNT関数でif文を使う方法
COUNT関数内でif文を使った条件分岐を行うことも可能です。
COUNT(IF(条件式, フィールド名, NULL))
サンプルでvalueが60以上のレコードの行数を取り出してみましょう。
mysql> SELECT * FROM counttb; +-----------+-------+-------+ | name | type | value | +-----------+-------+-------+ | Potepan1 | Type1 | 55 | | Potepan2 | Type3 | 80 | | Potepan3 | Type1 | 99 | | Potepan4 | Type3 | 60 | | Potepan5 | Type3 | 77 | | Potepan6 | Type2 | 43 | | Potepan7 | NULL | 77 | | NULL | Type2 | NULL | | Potepan8 | Type3 | 44 | | Potepan9 | Type1 | 61 | | Potepan10 | Type3 | 57 | | Potepan11 | Type2 | 37 | +-----------+-------+-------+ 12 rows in set (0.00 sec) mysql> SELECT COUNT(IF(value>=60, value, NULL)) FROM counttb; +-----------------------------------+ | COUNT(IF(value>=60, value, NULL)) | +-----------------------------------+ | 6 | +-----------------------------------+ 1 row in set (0.00 sec)
なお、if文を使わず次のような記述でも同じ動作を実現可能です。
mysql> SELECT COUNT(value>=60 OR NULL) FROM counttb; +--------------------------+ | COUNT(value>=60 OR NULL) | +--------------------------+ | 6 | +--------------------------+ 1 row in set (0.00 sec)
まとめ
MySQLのCOUNT関数の使い方を解説しました。
COUNT関数は複数で使うことも可能で、テーブル内のレコードを効率よく取得できる構文です。
ぜひ使いこなして、MySQLをマスターしてください!
「COUNT」と「(*)」 の間にスペースを空けると、エラーが発生してしまうので注意しましょう。