助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26431
問題を開く
次の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句で論理演算子を使用して、条件を複数記述したり、条件の判定結果を反転させることができます。
論理演算子には以下のものがあります。



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



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

Cが該当する理由を知りたい

投稿日 2023/10/27

提供された行が条件にマッチしない理由は、条件 (department_id = 3 OR salary > 400000) AND commission <= 1200000 OR hiredate > '2008-04-01' に対して、以下の評価結果です

department_id = 4 は条件 (department_id = 3 OR salary > 400000) にマッチしません。
salary > 400000 もマッチしません。
commission <= 1200000 もマッチしません。
hiredate > '2008-04-01' もマッチしません。
以上の理由から、提供された行は条件式全体を満たさないため、マッチしません。条件内で指定されている条件に対して、department_id が 4 であることや他の列の値が具体的な値を持っていることは影響しません。

上記のように、chatgptにも問い合わせましたがマッチしません。
わかる方、教えていただけると幸いです

2023/10/27 14:04

解説に記載されている以下内容の通りかなと思います。

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

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

実際に実行すると、確かに「C」のレコードは表示されます。

SQL> select department_id, salary, commission, hiredate from employees where (department_id = 3 or salary > 400000) and commission <= 1200000 or hiredate > '2008-04-01';

DEPARTMENT_ID	  SALARY COMMISSION HIREDATE
------------- ---------- ---------- --------
	    3	  400000    1200000 02-12-01
	    5	  400000     800000 10-04-01
	    1	  350000     800000 11-04-01
	    2	  300000     800000 10-04-01
	    3	  300000     800000 09-12-01
	    4	  200000     800000 10-04-01   <--- C
~~~ 以下略 ~~~

記載いただいた以下の内容がChatGPTの回答でしょうか。

提供された行が条件にマッチしない理由は、条件 (department_id = 3 OR salary > 400000) AND commission <= 1200000 OR hiredate > '2008-04-01' に対して、以下の評価結果です

department_id = 4 は条件 (department_id = 3 OR salary > 400000) にマッチしません。
salary > 400000 もマッチしません。
commission <= 1200000 もマッチしません。
hiredate > '2008-04-01' もマッチしません。
以上の理由から、提供された行は条件式全体を満たさないため、マッチしません。条件内で指定されている条件に対して、department_id が 4 であることや他の列の値が具体的な値を持っていることは影響しません。

どのようなプロンプトを投げたかわからないので何とも言えませんが、「C」の選択肢は「hiredate > '2008-04-01'」の条件にマッチすると思います。
私も試しにChatGTPに質問してみました。最後の説明文がわかりやすいかなと感じました。

まず、SQLのWHERE句の条件式の評価の順序を理解する必要があります。AND、OR、NOTなどの論理演算子の優先順位は以下のようになっています:

1. NOT
2. AND
3. OR

上記のSQL文において、WHERE句の条件式は以下のように括弧を使って明確に示されています:

1. (department_id = 3 OR salary > 400000)
2. AND commission <= 1200000
3. OR hiredate > '2008-04-01'

この条件式の評価の順序を考慮すると、次のようなステップで評価されます:

1. 最初に括弧内の条件が評価される。すなわち、department_idが3のレコード、またはsalaryが400000を超えるレコードが該当します。
2. 次に、上記の結果の中からcommissionが1200000以下のレコードが選ばれます。
3. 最後に、hiredateが'2008-04-01'よりも新しいレコードが上記の条件に関係なく選ばれます。

そのため、結果として返されるレコードは以下の3つの条件のいずれかを満たすものになります:

1. department_idが3で、salaryが任意、commissionが1200000以下のレコード。
2. salaryが400000を超え、commissionが1200000以下のレコード。
3. hiredateが'2008-04-01'よりも新しいレコード。

注意点として、OR条件はAND条件よりも優先順位が低いため、上記のSQL文を実行すると、hiredateの条件は他の条件とは独立して評価される点に注意してください。


コメント

o onticabo

2023/10/30 18:35

回答ありがとうございます🙇 優先順位を見返して、もう一度解き直したら該当すること理解できました。 OR hiredate > '2008-04-01'の判定処理を理解してなかったです。 助かりました!

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

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