今回は、select文の結果を結合する文法の紹介です。
結果を結合するためには、集合演算子のUNION(重複排除したい場合はUNION ALL)を用います。
運用作業やプログラミングで複数のselect文の結果を1回のSQL文発行で取得したいことがあるので、知っておくと便利です。
ついでに、UNIONやUNION ALL以外の集合演算子についても紹介します。
【文法】
select文
集合演算子
select文
(集合演算子 select文…)
(order by…)
※集合演算子には以下のようなものがある
・UNION
前後のselect文の結果を結合する。
重複する結果は1行にまとめられる。
・UNION ALL
前後のselect文の結果を結合する。
重複する結果はまとめられない。
・MINUS、EXCEPT
前のselect文の結果から後のselect文の結果を取り除く。
OracleはMINUS、それ以外はEXCEPTを用いる。
(MySQLではサポート外)
・INTERSECT
前のselect文の結果と後のselect文の結果で一致するものだけを抽出する。
(MySQLではサポート外)
※「order by」は個別のselect文にはかからず、集合演算子で結合した結果全体にかかる。
【対象テーブル例】
・A支店商品
+--------+--------+
| 商品ID | 商品名 |
+--------+--------+
| 1 | 商品1 |
| 2 | 商品2 |
| 3 | 商品3 |
+--------+--------+
・B支店商品
+--------+--------+
| 商品ID | 商品名 |
+--------+--------+
| 3 | 商品3 |
| 4 | 商品4 |
| 5 | 商品5 |
+--------+--------+
【使用例】
・UNION
select * from A支店商品
union
select * from B支店商品
order by 商品ID;
↓
+--------+--------+
| 商品ID | 商品名 |
+--------+--------+
| 1 | 商品1 |
| 2 | 商品2 |
| 3 | 商品3 |
| 4 | 商品4 |
| 5 | 商品5 |
+--------+--------+
・UNION ALL
select * from A支店商品
union all
select * from B支店商品
order by 商品ID;
↓
+--------+--------+
| 商品ID | 商品名 |
+--------+--------+
| 1 | 商品1 |
| 2 | 商品2 |
| 3 | 商品3 |
| 3 | 商品3 |
| 4 | 商品4 |
| 5 | 商品5 |
+--------+--------+
・MINUS(EXCEPT)
select * from A支店商品
minus
select * from B支店商品
order by 商品ID;
↓
+--------+--------+
| 商品ID | 商品名 |
+--------+--------+
| 1 | 商品1 |
| 2 | 商品2 |
+--------+--------+
・INTERSECT
select * from A支店商品
intersect
select * from B支店商品
order by 商品ID;
↓
+--------+--------+
| 商品ID | 商品名 |
+--------+--------+
| 3 | 商品3 |
+--------+--------+
いかがでしたでしょうか。
今回は、UNIONに代表される集合演算子について記事を書きました。
何回かに分けて基本的なSQLの書き方に関する記事を書いてきましたが、これが最後になります。
これまで書いてきた文法は何れも実務では頻出なので、運用作業に携わっている人は特に覚えておいた方が良いものばかりです。知らない・使い方があやふやな文法があれば、これを機に覚えることをお勧めします。
これからも、様々な角度から役に立つ記事を書いていきたいと思います!


コメント