SQL Inner Join で3つのテーブルを結合する方法
SQL Inner Join で3つのテーブルを結合する方法
例題:顧客、注文、商品情報の結合
テーブル構成
-
顧客情報 (customers):
- customer_id (主キー)
- name
- address
-
注文情報 (orders):
- product_id (外部キー)
- quantity
-
商品情報 (products):
- price
目的:
顧客情報、注文情報、商品情報テーブルを結合し、以下の情報を含むレコードを取得する。
- 顧客名
- 商品名
- 注文個数
SQL クエリ
SELECT
customers.name,
products.name AS product_name,
orders.quantity
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id
INNER JOIN products
ON orders.product_id = products.product_id;
解説
SELECT
句で、取得したい列を指定します。FROM
句で、結合するテーブルを指定します。INNER JOIN
句で、結合条件を指定します。customers
とorders
テーブルはcustomer_id
で結合します。orders
とproducts
テーブルはproduct_id
で結合します。
実行結果
| name | product_name | quantity |
|---|---|---|
| 山田太郎 | ノートパソコン | 1 |
| 田中花子 | スマートフォン | 2 |
| 佐藤健 | テレビ | 1 |
このように、INNER JOIN
を使用することで、3つのテーブルから必要な情報を効率的に抽出することができます。
ポイント
- 結合条件は、各テーブルの共通する列で指定します。
- 複数の
INNER JOIN
を組み合わせることで、3つ以上のテーブルを結合することができます。 WHERE
句を使って、抽出結果を絞り込むことができます。
- 上記の例題は、INNER JOIN の基本的な使い方を説明するために簡略化しています。
- 実際の業務では、より複雑な結合条件や、WHERE 句による絞り込みなどが必要になる場合もあります。
-- テーブル作成
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
address VARCHAR(255) NOT NULL
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
CREATE TABLE products (
product_id INT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
price DECIMAL(10,2) NOT NULL
);
-- データ挿入
INSERT INTO customers (customer_id, name, address)
VALUES
(1, '山田太郎', '東京都千代田区'),
(2, '田中花子', '大阪府大阪市'),
(3, '佐藤健', '神奈川県横浜市');
INSERT INTO orders (order_id, customer_id, product_id, quantity)
VALUES
(1, 1, 1, 1),
(2, 2, 2, 2),
(3, 3, 3, 1);
INSERT INTO products (product_id, name, price)
VALUES
(1, 'ノートパソコン', 100000),
(2, 'スマートフォン', 50000),
(3, 'テレビ', 150000);
-- クエリ実行
SELECT
customers.name,
products.name AS product_name,
orders.quantity
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id
INNER JOIN products
ON orders.product_id = products.product_id;
| name | product_name | quantity |
|---|---|---|
| 山田太郎 | ノートパソコン | 1 |
| 田中花子 | スマートフォン | 2 |
| 佐藤健 | テレビ | 1 |
3つのテーブルを結合するその他の方法
LEFT JOIN と RIGHT JOIN
INNER JOIN は、共通するレコードのみを抽出しますが、LEFT JOIN と RIGHT JOIN は、結合条件に合致するレコードすべてを抽出できます。
LEFT JOIN
SELECT
customers.name,
products.name AS product_name,
orders.quantity
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id
LEFT JOIN products
ON orders.product_id = products.product_id;
結果:
- 顧客情報テーブルに存在するすべてのレコードが抽出されます。
- 注文情報や商品情報が存在しない場合は、NULL 値が表示されます。
RIGHT JOIN
SELECT
customers.name,
products.name AS product_name,
orders.quantity
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id
RIGHT JOIN products
ON orders.product_id = products.product_id;
FULL JOIN は、LEFT JOIN と RIGHT JOIN を組み合わせたような機能です。
SELECT
customers.name,
products.name AS product_name,
orders.quantity
FROM customers
FULL JOIN orders
ON customers.customer_id = orders.customer_id
FULL JOIN products
ON orders.product_id = products.product_id;
UNION は、複数の SELECT クエリの結果を結合するものです。
(
SELECT
customers.name,
products.name AS product_name,
orders.quantity
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id
INNER JOIN products
ON orders.product_id = products.product_id
)
UNION
(
SELECT
customers.name,
NULL AS product_name,
NULL AS quantity
FROM customers
WHERE NOT EXISTS (
SELECT *
FROM orders
WHERE orders.customer_id = customers.customer_id
)
)
ORDER BY customers.name;
- 注文情報が存在する顧客と、注文情報が存在しない顧客の情報を結合します。
CROSS JOIN は、すべてのレコードを結合します。
SELECT
customers.name,
products.name AS product_name,
orders.quantity
FROM customers
CROSS JOIN orders
CROSS JOIN products;
- 共通するレコードのみを抽出したい場合は、INNER JOIN を使用します。
- すべてのレコードを抽出したい場合は、LEFT JOIN、RIGHT JOIN、FULL JOIN を使用します。
- 特定の条件に基づいてレコードを結合したい場合は、UNION を使用します。
3つのテーブルを結合するには、さまざまな方法があります。それぞれの方法の特徴を理解し、目的に合った方法を選択することが重要です。
sql join inner-join