【SQL第7回】複数テーブルの結合:INNER JOIN
リレーショナルデータベース(RDB)の核心部分を学びます。別々で保存されている複数のテーブルを、共通の「ID(主キー・外部キー)」を頼りに合体させて1つの大きな表にする「内部結合(INNER JOIN)」を習得します。
1. なぜテーブルを分けて保存するのか?
データベースを設計する際、「1つの巨大な表にすべてのデータ(会員情報、注文履歴、商品情報など)を書き込む」ことはしません。それをすると、同じ会員が注文するたびにその会員の住所や電話番号が何回も重複して登録され、データが無駄に肥大化し、修正があった時の管理が地獄になってしまうからです。
そのため、データは目的別に個別のテーブルに分割して保存し、それぞれのテーブルに共通の「ID」を持たせる設計(正規化)を行います。
2. 共通のIDで合体させる内部結合
分割されたテーブルからデータを取り出す際に、共通キーを使って行を連結する命令が `INNER JOIN(内部結合)` です。
結合する際には、「どのカラムとどのカラムの値を一致させて連結させるか」という基準を、結合条件として指定する `ON` キーワードの直後に記述します。
3. テーブル名にも別名(エイリアス)を付けよう
複数のテーブルを結合してクエリを書く場合、`SELECT users.name, orders.amount FROM users INNER JOIN orders …` のように、どのテーブルのカラムかを明示するために `テーブル名.カラム名` と書く必要があり、コードが非常に長くなってしまいます。
これを避けるため、`FROM users AS u` や `INNER JOIN orders AS o` のように、テーブル名にも短い別名を設定します(※実務ではさらに省略し、`AS` も省いて `FROM users u` と書くケースが多いです)。
4. 注文とユーザーの情報を結合して取得するSQLクエリ
以下のクエリは、`orders`(注文情報)テーブルと `users`(会員情報)テーブルを結合し、誰がいくらの買い物をしたかの明細表を作成する実用的なコード例です。
-- 注文情報とユーザー情報を内部結合する SELECT u.name AS 購入者氏名, o.order_date AS 注文日, o.amount AS 購入金額 FROM orders AS o INNER JOIN users AS u ON o.user_id = u.id; -- 注文テーブルのuser_idとユーザーテーブルのidを紐付ける
⚠️ 内部結合(INNER)のデータ欠損ルール
`INNER JOIN` は、結合条件(`ON` の後ろに指定した等価条件)を満たすデータが**「双方のテーブルに存在する場合のみ」**行を出力します。もし、まだ1回も買い物をしたことがないユーザー(=注文テーブルに一度もidが登場しないユーザー)は、出力結果の表から自動的に完全に除外されてしまいます。
SQLでテーブルを結合する際、`INNER JOIN テーブル名` の直後に記述し、2つのテーブルのどのカラム同士を一致させて連結するかという条件を示すキーワード(英文字2文字)は何でしょうか?
※この問題の解答と解説は、ページ最下部(まとめの前)に掲載しています。
5. まとめと次回予告
第7回の講義はお疲れ様でした!今回の重要ポイントを振り返りましょう。
- データ管理の無駄を省き不整合を防ぐため、RDBのデータは複数のテーブルに分割する。
- `INNER JOIN` と `ON 結合条件` を使うことで、双方のテーブルに一致するデータを合体して取得できる。
- コードを簡潔に書くために、`AS` を用いたテーブル名のエイリアスを積極的に活用する。
次回(第8回)は、今回除外されてしまった「買い物履歴のない会員」も含めて、片方のテーブルの全行を確実に残したまま結合する重要なデータ取得手法「外部結合の仕組み:LEFT JOIN」について学びます。お楽しみに!
📖 SQLの基礎を全10回でマスターする
🔑 第7回 理解度チェックの解答と解説
【解説】
正解は **`ON`** です。 `INNER JOIN users u ON o.user_id = u.id` のように結合相手を指定した直後に `ON` を記述し、互いの主キー・外部キーとなるカラムを一致させてデータを結合する条件(等価結合)を明確に指定します。