UNIONとUNION ALLを使いこなして効率的なクエリを作成
SQLにおけるUNIONとUNION ALLの違い
重複レコードの扱い
- UNION: 重複レコードを自動的に除去します。
- UNION ALL: 重複レコードも含めてすべてのレコードを返します。
例:
-- テーブル:社員
社員ID | 氏名 | 部署
------- | -------- | --------
1 | 山田太郎 | 営業
2 | 佐藤花子 | 経理
3 | 田中一郎 | 営業
-- UNION
SELECT * FROM 社員
WHERE 部署 = '営業'
UNION
SELECT * FROM 社員
WHERE 部署 = '経理';
-- 結果:
社員ID | 氏名 | 部署
------- | -------- | --------
1 | 山田太郎 | 営業
2 | 佐藤花子 | 経理
-- UNION ALL
SELECT * FROM 社員
WHERE 部署 = '営業'
UNION ALL
SELECT * FROM 社員
WHERE 部署 = '経理';
-- 結果:
社員ID | 氏名 | 部署
------- | -------- | --------
1 | 山田太郎 | 営業
2 | 佐藤花子 | 経理
1 | 山田太郎 | 営業
2 | 佐藤花子 | 経理
処理速度
- UNION: 重複レコードを除去するため、処理速度が比較的遅くなります。
項目 | UNION | UNION ALL |
---|---|---|
重複レコード | 除去する | 含める |
処理速度 | 遅い | 速い |
使い分け
- 重複レコードを除外したい場合はUNIONを使用します。
- 重複レコードを含めたい場合や、処理速度を重視する場合はUNION ALLを使用します。
-- テーブル:社員
社員ID | 氏名 | 部署
------- | -------- | --------
1 | 山田太郎 | 営業
2 | 佐藤花子 | 経理
3 | 田中一郎 | 営業
4 | 高橋二郎 | 営業
-- UNION
SELECT * FROM 社員
WHERE 部署 = '営業'
UNION
SELECT * FROM 社員
WHERE 部署 = '経理';
-- 結果:
社員ID | 氏名 | 部署
------- | -------- | --------
1 | 山田太郎 | 営業
2 | 佐藤花子 | 経理
3 | 田中一郎 | 営業
-- UNION ALL
SELECT * FROM 社員
WHERE 部署 = '営業'
UNION ALL
SELECT * FROM 社員
WHERE 部署 = '経理';
-- 結果:
社員ID | 氏名 | 部署
------- | -------- | --------
1 | 山田太郎 | 営業
2 | 佐藤花子 | 経理
3 | 田中一郎 | 営業
4 | 高橋二郎 | 営業
1 | 山田太郎 | 営業
2 | 佐藤花子 | 経理
このコードを実行すると、以下の結果が出力されます。
- UNION: 営業部と経理部の社員情報が重複を除いて表示されます。
実行方法
このコードは、MySQLなどのデータベース環境で実行できます。
- データベースに接続します。
- 上記のコードをテキストエディタなどに記述します。
- コードを実行します。
SQLで重複レコードを結合する他の方法
DISTINCT
DISTINCTキーワードを使用すると、SELECT文の結果から重複レコードを自動的に除去できます。
SELECT DISTINCT * FROM 社員;
-- 結果:
社員ID | 氏名 | 部署
------- | -------- | --------
1 | 山田太郎 | 営業
2 | 佐藤花子 | 経理
3 | 田中一郎 | 営業
注意点
- DISTINCTは、SELECT文で指定されたすべての列を比較して重複レコードを判定します。
- 一部の列のみを比較したい場合は、WHERE句で条件を指定する必要があります。
GROUP BY
GROUP BY句を使用すると、指定された列に基づいて結果をグループ化できます。
SELECT 部署, COUNT(*) AS 人数
FROM 社員
GROUP BY 部署;
-- 結果:
部署 | 人数
------- | --------
営業 | 2
経理 | 1
- GROUP BY句を使用する場合は、SELECT文で集計関数を使用する必要があります。
JOIN
JOINを使用すると、複数のテーブルを結合できます。
SELECT *
FROM 社員 s
JOIN 部署 d ON s.部署ID = d.部署ID;
-- 結果:
社員ID | 氏名 | 部署 | 部署名
------- | -------- | -------- | --------
1 | 山田太郎 | 営業 | 営業部
2 | 佐藤花子 | 経理 | 経理部
3 | 田中一郎 | 営業 | 営業部
- JOINを使用する場合は、結合条件を指定する必要があります。
サブクエリ
サブクエリを使用すると、複雑な条件を指定できます。
SELECT *
FROM 社員
WHERE 部署 IN (
SELECT 部署名
FROM 部署
WHERE 部署ID > 1
);
-- 結果:
社員ID | 氏名 | 部署
------- | -------- | --------
2 | 佐藤花子 | 経理
3 | 田中一郎 | 営業
- サブクエリは、複雑な条件を指定する場合に有効です。
CTE (Common Table Expressions)
CTEを使用すると、複雑なクエリを複数の部分に分割できます。
WITH 部署_人数 AS (
SELECT 部署, COUNT(*) AS 人数
FROM 社員
GROUP BY 部署
)
SELECT *
FROM 部署_人数
WHERE 人数 > 1;
-- 結果:
部署 | 人数
------- | --------
営業 | 2
- CTEは、複雑なクエリを分かりやすく記述する場合に有効です。
UNIONとUNION ALLは、SQLで重複レコードを結合する最も基本的な方法です。
その他の方法も状況に応じて使い分けることで、より効率的なクエリを作成することができます。
sql union union-all