今回は2つのデータベース、もしくは結果セットを結合する方法として使われているUNIONとJOINの違いについて解説いたします。
これらには明確な違いがあり、応用情報技術者試験の午後問題など、情報技術者試験でも出題される内容でもありますので、試験対策をしたいという人にも参考になるように解説していきます。
応用情報技術者試験の午後問題でデータベースを選択しようと考えている人はぜひ参考にしてみてください。
JOINとUNIONのそれぞれの特徴について
まずは違いを確認する前にそれぞれどういった処理が行われるのかを把握しましょう。
JOIN句
JOIN句は2つのテーブルに存在する関連性のあるカラムを指定して、そのカラムを軸にテーブル同士を結合してくれるクエリです。
例えば数学のテストの結果が格納されているテーブルと国語のテストの結果が格納されているテーブルとが存在するとき、ある人の両方のテストの結果が欲しい場合は、その人の名前、もしくは名前に紐づく出席番号などを結合条件と指定することで国語と数学、両方の結果が得られます。

結合方法にはLEFT、RIGHT、INNER、FULLとあり、それぞれの結合方法によって得られる結合結果は変わりますが、JOINで大事なことはそれぞれのテーブルの特定のカラムをキーにして紐づけるということです。
結合方法についての結果の違いについてはまた別の記事で解説しようと思いますので、よかったらご参照ください。
JOINのポイント
・2つのテーブルの関係性のあるカラムを軸に結合する!
UNION句
UNIONは集合演算子ともよばれ2つのクエリから得られた結果セットから重ね合わせて新しい結果を得るクエリです。
結果を重ねると書いた通り、結果同士の大きさがあっていればたとえ結果のそれぞれのカラムに何ら関連性がなくても併せることができます。
この「大きさがあっていれば」という点がミソであり、大きさというのは、それぞれの結果セットのカラムの数とカラムの型(文字列同士、数値同士)の事を指します。

なので、例えば2つの結果セットのうち片方が8つのカラム、もう片方が9つのカラムの場合はUNIONできませんし、同じカラム数でも3つ目のカラムがそれぞれ文字列と数値になっていたりしてもUNIONできません。

UNIONのような集合演算子にはその他に、UNION ALLやEXCEPTなどいろいろありますが、重要なことは関係性のないデータ同士でもカラムの大きさと型さえ合っていれば重ねられるというところです。
UNIONのポイント
・UNIONは結果セットを重ねるイメージ!
・データ同士に関係性は必要なく、カラムの数と型が重要!
JOINとUNIONの違いについて
さて重要なJOINとUNIONの違いについてですが、上のイメージ図を見てもらえれば何となくわかると思いますが、それぞれの違いは2つのデータセットを結合するか、重ねるかの違いになります。
JOINは一つのデータセット、テーブルに対して外から関係性のあるデータを軸に別のデータセットを結合するイメージで、UNIONは同じサイズで同じタイプの持つデータセット同士を重ねて別のデータセットを作りだすというイメージです。
そのため、出来上がるデータの大きさは結合方法にもよりますが、JOINの場合は基本的に列側(横方向)に大きくなり、UNIONの場合は、列側は変わらず、行側(縦方向)にデータが大きくなります。

これがJOINとUNIONの決定的な違いであり、この違いを使い分けて自分が欲しいデータセットを作り上げることになります。
ただこれは基本的なイメージの話で、上述しましたが結合方法によっては上記のようにならないケースもあるので、そこはご注意ください。(FULLJOINなんかは結合しているテーブルのデータ分縦方向にも伸びます)
JOINとUNIONの使い分け
最後にJOINとUNIONを使い分けて用いる場面について具体例を用いて解説いたします。
例えば以下のようなケースでの使い分けについてです。
用は今のデータが欲しいというのと、別の時期のデータと照らし合わせられるようなデータが欲しいというケースですね。
またテーブルの構造自体は以下のようなものだったとします。
T_USER
ID | ユーザー名 | 作成日 |
---|---|---|
1 | 山田太郎 | 2020.01.01 |
2 | 田中丸栄 | 2020.01.06 |
3 | 鈴木次郎 | 2020.01.30 |
4 | 高嶺花子 | 2020.03.01 |
5 | 橋本安奈 | 2020.04.01 |
T_UTILITYCOSTS
ユーザーID | 対象年月 | 電気代 | ガス代 | 水道代 |
---|---|---|---|---|
1 | 2022.09 | 3000 | 1000 | 1500 |
1 | 2022.10 | 1500 | 1100 | 1400 |
1 | 2022.11 | 2200 | 1800 | 1300 |
1 | 2022.12 | 3000 | 3000 | 1500 |
2 | 2020.01 | 2400 | 2200 | 1100 |
上記のデータからJOINとUNIONをもちいてそれぞれのケースでの取得を考えてみます。
チェックポイント
・現在のデータの取得→JOIN
・過去のデータとの比較→UNION
JOINを用いたデータの取得
それでは現在の光熱費を取得するためのクエリを考えてみます。
現在のデータはテーブルにある内容に他のテーブルにあるデータを肉付けするという性質上JOINが適切であるということがわかります。
そのため現在の高熱費を取得したいという場合は以下のようになるでしょう。
これでユーザーに紐づく今月のデータを取得できます。
上記のようにただ単純にテーブルのデータに情報を肉付けしたい場合はJOINが有効であることがわかります。
UNIONを用いたデータの取得
最後に過去のデータとの比較をするためのクエリを考えてみます。
今のデータと過去のデータというそれぞれのデータに紐づけられるような関連性はないものの、同じ形式、形をしたデータ同士を取得したいというケースですのでUNIONが適切であるということがわかります。
これを例題のクエリで考えてみると以下のようになります。
SELECT
*
FROM
T_USER AS USER
LEFT JOIN T_UTILITYCOSTS AS UT
ON USER.ID = UT.ユーザーID
WHERE 対象年月 = 今月
UNION
SELECT
*
FROM
T_USER AS USER
LEFT JOIN T_UTILITYCOSTS AS UT
ON USER.ID = UT.ユーザーID
WHERE 対象年月 = 昨年同月
これが今月のものと昨年同月のデータが全部持ってクエリになります。
上述の内容を見てもらえればわかると思いますが、JOINで作成したクエリのWHEREの部分を、今月のものと、昨年同月のものとで条件指定したクエリ同士をつなぎ合わせています。
複雑なクエリであっても条件部分が違うだけなら同じ形のものになるはずなので、UNIONで重ねられるというわけですね。
チェックポイント
JOINとUNIONの使い分けはデータの肉付けなのか、同じ形をしたデータの合体なのかで判断すること!
いかがでしたでしょうか。
どういう結合になるのかのイメージを持てば、それぞれの処理の把握自体は簡単だと思いますので、イメージを持つことを大切にしましょう。
今回はここまでです。
お疲れ様でした。
コメント