SQLで複数テーブルを結合する方法を徹底解説!初心者でも図解でわかるJOINと集計の基本
生徒
「SQLの基本はわかったのですが、テーブルが2つ以上になると急に難しく感じます。なぜバラバラの表をくっつける必要があるんですか?」
先生
「実は、データベースでは情報を整理するために、あえて表を分けて保存するのがルールなんです。例えば『注文リスト』と『商品リスト』を分けておけば、商品の値段が変わったときも一箇所の修正で済みますよね。」
生徒
「なるほど!でも、バラバラだと誰が何を買ったか分からなくなりませんか?」
先生
「そこで登場するのが『JOIN(結合)』という命令です。共通の目印を使って、パズルのように表を合体させるんですよ。今日はその魔法のような仕組みを、お買い物サイトの例で見ていきましょう。」
1. SQLとは何か?
SQL(エスキューエル)は、データベースと呼ばれる「大量のデータを整理して保存する箱」に対して指示を出すための言語です。例えば、会員名簿の中から特定の人を探したり、新しい人を追加したりするときに使います。パソコンの操作が苦手な方でも、Excel(エクセル)のような「表」をイメージできれば大丈夫です。
データベースの世界では、この「表」のことをテーブルと呼びます。SQLを使うことで、複数のテーブルから必要な情報だけを抽出したり、計算したりすることが可能になります。今回は特に、実務で最もよく使われる「テーブルの結合」と「データの集計」について深掘りしていきましょう。
2. なぜテーブルを分けるのか?「正規化」の考え方
初心者の方が最初に疑問に思うのが、「なぜ最初から一つの大きな表にしないのか?」という点です。例えば、一つの表に「購入者の名前」と「商品名」と「商品の説明」を全部書いてしまうと、同じ人が何度も買い物をしたときに、その人の住所や名前を何度も繰り返し書くことになります。これはデータの無駄遣いですし、もしその人が引っ越したときに、全ての行を書き直さなければならず、間違いの元になります。
そこで、データベースでは情報を種類ごとに切り分けます。これを「正規化(せいきか)」と呼びます。例えば、「顧客テーブル」にはお客さんの情報を、「注文テーブル」にはいつ誰が何を買ったかという情報だけを持たせるのです。こうすることで、データがスッキリと整理され、管理が非常に楽になります。
3. 複数のテーブルをつなぐ「JOIN(結合)」の仕組み
バラバラになったテーブルを、必要なときだけ一時的にくっつける操作がJOIN(ジョイン)です。日本語では「結合」と言います。このとき、二つのテーブルを繋ぐための「共通の鍵」となる項目が必要です。一般的には「ID」という番号がその役割を果たします。
例えば、「注文テーブル」にある「顧客ID」という数字を見て、「顧客テーブル」の同じ番号の人を探し出し、名前を引っ張ってくるというイメージです。この操作により、「誰が」「いつ」「何を」買ったのかという完全な情報を得ることができます。
最もよく使われる結合方法です。両方のテーブルに存在するデータだけを合体させます。例えば、注文したことがないお客さんの情報は表示されず、「誰かが注文した」という事実があるデータだけが表示されます。
具体例:注文データとお客さんの名前を合体させる
まずは、結合する前の2つのテーブルを見てみましょう。
【customersテーブル(顧客名簿)】
id | name | city
---+----------+---------
1 | 田中太郎 | 東京都
2 | 佐藤花子 | 大阪府
3 | 鈴木一郎 | 福岡県
4 | 高橋良子 | 北海道
【ordersテーブル(注文履歴)】
order_id | customer_id | product | price
---------+-------------+--------------+-------
101 | 1 | パソコン | 100000
102 | 2 | マウス | 3000
103 | 1 | キーボード | 5000
104 | 3 | モニター | 20000
この2つのテーブルを、「customer_id(顧客の番号)」をヒントにして結合するSQLを書いてみましょう。
SELECT orders.order_id, customers.name, orders.product
FROM orders
INNER JOIN customers ON orders.customer_id = customers.id;
【実行結果】
order_id | name | product
---------+----------+------------
101 | 田中太郎 | パソコン
102 | 佐藤花子 | マウス
103 | 田中太郎 | キーボード
104 | 鈴木一郎 | モニター
このように、注文履歴にお客さんの名前が並んで表示されました。これがJOINの力です。注目してほしいのは、高橋良子さん(ID:4)は一度も注文していないので、この結果には出てこないという点です。これが「内部結合(INNER JOIN)」の特徴です。
4. データをまとめる「集計(GROUP BY)」の使い方
次に、バラバラのデータを「合計」したり「平均」を出したりする方法を学びましょう。これを集計(しゅうけい)と言います。例えば、「一人あたりいくら使ったか?」や「商品が全部で何個売れたか?」を知りたいときに使います。
集計の際に欠かせないのが、GROUP BY(グループバイ)という命令です。これは、特定の項目(例えば名前や日付)ごとにデータをグループ分けする役割を持っています。グループに分けた後で、合計を出す SUM(サム)や、件数を数える COUNT(カウント)といった関数を組み合わせて使います。
具体例:顧客ごとの合計購入金額を計算する
先ほどの「注文履歴」を使って、お客さんごとに合計いくらお買い物をしてくれたかを計算してみましょう。今度は結合(JOIN)と集計(GROUP BY)を同時に使います。少し難しく見えますが、一つずつ順番に考えれば大丈夫です。
SELECT customers.name, SUM(orders.price) AS total_spent
FROM orders
INNER JOIN customers ON orders.customer_id = customers.id
GROUP BY customers.name;
【実行結果】
name | total_spent
---------+-------------
田中太郎 | 105000
佐藤花子 | 3000
鈴木一郎 | 2000
このSQLでは、まず表を合体させ、その後に「名前(name)」ごとにグループを作っています。そして、そのグループの中にある「価格(price)」を全て足し算(SUM)しています。AS total_spent というのは、結果の列に「合計金額」という別名を付けて分かりやすくしているだけなので安心してください。
5. 条件を絞り込む「WHERE」と「HAVING」の違い
データを取得するとき、特定の条件に合うものだけを選びたいことがよくあります。ここで初心者がつまずきやすいのが WHERE と HAVING の使い分けです。
- WHERE(ウェア): 集計する「前」にデータを絞り込みます。例えば「1万円以上の商品だけを対象にする」といった場合です。
- HAVING(ハビング): 集計した「後」に結果を絞り込みます。例えば「合計金額が5,000円以上になった人だけを表示する」といった場合です。
具体例:特定の条件でデータを抽出する
「1回のお買い物で4,000円以上の商品を買った、東京都在住の人」を探してみましょう。ここでは集計ではなく、純粋な抽出を行います。複数の条件を指定するときは AND を使います。
SELECT customers.name, orders.product, orders.price
FROM orders
INNER JOIN customers ON orders.customer_id = customers.id
WHERE customers.city = '東京都' AND orders.price >= 4000;
【実行結果】
name | product | price
---------+------------+--------
田中太郎 | パソコン | 100000
田中太郎 | キーボード | 5000
このように、複雑な条件を組み合わせて必要なデータだけをピンポイントで取り出すことができます。これがSQLが「最強のデータ操作ツール」と呼ばれる理由です。
6. データベース操作で失敗しないための考え方
SQLを書くときに一番大切なのは、いきなりコードを書き始めないことです。まずは「どんな表が手元にあって、最終的にどんな形の表が欲しいのか」を紙に書いたり頭の中でイメージしたりすることが成功の近道です。
特に複数のテーブルを扱うときは、以下の3ステップを意識してみてください。
- どのテーブルが必要か選ぶ: 欲しい情報はどの箱に入っているか?
- 共通の鍵を見つける: テーブル同士をどうやって繋ぐか?(IDなど)
- どんな加工をするか決める: 合計を出したいのか、特定の条件で絞りたいのか?
この手順さえ守れば、どれだけデータが増えても、どれだけテーブルが複雑になっても迷うことはありません。SQLは、一度覚えてしまえば一生使えるスキルです。事務職の方からプログラマーを目指す方まで、データを扱う全ての人にとって強力な武器になるでしょう。
最初はエラーが出ても怖がる必要はありません。コンピューターは「その書き方は分かりません」と言っているだけです。一つ一つの単語の意味を確認しながら、少しずつ練習していきましょう。データベースを自由に操れるようになると、仕事の効率が劇的に上がりますよ!