INNER JOIN、LEFT JOIN、RIGHT JOINの違いを理解して使い分ける
複数のテーブルから同じ構造のデータを選択するMySQL
このチュートリアルでは、MySQLデータベースで、複数のテーブルから同じ構造のデータを選択する方法について説明します。
前提条件
- MySQLデータベースへのアクセス権
- 基本的なSQL構文の知識
使用するテーブル
このチュートリアルでは、以下の2つのテーブルを使用します。
- customers:顧客情報
- orders:注文情報
テーブル構造
-- customersテーブル
CREATE TABLE customers (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- ordersテーブル
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
product_id INT,
quantity INT
);
課題
すべての顧客とその注文情報を取得したい。
解決策
この課題を解決するには、JOINと呼ばれるSQL機能を使用します。JOINは、複数のテーブルからデータを結合するのに役立ちます。
方法
- INNER JOIN
SELECT
customers.id,
customers.name,
customers.email,
orders.id AS order_id,
orders.product_id,
orders.quantity
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;
INNER JOINは、両方のテーブルで一致するレコードのみを返します。この例では、customers
テーブルのid
列とorders
テーブルのcustomer_id
列が一致するレコードのみが返されます。
- LEFT JOIN
SELECT
customers.id,
customers.name,
customers.email,
orders.id AS order_id,
orders.product_id,
orders.quantity
FROM customers
LEFT JOIN orders
ON customers.id = orders.customer_id;
LEFT JOINは、customers
テーブルのすべてのレコードを返し、orders
テーブルと一致するレコードがあれば追加します。一致するレコードがない場合は、orders
テーブルの列はNULLになります。
- RIGHT JOIN
SELECT
customers.id,
customers.name,
customers.email,
orders.id AS order_id,
orders.product_id,
orders.quantity
FROM customers
RIGHT JOIN orders
ON customers.id = orders.customer_id;
結果
上記のいずれかのクエリを実行すると、以下の結果が表示されます。
id | name | email | order_id | product_id | quantity
-- | -------- | ---------------- | -------- | -------- | --------
1 | 山田太郎 | [email protected] | 1 | 100 | 1
1 | 山田太郎 | [email protected] | 2 | 200 | 2
2 | 佐藤花子 | [email protected] | 3 | 300 | 3
このチュートリアルでは、MySQLで複数のテーブルから同じ構造のデータを選択する方法について説明しました。JOINを使用することで、複雑なデータクエリを簡単に実行することができます。
-- customersテーブル
CREATE TABLE customers (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- ordersテーブル
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
product_id INT,
quantity INT
);
-- データ挿入
INSERT INTO customers (name, email) VALUES ('山田太郎', '[email protected]');
INSERT INTO customers (name, email) VALUES ('佐藤花子', '[email protected]');
INSERT INTO orders (customer_id, product_id, quantity) VALUES (1, 100, 1);
INSERT INTO orders (customer_id, product_id, quantity) VALUES (1, 200, 2);
INSERT INTO orders (customer_id, product_id, quantity) VALUES (2, 300, 3);
-- 全ての顧客とその注文情報を取得
SELECT
customers.id,
customers.name,
customers.email,
orders.id AS order_id,
orders.product_id,
orders.quantity
FROM customers
LEFT JOIN orders
ON customers.id = orders.customer_id;
id | name | email | order_id | product_id | quantity
-- | -------- | ---------------- | -------- | -------- | --------
1 | 山田太郎 | [email protected] | 1 | 100 | 1
1 | 山田太郎 | [email protected] | 2 | 200 | 2
2 | 佐藤花子 | [email protected] | 3 | 300 | 3
説明
- 上記のコードは、
customers
テーブルとorders
テーブルを作成し、データ挿入を行います。 - その後、
LEFT JOIN
を使用して、customers
テーブルのすべてのレコードと一致するorders
テーブルのレコードを取得します。 - 一致するレコードがない場合は、
orders
テーブルの列はNULLになります。
実行方法
- 上記のコードをMySQLクライアントで実行します。
- 結果を確認します。
他の方法
UNION
を使用して、複数のテーブルから同じ構造のデータを結合することができます。
SELECT
id,
name,
email
FROM customers
UNION
SELECT
id,
name,
email
FROM orders;
注意点
UNION
は、重複するレコードを削除します。- 列の順序とデータ型が一致する必要があります。
SELECT
customers.id,
customers.name,
customers.email,
(
SELECT orders.product_id
FROM orders
WHERE orders.customer_id = customers.id
LIMIT 1
) AS product_id
FROM customers;
SUBQUERY
は、複雑なクエリになる可能性があります。- 性能が低下する可能性があります。
CREATE VIEW vw_customers_orders AS
SELECT
customers.id,
customers.name,
customers.email,
orders.product_id
FROM customers
LEFT JOIN orders
ON customers.id = orders.customer_id;
SELECT * FROM vw_customers_orders;
VIEW
は、更新できません。- データベースの変更によって、
VIEW
が無効になる可能性があります。
上記の方法は、それぞれメリットとデメリットがあります。状況に合わせて最適な方法を選択する必要があります。
sql mysql join