mysql 各JOINの違い
使用環境
参考資料
MySQL 8.0 Reference Manual-JOIN Clause
INNER JOIN、LEFT JOIN、RIGHT JOINの違い
今回使用するテーブル
USERテーブル
user_id | username | |
---|---|---|
1 | 'Alice' | 'alice@example.com' |
2 | 'Bob' | 'bob@example.com' |
3 | 'mike' | 'mike@example.com' |
4 | 'cury' | 'cury@example.com' |
Ordersテーブル
order_id | user_id | total_amount |
---|---|---|
1 | 1 | 150.00 |
2 | 2 | 200.00 |
3 | 4 | 300.00 |
クエリ
-- Users テーブル作成
CREATE TABLE Users (
user_id INT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100)
);
-- Orders テーブル作成
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
user_id INT,
total_amount DECIMAL(10, 2),
FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
-- Users テーブルにデータを挿入
INSERT INTO Users (user_id, username, email) VALUES
(1, 'Alice', 'alice@example.com'),
(2, 'Bob', 'bob@example.com'),
(3, 'mike', 'mike@example.com'),
(4, 'cury', 'cury@example.com')
;
-- Orders テーブルにデータを挿入
INSERT INTO Orders (order_id, user_id, total_amount) VALUES
(1, 1, 150.00),
(2, 2, 200.00),
(3, 4, 300.00),
(4, 5, 300.00)
;
そもそもJOINとは
JOINは、複数のテーブルに関連するデータを結合して一つの結果として取得するために使用する。
この結合という操作が、リレーショナルデータベースをリレーショナルデータベースたらしめる機能の一つであり、データベース内でのリレーションシップを活用するものです。
今回のように、関連する情報を複数のテーブルに分けて保存することをリレーションシップと呼ぶ。
この設計により、データの管理が簡単になり、オブジェクト指向プログラミングのように、1箇所を修正するだけで、参照しているすべての箇所にその修正が適用されます。
これにより、修正漏れや更新漏れを防ぐことができる。
各特長
JOIN
おそらく初心者が一番最初に学ぶであろうJOIN
は内部結合で
指定した条件と一致したデータだけを取り出す。
例えば、Users
のuser_id
とOrders
のuser_id
で一致しない場合や、
NULL
の場合はそれらを無視して出力つまり、
Users
とOrders
の両方にあるデータのみを出力する。
またINNER JOIN
の省略形であるため、INNER JOIN == JOIN
となっている。
結果
user_id | username | order_id | user_id_4 | total_amount | |
---|---|---|---|---|---|
1 | Alice | alice@example.com |
1 | 1 | 150.00 |
2 | Bob | bob@example.com |
2 | 2 | 200.00 |
4 | cury | cury@example.com |
3 | 4 | 300.00 |
クエリ
SELECT * FROM Users as u JOIN Orders as o ON u.user_id = o.user_id;
LEFT JOIN
LEFT JOIN
はJOIN
と違い、外部結合である。
なので基準となるデータのキーが結合するテーブルの値に存在しないやNULLがあってもそれらを無視せずに全て出力を行う。
FROM 〇
の部分のテーブルが基準となるテーブルとなる
使用例としては、基準となるテーブルでNULLを含めたデータを取得したい場合などに使用する。
結果
user_id | username | order_id | user_id_4 | total_amount | |
---|---|---|---|---|---|
1 | Alice | alice@example.com |
1 | 1 | 150.00 |
2 | Bob | bob@example.com |
2 | 2 | 200.00 |
4 | cury | cury@example.com |
3 | 4 | 300.00 |
3 | mike | mike@example.com |
NULL | NULL | NULL |
クエリ
SELECT * FROM Users as u LEFT JOIN Orders as o ON u.user_id = o.user_id;
RIGHT JOIN
基本的な使い方や説明はLEFT JOIN
と同じである。
JOIN 〇
の部分のテーブルが基準となるテーブルとなる
結果
user_id | username | order_id | user_id_4 | total_amount | |
---|---|---|---|---|---|
1 | Alice | alice@example.com |
1 | 1 | 150.00 |
2 | Bob | bob@example.com |
2 | 2 | 200.00 |
4 | cury | cury@example.com |
3 | 4 | 300.00 |
NULL | NULL | NULL | 4 | 5 | 300.00 |
クエリ
SELECT * FROM Users as u RIGHT JOIN Orders as o ON u.user_id = o.user_id;
Discussion