【SQL】テーブルの結合 ~完全結合・Union / Union All ~

■ はじめに

SQLの UNION / UNION ALL について、学ぶ。

目次

【1】 UNION
【2】 UNION ALL
【3】 Union と Union All の違い
【4】 使用上の注意

【1】 UNION

* 1つの条件+別の条件を繋げる時(和集合の実現)に役立つ

※ 和集合とは...

 => 2つの集合A,Bに対して、どちらの要素にも入る

http://www2.edu-ctr.pref.okayama.jp/math/301/30104.html

構文

SELECT [item name1]
FROM [table name1]
UNION
SELECT [item name2]
FROM [table name2]

 サンプル

SELECT u.user_name AS name
FROM users AS u
UNION
SELECT e.emp_name AS name
FROM employee AS e;

【2】 UNION ALL

* SELECT文の統合

 構文

SELECT [item name1]
FROM [table name1]
UNION ALL
SELECT [item name2]
FROM [table name2]

 サンプル

例1:簡単なデータ

SELECT u.user_name AS name
FROM users AS u
UNION ALL
SELECT e.emp_name AS name
FROM employee AS e;

例2:重複ユーザを排除した結果を表示

-- 1-1)昨日のデータ格納用テーブル
CREATE TABLE "user_20200615" (
    "id" INT NOT NULL,
    "name" TEXT NULL DEFAULT NULL,
    PRIMARY KEY ("id")
);
-- 1-2)今日のデータ格納用テーブル(1-1)と同等のテーブル)
CREATE TABLE "user_20200616" (
    "id" INT NOT NULL,
    "name" TEXT NULL DEFAULT NULL,
    PRIMARY KEY ("id")
);
-- 2)サンプルデータ
INSERT INTO user_20200615 VALUES(1, 'Mike'),(2, 'Smith');
INSERT INTO user_20200616 VALUES(2, 'Smith'),(3, 'Tom');

-- 3)重複ユーザを排除した結果を表示(★今回のテーマ★)

-- 今日データ
SELECT
  main.id, main.name
FROM 
  user_20200616 AS main
UNION ALL
-- 昨日データ
-- => 昨日データだけ欲しいので、LEFT OUTER JOINで結合した結果に対して
--   「WHERE new.id IS NULL」今日データが含まれているデータを省く
SELECT
  old.id, old.name
FROM 
  user_20200615 AS old
LEFT OUTER JOIN
  user_20200616 AS new
ON
  old.id = new.id
WHERE
  new.id IS NULL
ORDER BY id

-- 出力結果は以下の通り(重複データ「2 Smith」がまとまって表示)
id name
1 Mike
2 Smith
3 Tom

補足:UNION ALL の 使い方

* リポートとしても使える

サンプル

SELECT
 1 AS no,
 'data count' AS item,
 (SELECT COUNT(u.user_id) FROM users AS u) AS value
UNION ALL
SELECT
 2 AS no,
 'max id' AS item,
 (SELECT MAX(u.user_id) FROM users AS u) AS value
UNION ALL
SELECT
 3 AS no,
 'min id' AS item,
 (SELECT MIN(u.user_id) FROM users AS u) AS value

出力結果例

no item value
1 data count 6
2 max id 6
3 min id 1

 【3】 Union と Union All の違い

 Union

 * DISTINCT(重複を統合)のような形で結果を返す

 Union All

 * 重複も含めて、全ての結果を返す

まとめ

UNION UNION ALL
重複行 重複削除 重複表示

 【4】 使用上の注意

 * ORDER BYを利用する時には、
   フィールドを取得しておかなければならない
 (★これに、はまった★)

 * 取得するフィールドの数/型が、一致しなければならない
 (SELECT句のカラム数が同じ)

 * 以上のことが考慮されていれば、
   異なるテーブルであっても問題なし。

 参考資料

http://www.atmarkit.co.jp/fnetwork/rensai/sql09/sql1.html
http://www.techscore.com/tech/sql/08_01.html/
サンプルが分かりやすい
http://www.dbonline.jp/mysql/select/index18.html

関連記事

テーブルの結合 ~内部結合・INNER JOIN~
https://dk521123.hatenablog.com/entry/2010/02/05/131206
テーブルの結合 ~外部結合・LEFT OUTER JOIN、RIGHT JOIN~
https://dk521123.hatenablog.com/entry/2012/05/06/212246
テーブルの結合 ~交差結合・CROSS JOIN~
https://dk521123.hatenablog.com/entry/2011/12/21/000000
全く関係ないテーブルを結合することを考える
https://dk521123.hatenablog.com/entry/2021/09/16/185552