集合演算子とは
集合演算子を使うことで、複数の問合せを一つにまとめることができる。
(複合問合せとも言われる)
ORACLEサーバーの場合は以下の4つの集合演算子が使える。
集合演算子 | 内容 |
---|---|
UNION | 問合せ結果を連結し、重複した行を排除する。 |
UNION ALL | 問合せ結果を連結し、重複した行を排除しない。 |
INTERSECT | それぞれの問合せ結果のうち、重複するものだけを返す。 |
MINUS | それぞれの問合せ結果のうち、二つ目の問合せ結果にないものを返す。 |
基本構文
SELECT 列名 FROM テーブル名
UNION
SELECT 列名 FROM テーブル名
使用時の注意点
ソートについて
UNION ALLのみ取得結果のソートが行われない。
基本的に1つ目の問合せ結果の後ろに2つ目の問合せ結果を連結した形で結果が表示される。
その他の集合演算子に関しては特に指定しない限り、SELECT区の先頭から順に昇順でソートされる。
ただし、ソート順を指定する際には以下の制約がある。
- 複数の問合せ結果を連結する場合、最後の問合せで「ORDER BY」を記載する必要がある。
もし途中の問合せで「ORDER BY」を指定するとエラーとなってしまう。 - 「ORDER BY」で記載する列名は最初の問合せで使用している列名を指定する必要がある。
指定する列の個数とデータ型について
集合演算子を使うにはそれぞれの問合せで
- 列の個数を揃えること
- それぞれの列で指定されているデータ型は同じデータ型、もしくは同じデータ型グループとすること
が求められる。
これらが満たされていないとエラーとなってしまう。
また、問合せ結果の列の見出しは一つ目の問合せ結果の列名が表示される。
例
SELECT AAA CCC FROM SAMPLE1
UNION ALL
SELECT BBB CCC FROM SAMPLE2
取得結果
AAA(1つ目の問い合わせの列名) | CCC |
---|---|
aaa | ccc |
bbb | ccc |
優先順位について
集合演算子の優先順位は全て同じ。
基本的に前に指定されている複合問合せから順に実行される。
優先順位をつけたい場合は「()」で囲むことで優先的に実行させることができる。
例
SELECT 列名 FROM テーブル名
UNION ALL
(
SELECT 列名 FROM テーブル名
INTERSECT
SELECT 列名 FROM テーブル名
)
上記の場合、先に2つ目と3つ目の問合せが連結され、その問合せ結果を元に1つ目の問い合わせと連結する順となる。