SQL Inner Join で3つのテーブルを結合する方法

2024-04-02

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;

解説

  1. SELECT 句で、取得したい列を指定します。
  2. FROM 句で、結合するテーブルを指定します。
  3. INNER JOIN 句で、結合条件を指定します。
    • customersorders テーブルは customer_id で結合します。
    • ordersproducts テーブルは 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


PostgreSQLでテーブル構造を新しいテーブルにコピーする方法

CREATE TABLE AS を使うこれは、新しいテーブルを作成し、元のテーブルの構造をコピーする最も簡単な方法です。このコマンドは、元のテーブルのすべての列とデータ型を新しいテーブルにコピーします。INSERT INTO を使って、元のテーブルから新しいテーブルにデータを挿入することもできます。...


SQL初心者でも安心!MySQLで列の先頭にゼロを挿入する3つのテクニック

LPAD()関数は、文字列を指定した長さに左パディングする関数です。以下のクエリを使用して、列 col の値の先頭にゼロを追加できます。このクエリは、col 列の値を4文字の長さに左パディングし、新しい列 padded_col に格納します。パディング文字としてゼロが使用されます。...


SQL Server エラー「排他アクセスを取得できなかった - データベースが使用中の場合」:解決策を試してみる

このエラーは、SQL Server でデータベースを操作しようとしたときに発生します。操作には、データベースのバックアップ、復元、スキーマ変更などがあります。エラーメッセージは、データベースがすでに他のユーザーまたはプロセスによって使用されていることを示しています。...


MariaDBとMySQL: SQL方言の違いとは?

MariaDBは、MySQLと同様に、SQLをデータベース操作の言語として使用します。SQLは、構造化されたデータを操作するための標準的な言語であり、SELECT、INSERT、UPDATE、DELETEなどの基本的なクエリから、複雑なデータ分析や結合操作まで、幅広い操作を実行することができます。...


MariaDB テーブルにおける Varchar 型主キー列のサイズ変更方法

前提条件:MariaDB サーバーが実行されている変更対象のテーブルに対する権限を持っている手順:テーブルのバックアップを取るデータ損失を防ぐために、変更を加える前に必ずテーブルのバックアップを取っておきます。mysqldump -u username -p password database_name table_name > table_name...