🎉

【Oracle SQL】集合演算子

2024/03/24に公開

Oracle SQLに触り始めた初心者です。個人の振り返りのためのメモになります。

集合演算子とは

集合演算子は、2つ以上の構成要素の問合せ結果を1つの結果に結合するものです。集合演算子を含む問合せは、複数問合せと呼ばれます。

演算子 戻り値
UNION 各問合せで選択された、重複しないすべての行
UNION ALL 各問合せで選択された、重複を含むすべての行
INTERSECT 両方の問合せで選択された、重複しないすべての行
MINUS 最初のSELECT文によって選択され、2番目のSELECT文で選択されない、重複しないすべての行

すべての集合演算子には、優先順位がありません。
SQL文に複数の集合演算子が含まれている場合、カッコを使用して別の順序が明示的に指定されていなければ、Oracleサーバーによる集合演算子の評価制度は左(上)から右(下)へとなります。
カッコを使用して評価順序を明示的に指定する必要があるのは、'INTERSECT'演算子を他の集合演算子とともに使用する問合せです。

Oracle Database 入門10g SQL基礎Ⅰ

UNION演算子

2つのSELECT文の結果を結合し、重複する行を削除します。これは、2つのテーブルまたは2つの問い合わせ結果に共通するデータを取得するのに便利です。

USIONの使用例
SELECT 列名 FROM テーブル1
UNION
SELECT 列名 FROM テーブル2

この例では、テーブル1テーブル2から同じ列名のデータを取得し、それらを1つの結果セットとして表示します。その際、重複する行は削除されます。

UNION ALL演算子

2つのSELECT文の結果を結合し、重複する行を保持します。これは、2つのテーブルまたは2つの問い合わせ結果に共通するデータを取得するのに便利です。

UNION ALLの使用例
SELECT 列名 FROM テーブル1
UNION ALL
SELECT 列名 FROM テーブル2

この例では、テーブル1テーブル2から同じ列名のデータを取得し、それらを1つの結果セットとして表示します。その際、重複する行も保持されます。

INTERSECT演算子

2つのSELECT文の結果が共通する行だけを返します。これは、2つのテーブルまたは2つの問い合わせ結果に共通するデータを取得するのに便利です。

INTERSECTの使用例
SELECT 列名 FROM テーブル1
INTERSECT
SELECT 列名 FROM テーブル2

この例では、テーブル1テーブル2から同じ列名のデータを取得し、それらのうち共通する行だけを結果セットとして表示します。

MINUS演算子

2つのSELECT文の結果から、最初の問い合わせ結果に存在し、二つ目の問い合わせ結果に存在しない行だけを返します。これは、一つ目のテーブルまたは問い合わせ結果に特有のデータを取得するのに便利です。

MINUSの使用例
SELECT 列名 FROM テーブル1
MINUS
SELECT 列名 FROM テーブル2

この例では、テーブル1テーブル2から同じ列名のデータを取得し、それらのうちテーブル1に特有の行だけを結果セットとして表示します。

集合演算子を使用する際の注意点

  1. 集合演算子を使うにはそれぞれの問い合わせで列の個数を揃えること、それぞれの列で指定されているデータ型は同じデータ型、もしくは同じデータ型グループとすることが求められます。

  2. UNION ALLのみ取得結果のソートが行われません。基本的に1つ目の問い合わせ結果の後ろに2つ目の問い合わせ結果を連結した形で結果が表示されます。

  3. その他の集合演算子に関しては特に指定しない限り、SELECT区の先頭から順に昇順でソートされます。ただし、ソート順を指定する際には以下の制約があります:

  • 複数の問い合わせ結果を連結する場合、最後の問い合わせで「ORDER BY」を記載する必要があります。
  • もし途中の問い合わせで「ORDER BY」を指定するとエラーとなってしまいます。
  • 「ORDER BY」で記載する列名は最初の問い合わせで使用している列名を指定する必要があります。
ORDER BY句とは

SELECT文の結果を特定の列の値に基づいてソート(並び替え)するための構文です。

使用例
SELECT 列名 FROM テーブル名 ORDER BY 列名 ASC|DESC;

ここで、ASCは昇順(小さいものから大きいものへ)、DESCは降順(大きいものから小さいものへ)を示しますASCまたはDESCを省略した場合、デフォルトでは昇順(ASC)でソートされます。

また、ORDER BY句では、カンマで区切ることで複数の列を指定することができます。 この場合、先頭の列でソートした後、その値が同じ行については次の列でソートが行われます。

なお、ORDER BY句はSELECT文の最後に記述します。

参考

https://docs.oracle.com/cd/E16338_01/server.112/b56299/operators005.htm
https://docs.oracle.com/cd/F19136_01/sqlrf/Set-Operators.html#GUID-5CB549AF-5A4F-453E-B164-49CAC8F94CBF
https://blogs.oracle.com/oraclemaster/post/om-silver-sql-2019-seminar-18
https://qiita.com/ssmr/items/61d09e60465e2afcffa2
https://techmania.jp/blog/sql-order-by/

Discussion