【データベース】SQLにおけるJOINやUNION(結合と集合)の違いについてわかりやすく解説!

今回は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を使い分けて用いる場面について具体例を用いて解説いたします。
例えば以下のようなケースでの使い分けについてです。

とある電力会社の光熱費に関するデータにおいて、ユーザーのアカウントデータを格納したテーブルとそれに紐づくそれぞれの高熱費用を格納したテーブルとがありました。これらのテーブルから自分のアカウントデータに関して今月の光熱費を確認したい場合と、昨年同月の光熱費と照らし合わせて分析したい場合に必要なSQLクエリについて考えてみます。

用は今のデータが欲しいというのと、別の時期のデータと照らし合わせられるようなデータが欲しいというケースですね。

またテーブルの構造自体は以下のようなものだったとします。

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対象年月電気代ガス代水道代
12022.09300010001500
12022.10150011001400
12022.11220018001300
12022.12300030001500
22020.01240022001100

上記のデータからJOINとUNIONをもちいてそれぞれのケースでの取得を考えてみます。

チェックポイント

・現在のデータの取得→JOIN

・過去のデータとの比較→UNION

JOINを用いたデータの取得

それでは現在の光熱費を取得するためのクエリを考えてみます。
現在のデータはテーブルにある内容に他のテーブルにあるデータを肉付けするという性質上JOINが適切であるということがわかります。
そのため現在の高熱費を取得したいという場合は以下のようになるでしょう。

SELECT
*
FROM
T_USER AS USER
LEFT JOIN T_UTILITYCOSTS AS UT
ON USER.ID = UT.ユーザーID

WHERE 対象年月 = 今月

これでユーザーに紐づく今月のデータを取得できます。
上記のようにただ単純にテーブルのデータに情報を肉付けしたい場合は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の使い分けはデータの肉付けなのか、同じ形をしたデータの合体なのかで判断すること!

いかがでしたでしょうか。
どういう結合になるのかのイメージを持てば、それぞれの処理の把握自体は簡単だと思いますので、イメージを持つことを大切にしましょう。

今回はここまでです。
お疲れ様でした。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

本業ではPHPを使ったWEBアプリやJavaを使用した基幹アプリを作成しております。Pythonは個人的に勉強しており、E資格を取ったりしたおかげで、業務でAIの研究とかも任されるようになりました。学習のアウトプットのために本サイトを運営しておりますが、これからPythonを学ぶという人のお役に立てればいいなと思います。わからないことや調査して記事にしてほしいことがございましたらご連絡いただけると幸いです。

コメント

コメントする

目次
閉じる