本記事では、UNIONについて解説します。
前回はサブクエリについて解説しました。
今回では、UNIONで複数のSQL文を繋げる方法についてみていきましょう。
SQLのUNIONとは?
UNIONとは、2つのSQL文をつなぐことができるもののことです。
UNIONを使うことで、複数のSQL文の処理結果を合わせて表示することができるようになります。
また、UNIONの他にUNION ALLというものもあります。
UNIONは処理結果から重複したものを除外するのに対し、UNION ALLは重複したものはそのまま表示します。
SQLのUNIONの使い方
UNIONの具体的な使い方についてみていきましょう。
次の項目に従って解説していきます。
- UNIONで検索結果を統合する
- UNION ALLで検索結果を統合する
なお、今回は『SQL入門編1』で作成したテーブルを使って解説します。『SQL入門編1』で演習用のテーブルを作っていない方は、【SQL入門編1】初心者必見!SQLのクエリの書き方を学ぼうを読んで予め作成してくださいね。
UNIONで検索結果を統合する
UNIONで検索結果を統合するやり方を解説します。
まずUNIONで統合する前のSQL文をみていきます。
○コード例
SELECT name FROM TEST.Student WHERE name = "佐藤";
○実行結果
○コード例
SELECT name FROM TEST.Student WHERE name = "鈴木";
○実行結果
こちら2つのSQL文はnameが「佐藤」のもの、「鈴木」のもののレコードをそれぞれ取得しています。
こちら2つのSQL文を、UNIONで統合してみます。
○コード例
SELECT name FROM TEST.Student WHERE name = "佐藤"
UNION
SELECT name FROM TEST.Student WHERE name = "鈴木";
○実行結果
2つのSQLの実行結果が合わさって表示されました。
このようにUNIONは2つの表を統合して表示してくれるものです。
UNION ALLで検索結果を統合する
UNIONの他に、UNION ALLというものもあります。
UNIONと同様2つの表を統合するものですが、UNION ALLの場合重複箇所もそのまま表示します。
○コード例
SELECT name FROM TEST.Student WHERE age = 9
UNION ALL
SELECT name FROM TEST.Student WHERE name = "鈴木";
○実行結果
上記のコードは「age=9」のレコードと「name=”鈴木”」のレコードをそれぞれ取得し、UNION ALLにて表示しています。
ただ実行結果をみて分かる通り、重複してそのまま表示していますね。
このようにUNION ALLは重複する箇所もそのまま表示するのが特徴です。
UNIONとUNION ALLは状況に応じて使い分けるようにしましょう。
INTERSECTで和集合を取得する(MySQL不可)
UNIONとUNION ALL以外にも、SQL文同士を結合させられるものはあります。
INTERSECTを使うことで、それぞれの実行結果の和集合を取得することが可能です。
和集合とは、2つの重複している箇所、のことを言います。
INTERSECTの具体的な使い方をみていきましょう。
○コード例(SQliteによる実行)
SELECT name FROM Student WHERE gender = "女"
INTERSECT
SELECT name FROM Student WHERE id = 3;
○実行結果
上記のコードは「gender=”女”」に該当するものと「id=3」に該当するものの、和集合を取得しています。
このようにINTERSECTを使うことで、2つのSQL文の実行結果の中で、重複するものだけ取り出せます。
ただし、INTERSECTは残念ながらMySQLではサポート対象外となっており、使うことができません。
EXCEPTで差集合を取得する(MySQL不可)
つづいて、EXCEPTをみていきます。
EXCEPTを使うことで、それぞれの実行結果の差集合を取得することが可能です。
差集合とは、Aに含まれるがBに含まれない箇所、のことを言います。
EXCEPTの具体的な使い方をみていきましょう。
○コード例(SQliteによる実行)
SELECT name FROM Student WHERE gender = "女"
EXCEPT
SELECT name FROM Student WHERE id = 3;
○実行結果
上記のコードは「gender=”女”」に該当するものと「id=3」に該当するものの、差集合を取得しています。
「gender=”女”」に該当するものをA、「id=3」に該当するものをBとして考え、Aに該当するが、Bに該当しないものだけ表示しています。
このように、EXCEPTを使うことで、差集合を取得することが可能です。
EXCEPTもINTERSECT同様、MySQLなど一部のRDBMSでは使用できないので、注意しましょう。
まとめ
本記事では、UNIONついて解説しました。
UNIONによって複数のSQL文を繋げられることが、お分かり頂けたかと思います。
UNION以外にも、INTERSECTやEXCEPTなどを使うことで、和集合や差集合が取得可能です。
ただし、INTERSECTやEXCEPTはMySQLではサポートされていないので注意しましょう。
次回は、INNER JOINを解説していきます。