実践的なSQLスキルアップ:異なる列数のテーブル結合でデータの力を引き出す
SQLにおける異なる列数を持つ2つのテーブルの結合
例
次の2つのテーブルがあるとします。
-- テーブルA
CREATE TABLE tableA (
id INT PRIMARY KEY,
name VARCHAR(255),
city VARCHAR(255)
);
-- テーブルB
CREATE TABLE tableB (
id INT PRIMARY KEY,
email VARCHAR(255),
country VARCHAR(255)
);
これらのテーブルを結合するには、次のクエリを使用できます。
SELECT * FROM tableA
UNION
SELECT id, name, email, country FROM tableB;
このクエリは、両方のテーブルのすべての列を含む結果セットを返します。tableA
には city
列がありますが、tableB
にはありません。この場合、city
列は NULL
値で表示されます。
UNION オペレータは、重複行を削除しないことに注意してください。結果セットに重複行が含まれるのを防ぐには、DISTINCT キーワードを使用できます。
SELECT DISTINCT * FROM tableA
UNION
SELECT DISTINCT id, name, email, country FROM tableB;
補足
- UNION ALL オペレータは、UNION オペレータと似ていますが、重複行を削除しません。
NATURAL UNION
オペレータは、両方のテーブルで同じ名前を持つ列に基づいてテーブルを結合します。FULL OUTER JOIN
オペレータは、両方のテーブルからすべての行を返します。一致する行がない場合、NULL値が返されます。
これらのオプションの詳細については、MySQLドキュメントを参照してください。
テーブル定義
-- customersテーブル
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(255),
city VARCHAR(255)
);
-- ordersテーブル
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
product_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
クエリ
このクエリは、各顧客の名前、都市、注文日、注文ID、商品IDを返す。
SELECT c.name, c.city, o.order_date, o.order_id, o.product_id
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id;
結果
| name | city | order_date | order_id | product_id |
|----------|-----------|------------|-----------|-----------|
| 田中一郎 | 京都市 | 2023-11-14 | 1 | 101 |
| 田中一郎 | 京都市 | 2023-11-14 | 2 | 202 |
| 佐藤二郎 | 大阪市 | 2023-11-15 | 3 | 303 |
| 高橋三郎 | 神戸市 | 2023-11-16 | 4 | 404 |
説明
このクエリは、customers
テーブルと orders
テーブルを customer_id
列で結合します。結合された行は、SELECT
句で指定された列に表示されます。
UNION オペレータを使用する場合は、次のようになります。
SELECT name, city
FROM customers
UNION
SELECT name, NULL AS city, order_date, order_id, product_id
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id;
このクエリは、customers
テーブルと orders
テーブルのすべての行を返します。city
列は customers
テーブルからのみ取得され、orders
テーブルからの行には NULL
値が表示されます。
SQLにおける異なる列数を持つ2つのテーブルを結合する方法:その他の方法
サブクエリを使用して、結合するテーブルの構造を一致させることができます。これは、より複雑なクエリの場合に役立ちます。
次のクエリは、customers
テーブルと orders
テーブルを結合し、各顧客の名前、都市、注文日、注文ID、商品IDを返します。
SELECT c.name, c.city, o.order_date, o.order_id, o.product_id
FROM customers c
LEFT JOIN (
SELECT order_id, product_id, order_date
FROM orders
) AS o ON c.customer_id = o.customer_id;
このクエリは、orders
テーブルのサブクエリを使用します。サブクエリは、order_id
、product_id
、order_date
列のみを選択します。この結果は、customers
テーブルと LEFT JOIN
句を使用して結合されます。LEFT JOIN
は、customers
テーブルのすべての行を返し、一致する orders
テーブルの行があれば結合します。一致する行がない場合は、NULL
値が返されます。
クロス結合と集計関数を使用して、異なる列数を持つ2つのテーブルを結合することもできます。これは、より高度なデータ操作が必要な場合に役立ちます。
SELECT c.name, c.city, COUNT(*) AS order_count, AVG(o.product_price) AS avg_order_price
FROM customers c
CROSS JOIN orders o
ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.name, c.city;
このクエリは、customers
テーブルと orders
テーブルを CROSS JOIN
句を使用して結合します。CROSS JOIN
は、両方のテーブルのすべての行を組み合わせます。結合された結果は、GROUP BY
句を使用して顧客ごとにグループ化されます。各グループに対して、COUNT(*)
関数は注文数をカウントし、AVG(o.product_price)
関数は平均注文額を計算します。
上記の方法はほんの一例です。異なる列数を持つ2つのテーブルを結合する方法は他にもたくさんあります。最適な方法は、特定のニーズと要件によって異なります。
sql mysql