【初心者でも安心!】図解付きでわかりやすく解説!MySQLで3つのテーブルを結合する方法
MySQLで3つのテーブルを結合するには、JOIN
句を使用します。JOIN
句には、内部結合、外部結合、自然結合など、いくつかの種類があります。
内部結合は、結合条件を満たすレコードのみを結果に含めます。最も一般的な結合方法です。
SELECT *
FROM table1
JOIN table2
ON table1.column1 = table2.column2
JOIN table3
ON table2.column3 = table3.column4;
この例では、table1
、table2
、table3
の 3 つのテーブルを結合しています。table1.column1
は table2.column2
と等しく、table2.column3
は table3.column4
と等しくなるレコードのみが結果に含まれます。
外部結合は、結合条件を満たすレコードだけでなく、満たさないレコードも結果に含めます。
1 左外部結合
左外部結合は、左側のテーブルすべてのレコードと、右側のテーブルで結合条件を満たすレコードを結果に含めます。
SELECT *
FROM table1
LEFT JOIN table2
ON table1.column1 = table2.column2
JOIN table3
ON table2.column3 = table3.column4;
SELECT *
FROM table1
JOIN table2
ON table1.column1 = table2.column2
RIGHT JOIN table3
ON table2.column3 = table3.column4;
完全外部結合は、左右両方のテーブルすべてのレコードを結果に含めます。
SELECT *
FROM table1
FULL JOIN table2
ON table1.column1 = table2.column2
JOIN table3
ON table2.column3 = table3.column4;
自然結合は、両方のテーブルで同じ名前の列を結合条件として使用します。
SELECT *
FROM table1
NATURAL JOIN table2
NATURAL JOIN table3;
この例では、table1
と table2
で同じ名前の列、および table2
と table3
で同じ名前の列を結合条件として使用します。
補足
- 複数の
JOIN
句を組み合わせることもできます。 ON
句の代わりにUSING
句を使用することもできます。USING
句は、結合条件として使用する列名を指定します。- 結合の種類によって、結果が異なる場合があります。
上記を参考に、状況に合わせて適切な方法で3つのテーブルを結合してください。
-- サンプルデータ
CREATE TABLE customers (
customer_id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT NOT NULL,
order_date DATE NOT NULL,
order_amount DECIMAL(10,2) NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
CREATE TABLE order_items (
order_item_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
-- 3つのテーブルを結合して、顧客情報、注文情報、注文明細情報を表示する
SELECT
customers.first_name,
customers.last_name,
customers.email,
orders.order_id,
orders.order_date,
orders.order_amount,
order_items.product_id,
order_items.quantity,
order_items.unit_price
FROM customers
JOIN orders
ON customers.customer_id = orders.customer_id
JOIN order_items
ON orders.order_id = order_items.order_id;
このサンプルコードでは、以下の3つのテーブルを使用します。
customers
テーブル:顧客情報(顧客ID、名、姓、メールアドレス)orders
テーブル:注文情報(注文ID、顧客ID、注文日、注文金額)order_items
テーブル:注文明細情報(注文明細ID、注文ID、商品ID、数量、単価)
上記のコードは、customers
テーブル、orders
テーブル、order_items
テーブルを結合して、顧客情報、注文情報、注文明細情報をすべて表示します。
結合方法は、JOIN
句を使用しています。JOIN
句には、INNER JOIN
、LEFT JOIN
、RIGHT JOIN
、FULL JOIN
などの種類があります。
この例では、INNER JOIN
を使用しています。INNER JOIN
は、結合条件を満たすレコードのみを結果に含めます。
結合条件は、ON
句で指定します。ON
句には、結合する列を指定します。
この例では、customers.customer_id
を orders.customer_id
と等しく、かつ orders.order_id
を order_items.order_id
と等しくなるように指定しています。
上記のコード以外にも、さまざまな結合方法があります。状況に合わせて適切な方法を選択してください。
MySQLで3つのテーブルを結合するその他の方法
前述以外にも、MySQLで3つのテーブルを結合する方法はいくつかあります。以下に、その例を紹介します。
サブクエリを使用すると、より複雑な結合を実行できます。
SELECT *
FROM customers
WHERE customer_id IN (
SELECT customer_id
FROM orders
WHERE order_date >= '2023-01-01'
);
この例では、customers
テーブルから、2023年1月1日以降に注文した顧客のみを選択します。
UNION
句を使用すると、複数の結果セットを結合できます。
SELECT *
FROM customers
UNION ALL
SELECT *
FROM orders;
この例では、customers
テーブルと orders
テーブルのすべてのレコードを結合します。UNION ALL
は重複を許容しますが、UNION
は重複を許容しません。
WITH
句を使用すると、一時的な名前付き結果セットを作成できます。
WITH customer_orders AS (
SELECT customers.*, orders.*
FROM customers
JOIN orders
ON customers.customer_id = orders.customer_id
)
SELECT *
FROM customer_orders
JOIN order_items
ON customer_orders.order_id = order_items.order_id;
この例では、customer_orders
という名前の一時的な結果セットを作成します。この結果セットには、customers
テーブルと orders
テーブルの結合結果が含まれます。その後、customer_orders
結果セットと order_items
テーブルを結合します。
レガシー JOIN 構文を使用する
MySQL 5.7 以前では、CROSS JOIN
、NATURAL JOIN
などの古い JOIN 構文を使用できました。これらの構文は、新しい JOIN 構文よりも非効率的である場合があるため、一般的には使用されません。
mysql