SQLにおけるデータ分析をマスターするための必須スキル:2つのSELECTステートメント結果の結合
SQLにおいて、複数のSELECTステートメントの結果を結合することは、様々なデータ分析やレポート作成において重要です。結合には、主に以下の3種類があります。
- INNER JOIN: 一致する行のみを結合します。最も一般的な結合方法です。
- LEFT JOIN: 左側のテーブルのすべての行と、右側のテーブルで一致する行を結合します。右側テーブルで一致しない行は、NULL値として扱われます。
- FULL OUTER JOIN: 両方のテーブルのすべての行を結合します。一致しない行は、NULL値として扱われます。
各結合の種類の詳細と例
INNER JOIN
SELECT *
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
このクエリは、customers
テーブルとorders
テーブルを結合し、両方のテーブルでcustomer_id
が一致する行のみを抽出します。結果は以下のようになります。
customer_id | name | order_id | product | quantity | price |
---|---|---|---|---|---|
1 | 田中太郎 | 1001 | テレビ | 1 | 50000 |
1 | 田中太郎 | 1002 | パソコン | 1 | 100000 |
2 | 佐藤花子 | 1003 | スマートフォン | 1 | 80000 |
LEFT JOIN
SELECT *
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;
このクエリは、customers
テーブルとorders
テーブルを結合し、customers
テーブルのすべての行と、orders
テーブルで一致する行を結合します。orders
テーブルで一致しない行は、order_id
、product
、quantity
、price
列にNULL値として表示されます。
customer_id | name | order_id | product | quantity | price |
---|---|---|---|---|---|
1 | 田中太郎 | 1001 | テレビ | 1 | 50000 |
1 | 田中太郎 | 1002 | パソコン | 1 | 100000 |
2 | 佐藤花子 | 1003 | スマートフォン | 1 | 80000 |
3 | 鈴木一郎 | NULL | NULL | NULL | NULL |
RIGHT JOIN
SELECT *
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id;
customer_id | name | order_id | product | quantity | price |
---|---|---|---|---|---|
1 | 田中太郎 | 1001 | テレビ | 1 | 50000 |
1 | 田中太郎 | 1002 | パソコン | 1 | 100000 |
1003 | NULL | スマートフォン | 1 | 80000 |
FULL OUTER JOIN
SELECT *
FROM customers
FULL OUTER JOIN orders
ON customers.customer_id = orders.customer_id;
customer_id | name | order_id | product | quantity | price |
---|---|---|---|---|---|
1 | 田中太郎 | 1001 | テレビ | 1 | 50000 |
1 | 田中太郎 | 1002 | パソコン | 1 | 100000 |
2 | 佐藤花子 | 1003 | スマートフォン | 1 | 80000 |
3 | 鈴木一郎 | NULL | NULL | NULL | NULL |
NULL | NULL |
SELECT customers.customer_id, customers.name, orders.order_id, orders.product, orders.quantity, orders.price
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
このクエリは、customers
テーブルとorders
テーブルをcustomer_id
列で結合し、以下の列を選択します。
customers.customer_id
: 顧客IDcustomers.name
: 顧客名orders.order_id
: 注文IDorders.product
: 商品名orders.quantity
: 注文個数
SELECT customers.customer_id, customers.name, orders.order_id, orders.product, orders.quantity, orders.price
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT customers.customer_id, customers.name, orders.order_id, orders.product, orders.quantity, orders.price
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id;
補足
- 結合の条件は、
ON
句で指定します。 - 複数の結合条件を指定する場合は、
AND
、OR
などの論理演算子を使用できます。 - 結合するテーブルの列名は、一致している必要があります。
- 結合の種類によって、結果の行数が変わります。
これらの例は基本的なものです。より複雑な結合や、その他のSQL機能については、参考資料を参照してください。
SQLにおける2つのSELECTステートメント結果の結合:その他の方法
サブクエリを使用して、別のSELECTステートメントの結果を結合することができます。これは、より複雑な結合条件が必要な場合に役立ちます。
SELECT *
FROM customers
WHERE customer_id IN (
SELECT customer_id
FROM orders
WHERE product = 'テレビ'
);
このクエリは、orders
テーブルでproduct
がテレビ
であるcustomer_id
を取得し、customers
テーブルと結合します。
SELECT *
FROM customers
UNION
SELECT *
FROM orders;
UNION ALLは、UNIONと似ていますが、重複行を削除しません。
SELECT *
FROM customers
UNION ALL
SELECT *
FROM orders;
CROSS JOINを使用して、2つのテーブルのすべての行を結合することができます。これは、すべての組み合わせを取得する必要がある場合に役立ちます。
SELECT *
FROM customers
CROSS JOIN orders;
これらの方法は、それぞれ異なる状況で役立ちます。状況に応じて適切な方法を選択してください。
その他の注意事項
- 結合の種類によっては、パフォーマンスが大きく影響を受ける場合があります。結合を使用する場合は、パフォーマンスを考慮する必要があります。
- 結合する前に、テーブルのスキーマを理解しておくことが重要です。
- 結合の結果は、複雑になる可能性があります。結果を理解しやすくするために、適切な列を選択することが重要です。
sql select join