【SQL】データをグループに分けて数を数える!「GROUP BY と COUNT(*)」|情報処理問題1000本ノック
「商品カテゴリごとの売上件数は?」「部署ごとの社員数は?」など、データを特定の共通点でグループにまとめ、それぞれの件数を自動集計する「GROUP BY」と「COUNT(*)」の連携技を攻略しましょう。
1. 【 問題 】:データのグループ化と集計関数
【 問題 】 次の「受講」表に対して、SQL文を実行したとき、得られる検索結果の行数(レコード数)として、最も適切なものはどれでしょうか?
| 受講番号 | コース名 | 受講者ID | 評価 |
|---|---|---|---|
| 1 | Java入門 | U101 | A |
| 2 | SQL基礎 | U202 | B |
| 3 | Java入門 | U303 | A |
| 4 | Python応用 | U101 | C |
| 5 | SQL基礎 | U404 | A |
| 6 | Java入門 | U202 | B |
| 7 | SQL基礎 | U303 | A |
SELECT コース名, COUNT(*) FROM 受講 WHERE 評価 = 'A' GROUP BY コース名
① 2行
② 3行
③ 4行
④ 7行
2. 正解:
正解: ① 2行
3. 解説:絞り込んでからグループに分ける手順がポイント
このSQL文を解き明かすカギは、処理が実行される「順番」にあります。SQLは書かれている順番(左から右)ではなく、内部的には以下のステップでデータを処理していきます。
ステップ1(WHERE句):まず「受講」表全体から、評価が 'A' の行だけをハサミで切り取って集めます。この時点で以下の4行に絞り込まれます。
・受講番号1(Java入門)
・受講番号3(Java入門)
・受講番号5(SQL基礎)
・受講番号7(SQL基礎)
ステップ2(GROUP BY句):絞り込まれた4行を、指定された「コース名」ごとに部屋(グループ)に小分けします。
・「Java入門」の部屋(受講番号1, 3 の計2行)
・「SQL基礎」の部屋(受講番号5, 7 の計2行)
※「Python応用」は評価が'C'なので、ステップ1で消滅しており、部屋すら作られません。
ステップ3(SELECT句 と COUNT(*)):各部屋の看板(コース名)と、その部屋の中に何行データが入っているか(`COUNT(*)`)を数えて出力します。
【 実行結果の表(サンプル) 】 ← ココが問題の正解!
| コース名 | COUNT(*) |
|---|---|
| Java入門 | 2 |
| SQL基礎 | 2 |
「Java入門」と「SQL基礎」の合計2行(2つのグループ)が抽出されます。
★ ② 3行の罠:`WHERE 評価 = 'A'` による事前の絞り込みを見落とし、単純に元の表にあるコース名の種類(Java入門、SQL基礎、Python応用)の数だけグループを作ってしまった人を落とす罠です。本番で最も多い間違いです。
★ ③ 4行の罠:評価が 'A' である行数(4行)をそのまま答えてしまった場合、あるいはグループ化の意味を勘違いしてしまった場合の数値です。
★ ④ 7行の罠:SQL文の意味を全く考慮せず、元の「受講」表の全レコード数(7行)をそのまま答えてしまった場合の数値です。
1. 理解のコツ: 「学校のクラス替えとアンケート」に例えてみましょう。
・全校生徒(元の表の7行)の中から、まず「サッカーが好きな人(評価='A'の4人)」だけを体育館に集めます(WHERE句)。
・次に、その集まった4人を「何年何組か(コース名)」ごとに整列させます(GROUP BY句)。すると、「1組(Java)」の列と「2組(SQL)」の列の、合計2本の列(2行)ができますよね。3組(Python)の人はサッカー好きがゼロだったので、列を作る人自体がいません。
・最後に、それぞれの列に並んでいる人数を数えて「1組:2人、2組:2人」と発表する(COUNT(*))。これがこのSQLの一連の流れです。
2. 試験対策の視点: 「`GROUP BY`句で指定した列名」は、必ず`SELECT`の後ろ(出力する列)にもセットで書くというルールを覚えておきましょう。また、試験の難易度が上がると、「グループ化した後の結果」に対してさらに条件をかける `HAVING`句(例:`HAVING COUNT(*) >= 2` など)との組み合わせ問題が午後試験の長文問題で超高確率で出題されます。WHERE句はグループ化の「前」の絞り込み、HAVING句はグループ化の「後」の絞り込み、という順序の鉄則を頭に叩き込んでおくことが重要です。
4. まとめ
「特定の列の値が同じデータ同士をグループにまとめ、COUNT(*)やSUM、AVGなどの集計関数を使ってグループごとの統計値を算出するSQL構文」。これがGROUP BYです。WHERE句による絞り込みが先に行われるという『実行順序のルール』を意識しながら、確実に得点源にしていきましょう!