SQL集計関数・JOINを完全攻略!COUNT・SUM・AVGの使い方を初心者向けに徹底解説
生徒
「SQLってよく聞くんですけど、そもそも何をするものなんですか?」
先生
「SQLは、データベースに保存されているデータを、取り出したり、追加したり、変更したりするための言葉です。名簿や表を操作するための命令だと思ってください。」
生徒
「パソコンが苦手でも理解できますか?」
先生
「大丈夫です。表を見るところから順番に説明するので、紙の名簿を扱う感覚で理解できます。」
生徒
「たくさんのデータの中から、合計を出したり平均を計算したりもできるんでしょうか?」
先生
「もちろんです!今日はその『集計』という便利な機能を中心に、複数の表をくっつける方法も学びましょう。」
1. SQLとは何か?
SQL(シィーケル、またはエスキューエル)は、データベースと呼ばれる「大量のデータを整理して保存する箱」に対して指示を出すための専用の言語です。例えば、ネットショップの注文履歴や、学校の生徒名簿、スマホアプリのユーザー情報など、世の中のあらゆるデータはデータベースに保管されています。
パソコンをあまり触ったことがない方でも、Excel(エクセル)のような「表」をイメージすれば簡単です。縦の列(カラム)と横の行(レコード)で構成された表に対して、「この条件に合うデータを取ってきて!」「この数字を全部足して!」とお願いするのがSQLの役割です。プログラミング未経験の方でも、決まった型を覚えるだけで魔法のようにデータを操れるようになります。
エンジニアの必須スキル「SQL」を、 図解と豊富な練習問題でゼロから体系的に学びたい人へ。 MySQLやPostgreSQLなど、各種データベースに対応した不朽の入門書です。
SQL 第2版 ゼロからはじめるデータベース操作をAmazonで見る※ Amazon広告リンク
2. データを計算する「集計関数」の基本
データベースには何万、何十万という膨大なデータが入ることがあります。それを人間が一つずつ電卓で計算するのは不可能です。そこで登場するのが「集計関数(しゅうけいかんすう)」です。関数とは、特定の命令を出すための「便利な道具」のようなものだと考えてください。
代表的な集計関数には、以下のものがあります。
- COUNT(カウント): データの件数を数える
- SUM(サム): 数値の合計を出す
- AVG(アベレージ): 平均値を出す
- MAX(マックス): 最大値を見つける
- MIN(ミニマム): 最小値を見つける
COUNT関数でデータの件数を数えてみよう
まずは、お店の「商品リスト」を例にして、登録されている商品の総数を数えてみましょう。SQLでは「SELECT(セレクト)」という言葉を使って、「どこから何を持ってくるか」を指定します。
id | item_name | category | price
---+-----------+----------+-------
1 | リンゴ | 果物 | 150
2 | バナナ | 果物 | 100
3 | キャベツ | 野菜 | 200
4 | トマト | 野菜 | 120
5 | 牛乳 | 飲料 | 250
6 | お茶 | 飲料 | 150
SELECT COUNT(*)
FROM products;
COUNT(*)
----------
6
このクエリ(命令文)を実行すると、結果として「6」という数字が返ってきます。これは、表の中に6つの商品(行)があることを示しています。COUNT(*)の「*(アスタリスク)」は「すべて」という意味で、行全体を数えるときに使います。
SUM関数とAVG関数で売り上げを計算しよう
次に、数値の合計や平均を出す方法です。例えば、すべてのアイスクリームの在庫金額や、テストの平均点などを知りたいときに使います。今回は、商品価格の合計と平均を計算してみましょう。
SELECT SUM(price), AVG(price)
FROM products;
SUM(price) | AVG(price)
-----------+-----------
970 | 161.66
SUM(price)は「price(価格)」という列の数字をすべて足し合わせた結果です。AVG(price)はその平均値です。このように、SQLを使うだけで一瞬にして複雑な計算が終わります。
3. カテゴリごとにまとめる「GROUP BY」
「全体の合計だけじゃなくて、野菜の合計や、果物の合計を知りたい!」ということもありますよね。そんな時に使うのが「GROUP BY(グループ・バイ)」という命令です。これは、特定の列(今回の場合はカテゴリ)が同じもの同士をグループにまとめる機能です。
料理で例えると、たくさんの食材を「野菜」「お肉」「魚」といったボウルに分けてから、それぞれの重さを量るようなイメージです。
SELECT category, COUNT(*), SUM(price)
FROM products
GROUP BY category;
category | COUNT(*) | SUM(price)
---------+----------+-----------
果物 | 2 | 250
野菜 | 2 | 320
飲料 | 2 | 400
実行結果を見ると、カテゴリごとに商品の数と合計金額が表示されています。これで「どのジャンルが売上に貢献しているか」といった分析が簡単にできるようになります。GROUP BYを使うときは、SELECTの後に「グループ分けに使う列の名前」を忘れずに書くのがルールです。
4. 別の表をくっつける「JOIN」の仕組み
実際のデータベースでは、すべての情報を一つの大きな表に入れることはしません。管理を楽にするために、情報はバラバラの表に分けて保存されています。例えば、「注文履歴の表」には「誰が買ったか」を番号(ID)だけで保存し、詳しい名前などは「お客様名簿の表」に保存します。
しかし、画面に表示するときには、それらを合体させて一つの表として見たいですよね。この「表と表をくっつける」操作を「JOIN(ジョイン)」と呼びます。最もよく使われるのが「INNER JOIN(内部結合)」です。
実際に表を合体させてみよう
「注文データ(orders)」と「商品データ(products)」の2つの表があるとします。注文データには「どの商品のIDを何個買ったか」が記録されていますが、商品名が書いてありません。これをJOINを使って解決しましょう。
【orders(注文)テーブル】
order_id | product_id | quantity
---------+------------+----------
101 | 1 | 2
102 | 3 | 1
103 | 5 | 3
104 | 2 | 5
【products(商品)テーブル】
id | item_name | price
---+-----------+-------
1 | リンゴ | 150
2 | バナナ | 100
3 | キャベツ | 200
4 | トマト | 120
5 | 牛乳 | 250
この2つの表を「product_id」と「id」をヒントにしてくっつけます。パズルのピースを合わせるような作業です。
SELECT orders.order_id, products.item_name, orders.quantity
FROM orders
INNER JOIN products ON orders.product_id = products.id;
order_id | item_name | quantity
---------+-----------+----------
101 | リンゴ | 2
102 | キャベツ | 1
103 | 牛乳 | 3
104 | バナナ | 5
このように、注文番号の隣に正しい商品名が表示されるようになりました。ONという言葉の後に、「どの列とどの列が同じ意味か」を指定するのがポイントです。初心者の方は「この番号とこの番号が一致する行を横につなげて!」と指示しているのだと覚えてください。
5. データを絞り込む「WHERE」と「HAVING」の違い
SQLでデータを抽出するとき、特定の条件で絞り込みたいことがあります。ここで初心者が迷いやすいのが「WHERE(ウェア)」と「HAVING(ハビング)」の使い分けです。
WHERE: 集計をする前にデータを絞り込む(元の表から選ぶ)
HAVING: 集計をした後の結果から、さらに条件で絞り込む
例えば、「150円以上の商品だけを集計したい」場合はWHEREを使い、「カテゴリごとの合計金額が300円以上のグループだけを表示したい」場合はHAVINGを使います。手順の順番が違うだけなのですが、これは非常に重要です。SQLは実行される順番が決まっているからです。
【実行の順番イメージ】
- FROM(どの表から?)
- WHERE(条件に合う行だけ取り出す)
- GROUP BY(グループにまとめる)
- 集計関数(合計や平均を計算する)
- HAVING(計算結果でさらに絞る)
- SELECT(画面に出す項目を決める)
この流れを理解しておくと、複雑なデータ分析もスムーズに行えるようになります。例えば、昨日の売り上げデータだけを取り出して(WHERE)、店舗ごとにまとめて(GROUP BY)、合計売上が目標を超えている店舗だけを表示する(HAVING)といった具合です。
6. 便利なキーワード:エイリアス(AS)
最後に、もっとSQLを読みやすくするテクニックを紹介します。集計関数を使うと、実行結果の見出しが「COUNT(*)」や「SUM(price)」といった少し難しい英語になってしまいます。これを日本語やわかりやすい名前に変えるのが「AS(アズ)」、別名(エイリアス)設定です。
SELECT item_name AS 商品名, price AS 価格
FROM products;
商品名 | 価格
---------+------
リンゴ | 150
バナナ | 100
キャベツ | 200
このように、「AS」を使うことで、出力結果が誰にでもわかる形になります。プログラミング未経験の方が業務でSQLを使う際も、このエイリアスを使っておくと、他の人にデータを渡したときにとても喜ばれます。
SQLは一見すると難しい英語の羅列に見えますが、その正体は「コンピュータに対する丁寧なお願い」です。一つひとつの単語の意味を理解すれば、プログラミング経験がなくても、自由自在にデータを操ることができるようになります。まずは基本的な集計から試して、データベースの楽しさを体感してみてください。