助け合いフォーラム

Oracle DB

Oracle Master 12c Bronze SQL基礎(1Z0-061)
問題ID : 13254
問題を開く
次のSQL文の実行結果として表示される列の組合せとして、正しいものはどれですか(該当するものを全て選択してください)。

 SELECT department_id, employee_id, employee_name, salary, commission, hiredate
 FROM employees
 WHERE (department_id = 3
  OR salary > 400000)
  AND commission <= 1200000
  OR hiredate > '2008-04-01';

正解

B

C

E

解説

WHERE句に条件が複数指定されている場合は、論理演算子の優先順位に従って条件が評価されます。
AND演算子とOR演算子ではAND演算子のほうが先に評価されますが、()括弧がある場合は、括弧内の演算子を優先して評価します。



 WHERE (department_id = 3
  OR salary > 400000)
  AND commission <= 1200000
  OR hiredate > '2008-04-01';

設問では「(department_id = 3 OR salary > 400000)」の部分が先に評価され、次にANDですので、「DEPARTMENT_ID列が3かSALARY列が400000より大きく、かつCOMMISSION列が1200000以下である」列(E)、または、「HIREDATE列が2008年4月1日より大きい(新しい)」列(B,C)が検索されます。

以上より、
・E
・B
・C
が正解となります。

参考

SQL文ではWHERE句で論理演算子を使用して、条件を複数記述したり、条件の判定結果を反転させることができます。
論理演算子には以下のものがあります。



複数の条件が指定されている場合は、以下の優先順位に従って評価されます。



優先順位を変更したい場合は、先に評価したい演算を()括弧で囲むことで優先順位を高く変更できます。
上に戻る

【誤記?】解説を読んでも回答通りの答えになりませんでした。

投稿日 2022/05/21

正解はB,C,Eとありますが、A,D,Eの間違いではないのでしょうか。

解説に、「(department_id = 3 OR salary > 400000)」の部分が先に評価され
とあるので、department_idが3であるD,Eもしくはsalaryが400000より大きいA,D,Eが回答の選択肢に入ると私は考えます。

ですが、回答にはA,Dの選択肢がなく、代わりにsalaryが400000より小さいB,Cが選択肢にあります。しかもどちらもdepartment_idは3ではありません。

私の認識があっていれば、正しい回答はA,D,Eとなると思うのですが、いかがでしょうか。

2022/05/21 19:00

解説に、「(department_id = 3 OR salary > 400000)」の部分が先に評価され
とあるので、department_idが3であるD,Eもしくはsalaryが400000より大きいA,D,Eが回答の選択肢に入ると私は考えます

まず解説の2行目をみてみます。

AND演算子とOR演算子ではAND演算子のほうが先に評価されますが、()括弧がある場合は、括弧内の演算子を優先して評価します。

これからすると、「かっこ→AND→OR」の順に評価されると読めます。その前提で解説の最後の文を再確認しましょう。

設問では「(department_id = 3 OR salary > 400000)」の部分が先に評価され、次にANDですので、「DEPARTMENT_ID列が3かSALARY列が400000より大きく、かつ COMMISSION列が1200000以下である」列(E)、または、「HIREDATE列が2008年4月1日より大きい(新しい)」列(B,C)が検索されます。

カッコだけの評価ならsushitaroさんの言われる通りかもしれませんが、その次にあるANDが抜けているのでずれているんですよね。
順番としては「(department_idとsalaryの条件) かつ commissionの条件」というひとまとまりがあり、次にORで繋がった「hiredateの条件」がくるのですよね。

算数的に考えると

(A + B) x C + D

で「A + B」だけで終わりにして、Cをかけるのを後回しにして C + D をやろうとしてる感覚です。

sqlite3で実験してみましたが、条件をいじるとこんな感じで結果が変わってきます。

sqlite> SELECT *
   ...> FROM employees
   ...> WHERE (department_id = 3
   ...>  OR salary > 400000) ;
5|500000|2000000|01-10-01 ←A
3|500000|2000000|01-10-01 ←D
3|400000|1200000|02-12-01 ←E
sqlite> SELECT department_id, salary, commission, hiredate
   ...> FROM employees
   ...> WHERE (department_id = 3
   ...>  OR salary > 400000)
   ...>  AND commission <= 1200000;
3|400000|1200000|02-12-01 ←Eだけになっているので、ANDが効いていることがわかる
sqlite> SELECT *
   ...> FROM employees
   ...> WHERE (department_id = 3
   ...>  OR salary > 400000)
   ...>  AND commission <= 1200000
   ...>  OR hiredate > '08-04-01';
1|350000|800000|11-04-01 ←B
4|200000|800000|10-04-01 ←C
3|400000|1200000|02-12-01
↑ hiredateの条件でヒットしたB, Cが抽出されている


コメント

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?