助け合いフォーラム
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
解説
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
が正解となります。
参考
論理演算子には以下のものがあります。
複数の条件が指定されている場合は、以下の優先順位に従って評価されます。
優先順位を変更したい場合は、先に評価したい演算を()括弧で囲むことで優先順位を高く変更できます。
【誤記?】解説を読んでも回答通りの答えになりませんでした。
正解は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となると思うのですが、いかがでしょうか。
解説に、「(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が抽出されている
コメント
この投稿に対して返信しませんか?