MySQL入門!INNER JOINとLEFT JOINの違いを初心者向けに徹底解説
生徒
「データベースの勉強を始めたのですが、複数の表をくっつけて表示する方法が難しくて…。JOIN(ジョイン)っていうのを使うんですよね?」
先生
「その通りです!特に『内部結合(INNER JOIN)』と『左外部結合(LEFT JOIN)』は、実務でも一番よく使いますよ。今日は、パズルのピースを合わせるような感覚で、その違いをマスターしましょう。」
生徒
「パズルですか?なんだか楽しそうですね!でも、どっちを使えばいいのか迷いそうで不安です。」
先生
「心配いりません。共通点があるものだけを表示するか、それとも片方のデータを全部残すか、という基準さえ覚えれば完璧です。名簿と注文表を例に、ゆっくり見ていきましょう。」
1. SQLとは何か?
SQL(エスキューエル)は、データベースと呼ばれる「大量のデータを整理して保存する箱」に対して指示を出すための言語です。例えば、会員名簿の中から特定の人を探したり、新しい人を追加したりするときに使います。
MySQL(マイエスキューエル)は、世界中で最も使われているデータベース管理システムの一つです。プログラミング未経験の方でも、Excel(エクセル)のような「表」をイメージできれば大丈夫です。SQLを使って、それらの表を自由自在に操ることができるようになります。
2. 「結合(JOIN)」が必要な理由を知ろう
データベースを扱うとき、すべての情報を一つの大きな表に入れることはしません。例えば「お客様の情報」と「商品の注文履歴」は別々の表に分けて管理するのが一般的です。なぜなら、一つの表にまとめすぎると、同じお客様の名前を何度も書くことになり、データが重複して間違いのもとになるからです。
しかし、画面に結果を表示するときは「誰が、いつ、何を買ったか」を一度に見たいですよね。そこで登場するのがJOIN(結合)です。これは、共通の「ID(識別番号)」をヒントにして、バラバラの表を一時的に合体させる魔法のような命令です。
3. INNER JOIN(内部結合)の使い方と特徴
まずは、一番基本となるINNER JOIN(内部結合)について解説します。これは、二つの表の両方に共通するデータが存在する場合のみ、そのデータを合体させて表示する方法です。もし、どちらか片方にしかデータがない場合は、その行は結果に表示されません。
例えば、「ユーザー表」と「注文表」があったとき、INNER JOINを使うと「商品を買ったことがあるユーザー」の情報だけが取り出せます。まだ一度も買い物をしていないユーザーは、結果から除外されます。
結合前のテーブルデータ:
【users(ユーザー表)】
user_id | name | area
--------+----------+-------
1 | 田中太郎 | 東京
2 | 佐藤花子 | 大阪
3 | 鈴木一郎 | 福岡
4 | 高橋愛子 | 北海道
【orders(注文表)】
order_id | user_id | product_name
---------+---------+--------------
101 | 1 | ノートパソコン
102 | 2 | マウス
103 | 1 | キーボード
ここで、INNER JOINを使って「誰が何を買ったか」を一覧にしてみましょう。
SELECT users.name, orders.product_name
FROM users
INNER JOIN orders ON users.user_id = orders.user_id;
実行結果:
name | product_name
---------+--------------
田中太郎 | ノートパソコン
佐藤花子 | マウス
田中太郎 | キーボード
いかがでしょうか?「鈴木一郎」さんと「高橋愛子」さんは注文表にデータがないため、結果には出てきません。これが「両方にデータがあるものだけを結びつける」というINNER JOINの役割です。
4. LEFT JOIN(左外部結合)の使い方と特徴
次に、LEFT JOIN(左外部結合)について学びましょう。これは、左側(先に書いた表)にあるデータをすべて表示し、右側(後に書いた表)に一致するデータがあればそれをくっつける、という方法です。もし右側に一致するデータがなくても、左側のデータは消えずに残ります。その際、右側のデータが入るべき場所には「NULL(ヌル)」という空っぽの状態が表示されます。
この方法は「買い物をしていない人も含めて、すべてのお客様リストを表示し、ついでに買い物をした履歴も確認したい」という時に非常に便利です。
結合前のテーブルデータ:
先ほどと同じ「users(ユーザー表)」と「orders(注文表)」を使います。
user_id | name | area
--------+----------+-------
1 | 田中太郎 | 東京
2 | 佐藤花子 | 大阪
3 | 鈴木一郎 | 福岡
4 | 高橋愛子 | 北海道
今度はLEFT JOINを使って、全ユーザーの名前と注文内容を表示してみます。
SELECT users.name, orders.product_name
FROM users
LEFT JOIN orders ON users.user_id = orders.user_id;
実行結果:
name | product_name
---------+--------------
田中太郎 | ノートパソコン
佐藤花子 | マウス
田中太郎 | キーボード
鈴木一郎 | NULL
高橋愛子 | NULL
注目すべきは、注文をしていない「鈴木一郎」さんと「高橋愛子」さんもリストに載っている点です。注文履歴がないため、product_nameは「NULL(空)」になっています。これが「左側の表を優先する」LEFT JOINの最大の特徴です。
5. 実践!もっと複雑な条件での結合
実際の仕事現場では、ただ結合するだけでなく、特定の条件で絞り込むことが多いです。例えば、「東京に住んでいるユーザーに限定して、注文履歴を確認したい」という場合です。このように、住所や年齢などでフィルタリングする時は、最後に「WHERE(ウェア)」という指示を追加します。
INNER JOINを使って、さらに詳細な条件を追加したコードを書いてみましょう。プログラム未経験の方でも、「どこから(FROM)」「何を(SELECT)」「どうやって(JOIN)」「どんな条件で(WHERE)」という順番で読めば理解しやすくなります。
テーブルデータ:
【users(ユーザー表)】
user_id | name | area
--------+----------+-------
1 | 田中太郎 | 東京
2 | 佐藤花子 | 大阪
3 | 鈴木一郎 | 東京
4 | 山田五郎 | 東京
【orders(注文表)】
order_id | user_id | product_name
---------+---------+--------------
201 | 1 | モニター
202 | 3 | マウスパッド
「東京在住で、かつ商品を購入したことがある人」を抽出するSQLです。
SELECT users.name, users.area, orders.product_name
FROM users
INNER JOIN orders ON users.user_id = orders.user_id
WHERE users.area = '東京';
実行結果:
name | area | product_name
---------+------+--------------
田中太郎 | 東京 | モニター
鈴木一郎 | 東京 | マウスパッド
このように、SQLを組み合わせることで、膨大なデータの中から必要な情報だけをピンポイントで見つけ出すことができます。難しく感じるかもしれませんが、パズルのピースを「WHERE」で選別し、「JOIN」で合体させるという基本の流れは同じです。
6. NULLって何?初心者が気をつけるポイント
解説の中で「NULL(ヌル)」という言葉が出てきました。これは初心者の方が最初につまずきやすいポイントです。プログラミングやデータベースの世界では、NULLは「0」や「空文字(スペース)」とは違います。「値が存在しない」「不明である」という特別な状態を指します。
LEFT JOINを使ったときにNULLが表示されるのは、結合しようとしたけれど相手側の表にデータが見つからなかった、という証拠です。このNULLを上手に扱うことが、SQLマスターへの第一歩です。例えば、「まだ注文したことがない人だけを探す」ときは、このNULLを活用して検索を行うことができます。
7. どっちを使うべき?迷った時の判断基準
最後に、INNER JOINとLEFT JOINのどちらを使うべきか、簡単な判断基準を整理しましょう。ポイントは「欠けているデータがあってもいいかどうか」です。
INNER JOINを使う場合:
「AというデータとBというデータの両方が揃っているものだけを厳選したい」という時に使います。例えば、決済が完了している注文とその顧客情報、といった具合に、欠落があると困るようなデータの集計に向いています。
LEFT JOINを使う場合:
「まずは全体のリスト(左側の表)を全部出したい。その上で、関連する情報があれば見たい」という時に使います。例えば、全社員の名簿と、それぞれの資格取得状況を表示する場合などです。資格を持っていない社員も名簿には載せる必要があるため、LEFT JOINが最適です。
このように使い分けることで、データの抜け漏れを防ぎ、正確な情報を得ることができます。MySQLでの操作に慣れてくると、この結合がいかに強力で便利なツールであるかが実感できるはずです。まずは身近な名簿や家計簿のようなデータを想像して、どのような結合が相応しいか考えてみるのも良い練習になりますよ。