正解は3です。
今回は,「11g SQL基礎I」の試験範囲より,集合演算子に関する問題です。日本オラクルのWebページにある各試験の試験内容によると,この内容は11gから追加されたようです。そこで今回は,集合演算子の基礎について確認していきたいと思います。
集合演算子には,UNION,UNION ALL,INTERSECT,MINUSの4つが出題の範囲に含まれます。これらの演算子に共通する特徴としては,
(1)複数のSELECT文の実行結果を組み合わせて結果を表示する
(2)指定する際には,2つのSELECT文で列の数と各列のデータ型を統一する必要がある
(3)ORDER BY句は,SELECT文全体で1度だけ使用することができる
(4)結果を表示した際,列見出しは1つ目のSELECT文のものが使用される
などが挙げられます。
次に各演算子の特徴を見ていきます。それぞれの演算子の結果を理解するために,今回は,2つのSELECT文(<SELECT_A>,<SELECT_B>)の実行結果を次のように想定して説明をしていきたいと思います。
商品CD | 商品名 |
---|---|
10 | アイスコーヒー |
20 | レモンティ |
30 | カフェラテ |
40 | ウーロン茶 |
商品CD | 商品名 |
---|---|
10 | アイスコーヒー |
30 | カフェラテ |
60 | カフェモカ |
■UNION ALL
UNION ALL演算子を使用すると,2つのSELECT文の実行結果をそのまま結合します。このとき,全く同じ内容を持った行が存在していても,それらの行が排除されることがありません。また,検索結果はソートされません。
SELECT_A UNION ALL SELECT_Bの実行結果は下記のとおりです。
商品CD | 商品名 |
---|---|
10 | アイスコーヒー |
20 | レモンティ |
30 | カフェラテ |
40 | ウーロン茶 |
10 | アイスコーヒー |
30 | カフェラテ |
60 | カフェモカ |
■UNION
UNION演算子では,UNION ALLの実行結果に対し,重複する行(今回の例では,アイスコーヒー,カフェラテ)を排除して表示します。また,内部的にソートが行われます。
SELECT_A UNION SELECT_Bの実行結果は下記のとおりです。
商品CD | 商品名 |
---|---|
10 | アイスコーヒー |
20 | レモンティ |
30 | カフェラテ |
40 | ウーロン茶 |
60 | カフェモカ |
■INTERSECT
INTERSECT演算子は,2つのSELECT文の共通部(今回の例ではアイスコーヒーとカフェラテ)分のみを表示します。検索結果はソートされます。
SELECT_A INTERSECT SELECT_Bの実行結果は下記のとおりです。
商品CD | 商品名 |
---|---|
10 | アイスコーヒー |
30 | カフェラテ |
■MINUS
MINUS演算子は,1つ目のSELECT文の結果の中で,2つ目のSELECT文に含まれていないもの(今回の例では,レモンティとウーロン茶)のみ表示します。検索結果はソートされます。
SELECT_A MINUS SELECT_Bの実行結果は下記のとおりです。
商品CD | 商品名 |
---|---|
20 | レモンティ |
40 | ウーロン茶 |
ここで,問題の内容に戻ってみると,選択肢1および2はすべての演算子について言えることですので,正しい記述です。また,各演算子の説明にあるように,UNION,INTERSECT,MINUSの実行結果はソートされて表示されるのに対し,UNION ALLのみ,検索結果はソートされません。従って,選択肢4の内容は正しいと言えます。
ところで,選択肢3のMINUS演算子ですが,前述の説明からも分かるように,2つのSELECT文の順番を入れ替えた場合,実行結果は変わります。前述の例で指定順を入れ替えると,<SELECT_B>の結果に含まれていて,<SELECT_A>の結果に含まれていないカフェモカのみが表示対象となります。
商品CD | 商品名 |
---|---|
60 | カフェモカ |
従って,選択肢3の内容は正しくありません。このため,今回の問題の解答は選択肢3ということになります。