🌟

mysql 各JOINの違い

2024/08/22に公開

使用環境

SQL Fiddle

参考資料

MySQL 8.0 Reference Manual-JOIN Clause
INNER JOIN、LEFT JOIN、RIGHT JOINの違い

今回使用するテーブル

USERテーブル

user_id username email
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は内部結合で
指定した条件と一致したデータだけを取り出す。
例えば、Usersuser_idOrdersuser_idで一致しない場合や、
NULLの場合はそれらを無視して出力つまり、
UsersOrdersの両方にあるデータのみを出力する。

またINNER JOINの省略形であるため、INNER JOIN == JOINとなっている。

結果

user_id username email 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 JOINJOINと違い、外部結合である。
なので基準となるデータのキーが結合するテーブルの値に存在しないやNULLがあってもそれらを無視せずに全て出力を行う。
FROM 〇 の部分のテーブルが基準となるテーブルとなる
使用例としては、基準となるテーブルでNULLを含めたデータを取得したい場合などに使用する。

結果

user_id username email 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 email 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