PR

 正解は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>)の実行結果を次のように想定して説明をしていきたいと思います。

<SELECT_A>の実行結果
商品CD商品名
10アイスコーヒー
20レモンティ
30カフェラテ
40ウーロン茶

<SELECT_B>の実行結果
商品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ということになります。