🌊

UNIONとUNION ALLの違い

2023/08/13に公開

はじめに

自分の学びを整理し、理解を深めるために、ここでアウトプットを試みています。以下の文章で、具体的な内容について説明していきます。

今回は重要な2つ、すなわち「UNION」と「UNION ALL」について書いていきます。これらの操作はよく似ていますが、異なる点があります。それぞれの特徴と違いについて、以下の文章で解説していきます。

UNIONについて

データベースには、「従業員」テーブルがあります。このテーブルには、従業員が現在会社で働いているか、退職したかを示す情報が含まれています。この情報は二つの方法で表現されています。

1.statusカラム: このカラムが0であれば、従業員が現在も在籍していることを示します。1であれば、従業員が離職していることを示します。
2.to_dateカラム: このカラムが'9999-01-01'であれば、在籍中を示し、それ以外の日付であれば、その日付が辞めた日になります。

特定の条件でこのテーブルからデータを取得するために、UNIONを使って2つのSELECT文を組み合わせることができます。

最初のSELECT文は、在籍中の従業員(to_dateが'9999-01-01')の情報を取得します。
二つ目のSELECT文は、退職した従業員(to_dateが'9999-01-01'より小さい)の情報を取得します。
この2つのクエリをUNIONで結合すると、重複したデータを排除し、在籍していると退職した従業員の情報を一度に取得することができます。

SELECT
    to_date,
    status
FROM
    employee
WHERE
    to_date = '9999-01-01'
    
UNION

SELECT
    to_date,
    status
FROM
	employee
WHERE
    to_date < '9999-01-01';

結果として得られるデータは以下のようになります。

これが、SQLのUNIONを使用したデータの取得方法です。この方法を使うと、異なる条件でのデータ取得を1つのクエリで効率的に行うことができます。

UNION ALLについて

前に説明した「従業員」テーブルを引き続き使用し、今度はUNION ALLを使ってデータを取得する方法について説明します。UNION ALLは、UNIONとは異なり、重複したデータも結果に含まれるようにします。

こちらがクエリの例です:

SELECT
    to_date,
    status
FROM
    employee
WHERE
    to_date = '9999-01-01'
    
UNION ALL

SELECT
    to_date,
    status
FROM
	employee
WHERE
    to_date < '9999-01-01';

最初のSELECT文は、在籍中の従業員(to_dateが'9999-01-01')の情報を取得します。
二つ目のSELECT文は、退職した従業員(to_dateが'9999-01-01'より小さい)の情報を取得します。

これらのクエリをUNION ALLで結合することで、以下のようなデータが得られます。

最初のSELECT文は、在籍中の従業員(to_dateが'9999-01-01')の情報を取得します。
二つ目のSELECT文は、退職した従業員(to_dateが'9999-01-01'より小さい)の情報を取得します。

注意すべき点は、UNION ALLを使うと、重複したデータも結果に含まれるため、全てのデータが表示されます。

つまり、UNIONとUNION ALLの違いは以下の通りです。

UNION: 重複したデータは結果から排除されます。
UNION ALL: 重複したデータも結果に含まれます。

UNION ALLを使うときは、重複するデータが意図的に結果に含まれるようにしたい場合に便利です。この違いを理解することで、データの取得に最適な方法を選べるようになります。

Discussion