MySQL COUNT関数の使い方|データベースのレコード件数を簡単に集計する方法
生徒
「SQLってよく聞くんですけど、そもそも何をするものなんですか?」
先生
「SQLは、データベースに保存されているデータを、取り出したり、追加したり、変更したりするための言葉です。名簿や表を操作するための命令だと思ってください。」
生徒
「パソコンが苦手でも理解できますか?」
先生
「大丈夫です。表を見るところから順番に説明するので、紙の名簿を扱う感覚で理解できます。」
1. SQLとは何か?データベース操作の基本を理解しよう
SQL(エスキューエル)は、データベースという「大量の情報を整理して保管するシステム」と会話するための言語です。例えば、顧客管理システムや在庫管理システムの裏側では、必ずデータベースが動いています。MySQLは、世界中で広く使われているデータベース管理システムの一つで、SQLという言葉を使ってデータを操作します。データベース初心者でも、基本的なSQLを覚えるだけで、大量のデータを効率的に扱えるようになります。
2. COUNT関数とは?データの「数」を調べる基本ツール
COUNT関数(カウント関数)は、SQLの中で最もよく使われる関数の一つです。その名の通り、「数を数える」ための関数です。関数とは、特定の処理をして結果を返す「便利なツール」のようなものだと考えてください。データベースを使って何かを管理するとき、「今、登録されている顧客は全部で何人ですか?」「今月の売上伝票は何件ありますか?」といった「数」を知りたい場面はとても多いですよね。そんな時に活躍するのがCOUNT関数です。MySQLを使ったデータ集計の第一歩として、まずはこのCOUNT関数をマスターしましょう。
3. 基本の形:テーブル全体の行数を数える
COUNT関数の最もシンプルな使い方は、テーブル(表)にデータが全部で何行あるのかを数えることです。例えば、会員名簿のテーブルがあったとします。まずはその中身を見てみましょう。
【会員テーブル (members)】
id | name | age | prefecture | join_date
---+------------+-----+--------------+------------
1 | 山田太郎 | 25 | 東京都 | 2023-01-10
2 | 佐藤花子 | 19 | 神奈川県 | 2023-02-15
3 | 鈴木一郎 | 30 | 埼玉県 | 2023-03-20
4 | 高橋涼子 | 28 | 東京都 | 2023-04-05
5 | 田中健太 | 22 | 千葉県 | 2023-05-12
6 | 伊藤麻衣 | 35 | 東京都 | 2023-06-18
この会員テーブルに登録されている会員の総数を調べたい場合、次のようなSQL文を書きます。
SELECT COUNT(*) AS member_count
FROM members;
このSQLを分解して説明します。
SELECTは「取り出して表示して」という命令です。
COUNT(*)は「全ての行(レコード)を数えて」という意味です。アスタリスク(*)は「全部」を表す記号です。
AS member_countは、数えた結果の列に「member_count」という名前を付けています。ASは「〜として」という意味で、結果を見やすくするためのおまじないだと思ってください。
FROM membersは「membersという名前のテーブルから」という意味です。
実行結果は以下のようになります。
member_count
------------
6
これで、会員テーブルには6名の会員が登録されていることがわかりました。データベース操作において、全体の規模を把握するのは基本中の基本です。
4. 条件付きカウント:WHERE句と組み合わせてピンポイントで数える
「全体の数」がわかったら、次は「条件に当てはまるものだけの数」を知りたくなるでしょう。例えば、「東京都に住んでいる会員は何人ですか?」という質問です。そんな時は、WHERE句(ウェア句)とCOUNT関数を組み合わせます。WHERE句は「〜という条件の」というフィルターのような役割をします。
SELECT COUNT(*) AS tokyo_member_count
FROM members
WHERE prefecture = '東京都';
このSQL文では、WHERE prefecture = '東京都'という部分がフィルターです。「prefecture(都道府県)が'東京都'と等しい」という条件に一致する行だけを探し、その行数をCOUNT関数で数えています。結果は以下の通りです。
tokyo_member_count
------------------
3
これで、東京都在住の会員は3名いることがわかりました。WHERE句を使うことで、データベースから必要な情報だけをピンポイントで抽出する力が身につきます。これはMySQLでデータを分析する上で非常に重要なスキルです。
5. 応用編:COUNTとGROUP BYでグループ別に数を集計する
さらに一歩進んで、「都道府県別に会員が何人いるのか一覧で知りたい」という場合はどうでしょうか。このような「グループごとの数」を集計するには、GROUP BY句(グループバイ句)を使います。GROUP BYはデータをグループ分けするための機能です。
SELECT prefecture, COUNT(*) AS count_by_prefecture
FROM members
GROUP BY prefecture;
このSQL文の流れはこうです。
1. FROM membersで会員テーブルを対象にします。
2. GROUP BY prefectureで、prefecture(都道府県)の値が同じ行同士をグループにまとめます(東京都グループ、神奈川県グループ…)。
3. それぞれのグループに対して、COUNT(*)で行数を数えます。
4. SELECTで、グループ名(prefecture)と数えた結果(count_by_prefecture)を表示します。
実行結果は以下のようになります。
prefecture | count_by_prefecture
-----------+---------------------
東京都 | 3
神奈川県 | 1
埼玉県 | 1
千葉県 | 1
これで、データが視覚的でわかりやすい表として出力されました。東京都が3名、その他の県がそれぞれ1名ずつであることが一目瞭然です。この「GROUP BYとCOUNTの組み合わせ」は、売上データを商品カテゴリー別に集計したり、顧客データを年代別に集計したりする時など、あらゆるデータ分析の場面で使う超重要パターンです。
6. COUNT(DISTINCT)で「重複を除いた」ユニークな数を数える
COUNT関数には、もう一つ知っておくと便利な使い方があります。それは「重複を除いて数える」方法です。例えば、先ほどの会員テーブルで、「会員が登録されている都道府県は、全部で何県ありますか?」と聞かれたらどうでしょう。テーブルには「東京都」が3回登場していますが、県の数としては1つと数えたいですよね。このような「種類の数」を数える時に使うのがCOUNT(DISTINCT ...)です。DISTINCT(ディスティンクト)は「異なる、重複しない」という意味です。
SELECT COUNT(DISTINCT prefecture) AS unique_prefecture_count
FROM members;
このSQLでは、DISTINCT prefectureの部分で、prefecture列の値から重複を取り除いた一覧(東京都、神奈川県、埼玉県、千葉県)を作ります。そして、COUNT関数でその一覧の項目数を数えています。
unique_prefecture_count
-----------------------
4
結果は「4」です。たとえ「東京都」が何回登場していても、1種類として数え、会員がいる都道府県は全部で4県あるとわかりました。このCOUNT(DISTINCT)は、データのバリエーション(種類)がどれだけあるのかを調べる時に大変役立つテクニックです。データベース初心者の方が次のステップに進むための強力な武器になります。
7. よくあるエラーと注意点 NULLの扱いを理解する
COUNT関数を使いこなす上で、一つ重要な注意点があります。それはNULL(ヌル)の扱いです。NULLは「データが存在しない」「未入力」「不明」を表す特別な値です。COUNT関数は、COUNT(*)とCOUNT(列名)でNULLの数え方が異なります。
試しに、email(メールアドレス)が未入力(NULL)の会員を追加したテーブルで実験してみましょう。
id | name | email
---+------------+-------------------
1 | 山田太郎 | taro@example.com
2 | 佐藤花子 | hanako@example.com
3 | 鈴木一郎 | NULL
4 | 高橋涼子 | kyoko@example.com
-- テーブルの全行数を数える
SELECT COUNT(*) AS count_all FROM members;
-- email列の値が入っている行のみを数える
SELECT COUNT(email) AS count_email FROM members;
実行結果:
count_all
---------
4
count_email
-----------
3
COUNT(*)は行の存在そのものを数えるので、NULLに関係なく「4」と返します。一方、COUNT(email)はemail列の値を1つ1つチェックし、NULLでない値だけを数えるので「3」と返します。データを正確に集計するためには、この違いを理解しておくことが大切です。MySQLを使ったデータ分析では、NULLの存在を常に意識することが、正確な結果を得るコツです。