SQLのJOIN(結合)を完全攻略!初心者でも図解でわかるデータベース操作
生徒
「SQLの勉強を始めたんですけど、『JOIN(ジョイン)』というところでつまずいています。テーブルをくっつけるってどういうことですか?」
先生
「たしかに、最初は難しく感じますよね。JOINは、バラバラに保存されている複数の表(テーブル)を、共通の目印を使って一つの大きな表にまとめる作業のことですよ。」
生徒
「なんで最初から一つの表にまとめておかないんですか?」
先生
「いいところに気づきましたね!もし一つの大きな表に全部詰め込むと、同じ情報が何度も出てきて管理が大変になるんです。だから、普段はバラバラに管理して、必要な時だけSQLで合体させるんですよ。」
1. SQLとは何か?
SQL(エスキューエル)は、データベースと呼ばれる「大量のデータを整理して保存する箱」に対して指示を出すための言語です。例えば、ネットショップの会員名簿の中から特定の人を探したり、注文履歴を確認したりするときに使います。プログラミングと聞くと難しそうですが、SQLは「これを取ってきて!」とお願いするだけの、とてもシンプルな言葉です。
データベースの中には、Excel(エクセル)のような「テーブル」という表形式でデータが入っています。基本的には、行(横のデータ)と列(縦の項目)で構成されています。SQLはこの表を操作して、私たちが欲しい情報だけを抽出する役割を担っています。
2. なぜテーブルを分けるのか?(正規化の考え方)
SQLのJOINを学ぶ前に、なぜデータを分けるのかを知っておきましょう。これを専門用語で「正規化(せいきか)」と呼びます。例えば、お買い物サイトで「誰が・何を・いつ買ったか」を一つの表に書くと、同じ人が買い物をするたびに、その人の住所や電話番号を何度も書かなければなりません。これはデータの無駄ですし、もし住所が変わったときに全ての行を書き直すのは大変です。
そこで、「ユーザー情報の表」と「注文履歴の表」を別々に作ります。このように分けておくことで、データがスッキリ整理され、間違いが起こりにくくなります。そして、この分かれた表をくっつけて表示させる魔法が、今回学習するJOIN(結合)なのです。
3. JOIN(結合)の仕組みを図解でイメージしよう
JOINを理解する鍵は、二つのテーブルを繋ぐ「共通の項目」です。これを「キー」と呼びます。例えば、「ユーザーID」という番号が両方のテーブルにあれば、それを目印にして合体させることができます。
最もよく使われるのがINNER JOIN(内部結合)です。これは、両方のテーブルに存在するデータだけを合体させる方法です。片方にしかないデータは表示されません。パズルのピースがぴったり合うものだけを繋げるイメージですね。
4. INNER JOINでテーブルを合体させてみよう
それでは、実際にSQLを書いてみましょう。まずは、合体させる前の二つのテーブル「users(ユーザー)」と「orders(注文)」の中身を確認します。
【usersテーブル(ユーザー名簿)】
user_id | name | city
--------+----------+--------
1 | 山田太郎 | 東京
2 | 佐藤花子 | 大阪
3 | 鈴木一郎 | 福岡
4 | 田中次郎 | 名古屋
【ordersテーブル(注文履歴)】
order_id | user_id | product | price
---------+---------+------------+-------
101 | 1 | パソコン | 100000
102 | 2 | マウス | 3000
103 | 1 | キーボード | 5000
104 | 3 | モニター | 20000
この二つのテーブルを「user_id」をヒントにして結合します。誰が何を買ったのかを一覧にするSQLは以下の通りです。
SELECT users.name, orders.product, orders.price
FROM users
INNER JOIN orders
ON users.user_id = orders.user_id;
【実行結果(合体した表)】
name | product | price
---------+------------+-------
山田太郎 | パソコン | 100000
佐藤花子 | マウス | 3000
山田太郎 | キーボード | 5000
鈴木一郎 | モニター | 20000
いかがでしょうか?「田中次郎」さんは一度も買い物をしていないため、注文履歴テーブルにデータがなく、結果には表示されていません。これが「共通するものだけを表示する」内部結合の特徴です。
5. 左外部結合(LEFT JOIN)で全てのデータを表示する
次に、LEFT JOIN(レフトジョイン)について学びましょう。これは「左側のテーブル(最初に書いたテーブル)のデータは、相手がいなくても全部表示する」という方法です。買い物をしていない田中次郎さんも含めて、全ユーザーの状況を知りたい時に使います。
SELECT users.name, orders.product
FROM users
LEFT JOIN orders
ON users.user_id = orders.user_id;
【実行結果】
name | product
---------+------------
山田太郎 | パソコン
佐藤花子 | マウス
山田太郎 | キーボード
鈴木一郎 | モニター
田中次郎 | NULL
田中次郎さんの商品の欄には「NULL(ヌル)」と表示されました。これは「データが空っぽですよ」という意味の特別な言葉です。LEFT JOINを使うことで、漏れなくリストを作ることができます。
6. データを集計してみよう(GROUP BYと関数)
データを結合した後は、合計や平均を計算したくなりますよね。これを「集計(しゅうけい)」と呼びます。SQLには便利な計算機能が備わっています。
- SUM(サム):合計を出す
- AVG(アベレージ):平均を出す
- COUNT(カウント):件数を数える
例えば、「ユーザーごとに合計でいくら使ったか」を計算してみましょう。ここで使うのがGROUP BY(グループバイ)です。同じ名前の人を一つのグループにまとめて計算します。
SELECT users.name, SUM(orders.price) AS total_spent
FROM users
INNER JOIN orders
ON users.user_id = orders.user_id
GROUP BY users.name;
【実行結果】
name | total_spent
---------+-------------
山田太郎 | 105000
佐藤花子 | 3000
鈴木一郎 | 20000
山田太郎さんは2回買い物をしているので、その合計金額が計算されています。「AS total_spent」というのは、結果の列に分かりやすい名前(別名)をつけているだけなので、難しく考えなくて大丈夫です。
7. 複雑な条件でデータを絞り込む
さらに、「合計金額が5000円以上の人だけ」を表示したいといった、条件の絞り込みも可能です。通常の絞り込みには「WHERE」を使いますが、集計した後の結果に対して条件をつけたいときはHAVING(ハビング)という言葉を使います。
SELECT users.name, SUM(orders.price) AS total_spent
FROM users
INNER JOIN orders
ON users.user_id = orders.user_id
GROUP BY users.name
HAVING SUM(orders.price) >= 5000;
【実行結果】
name | total_spent
---------+-------------
山田太郎 | 105000
鈴木一郎 | 20000
合計3000円だった佐藤花子さんがリストから消えましたね。このように、結合(JOIN)、集計(SUM / GROUP BY)、絞り込み(HAVING)を組み合わせることで、複雑な分析が自由自在にできるようになります。
8. 初心者が間違えやすいポイント
SQLを書くときに初心者がよくやってしまうミスがいくつかあります。まず一つ目は「コンマ(,)」の付け忘れや、全角スペースの使用です。コンピュータは非常に繊細なので、半角のスペースを使うべきところに全角が入っているだけで動かなくなってしまいます。日本語入力モードのまま命令を打たないように注意しましょう。
二つ目は、どのテーブルの列なのかをはっきりさせないことです。例えば、両方のテーブルに「id」という列がある場合、ただ「id」と書くとコンピュータはどちらのidか分からず困ってしまいます。そのため「users.user_id」のように「テーブル名.列名」の形で書く癖をつけておくと、間違いが少なくなりますよ。
9. データベースを学ぶメリット
今は「JOINって難しいな」と思っているかもしれませんが、これをマスターすると仕事の幅が劇的に広がります。Excelで何時間もかけてコピペしていた作業が、SQL一行で一瞬にして終わることも珍しくありません。また、エンジニアだけでなく、マーケティングや事務職の方にとっても、データを自分で取り扱えるスキルは非常に大きな武器になります。まずは、小さな表をくっつける練習から始めて、少しずつ慣れていきましょう。