その他の結合演算子と結合演算子との組み合わせ
では、最後は頭の中でSQL文の実行結果をイメージしながら、解答していただきましょう。
問4
問合せの結果が同じになるのはどのSQL文ですか。2つ選択してください。
-
a. SELECT department_id,manager_id from departments
UNION SELECT department_id,employee_id from employees; -
b. SELECT department_id,manager_id from departments
MINUS SELECT department_id,employee_id from employees; -
c. SELECT department_id,manager_id from departments
INTERSECT SELECT department_id,employee_id from employees; -
d. SELECT d.department_id,d.manager_id from departments d
JOIN employees e ON d.department_id = e.department_id
AND d.manager_id = e.employee_id; -
e. SELECT d.department_id,d.manager_id from departments d
LEFT OUTER JOIN employees e ON d.department_id = e.department_id
AND d.manager_id = e.employee_id;
各選択肢の実行例を次に示します。INTERSECT
と結合は共通する行を求めることができます。したがって、正解は選択肢cとdです。
SQL> --選択肢c SQL> SELECT department_id,manager_id from departments 2 INTERSECT SELECT department_id,employee_id from employees; DEPARTMENT_ID MANAGER_ID ------------- ---------- 10 200 20 201 30 114 40 203 50 121 60 103 70 204 80 145 90 100 100 108 110 205 11行が選択されました。 SQL> --選択肢d SQL> SELECT d.department_id,d.manager_id from departments d 2 JOIN employees e ON d.department_id = e.department_id 3 AND d.manager_id = e.employee_id; DEPARTMENT_ID MANAGER_ID ------------- ---------- 90 100 60 103 100 108 30 114 50 121 80 145 10 200 20 201 40 203 70 204 110 205 11行が選択されました。
選択肢aのUNION
は共通しない行も出力します。もし、FULL OUTER JOIN
が使われていたら、同じ結果にならないか注意して見たほうがいいですね。
SQL> --選択肢a SQL> SELECT department_id,manager_id from departments 2 UNION SELECT department_id,employee_id from employees; DEPARTMENT_ID MANAGER_ID ------------- ---------- 10 200 20 201 20 202 ……(途中省略)…… 260 270 178 124行が選択されました。
選択肢bのMINUS
は最初の問合せだけが返す行を出力します。もし、OUTER JOIN
で外部結合をしており、かつWHERE
句で一方の表にしかない行を絞り込んでいたら、注意しましょう。
SQL> --選択肢b SQL> SELECT department_id,manager_id from departments 2 MINUS SELECT department_id,employee_id from employees; DEPARTMENT_ID MANAGER_ID ------------- ---------- 120 130 140 ……(途中省略)…… 260 270 16行が選択されました。
選択肢eのようにOUTER JOIN
でもWHERE
句で絞り込んでいない場合、共通する行も出力されるので、MINUS
と同じ結果にはなりません。
SQL> --選択肢e SQL> SELECT d.department_id,d.manager_id from departments d 2 LEFT OUTER JOIN employees e ON d.department_id = e.department_id 3 AND d.manager_id = e.employee_id; DEPARTMENT_ID MANAGER_ID ------------- ---------- 90 100 60 103 100 108 ……(途中省略)…… 130 120 27行が選択されました。
前回、副問合せを解説したときにも言いましたが、「12cSQL試験は難しい」と感じるのは、SQL文およびその実行結果をちゃんとイメージできなければ正解できないためです。
結合、副問合せ、集合演算子のいずれを使っても同じ結果を求められる場合があります。実務では、実行速度やSQL文のメンテナンスのしやすさなどを基準にどの方法を使うかを判断するでしょうが、12cSQL試験に合格するためには「こういう結果を求めたいんだけど」という問いに対して、いずれを使ってもSQL文が書けるようにしておいてください。