PR

 正解は4です。

 今回は,「Bronze SQL基礎I」「11g SQL基礎I」の試験範囲より,副問合せに関する問題です。

 副問合せは,SELECT文をはじめ,様々なSQL文で使用できます。今回の問題では,UPDATE文のUPDATE句とSET句で副問合せが指定されていますが,これらは構文上,問題なく実行できます。

 では,具体的に,どのような処理が行われるかを考えていきます。

 ORACLE MASTERのSQLの試験(「Bronze SQL基礎I」「11g SQL基礎I」)では,一般に「非相関副問合せ」と呼ばれる副問合せのみが試験の範囲になっています。この「非相関副問合せ」とは,副問合せのSELECT文が主問合せとは独立して実行できる副問合せのことを指します。従って,試験で副問合せの問題が出題されたら,それぞれの副問合せ(カッコのなかのSELECT文)を個別に検討していきます。

 まず,SET句の副問合せを考えます。

SELECT manager_id
FROM departments
WHERE department_id = 20

 このSELECT文では,departments表を検索し,department_id=20の行のmanager_idを求めます。Oracleで提供されているサンプル・スキーマ「HR」を使用した場合,結果は201となります。

 次にUPDATE句の副問合せを考えます。

SELECT employee_id,last_name,first_name,salary,manager_id
FROM employees
WHERE department_id =20

 このSELECT文では,employees表を検索し,department_id=20の行を検索します。サンプル・スキーマ「HR」での検索結果は,下記のとおりです。

表1●サンプル・スキーマ「HR」での検索結果(UPDATE句の副問合せの結果)
EMPLOYEE_IDLAST_NAMEFIRST_NAMESALARYMANAGER_ID
201HartsteinMichael13000100
202FayPat6000201

 UPDATE文のUPDATE句で副問合せが指定された場合,その実行結果イメージ(つまり,上の表)に対し,UPDATE文が実行されます。ただし,この結果はビュー・オブジェクトと同じで仮想的な表であり,実体は副問合せで検索の対象となったemployees表です。

 以上のことをまとめると,今回の問題文中のUPDATE文は,上記副問合せの結果に対し,manager_id列の値を201に更新するものです。実行されたUPDATE文本体にはWHERE句での制限がありませんので,UPDATE句で指定されているSELECT文のWHERE句に基づき,employee_idが201,202の2行が更新対象となります。

 なお,選択肢1~3の内容はどれも正しくありません。

選択肢1):UPDATE句でも副問合せが指定できるので記述は誤り
選択肢2):SET句でも副問合せが指定できるので記述は誤り
選択肢3):それぞれの副問合せは独立しているので誤り

 このため,正しい選択肢は4ということになります。

 なお,SELECT文のFROM句やUPDAET文のUPFATE句,INSERT文のINSERT INTO句でも副問合せが使用でき,これらの句で使用した副問合せはインライン・ビューと呼びます。これは,指定したSELECT文がビュー・オブジェクトと同様の振る舞いをするからです。

 非相関副問合せに対して,「相関副問合せ」というものが存在します。相関副問合せでは,副問合せ(カッコの中のSELECT文)の実行に際し,主問合せ(カッコの外側のSELECT文)の結果を使用します。例えば,こんな感じです。

SELECT employee_id,last_name,salary
FROM employees a
WHERE EXISTS (SELECT employee_id 
              FROM employees b
              WHERE b.manager_id = a.employee_id);

 このSELECT文は,employees表のデータのうち,manager_idに登録されている人(つまり部下を持つ人)の情報のみを表示する,というものです。

 主問合せ(カッコの外側)を実行し,実行結果の1つ1つの行のemployee_idを用いて副問合せ(カッコの内側)を実行します。このとき副問合せの結果が1行以上存在していれば,その行を表示し,存在していなければその行は表示しません。