0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

今さら解説するSQL「集合演算子」

Posted at

集合演算子とは

集合演算子を使うことで、複数の問合せを一つにまとめることができる。
複合問合せとも言われる)

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つ目の問い合わせと連結する順となる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?