助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26616
問題を開く
EMPLOYEES表の構造を確認してください。



以下の条件を全て満たすデータを検索します。どの問い合わせを使用しますか。
ただし、日付書式は「RR-MM-DD」とします。

1.名前(EMPLOYEE_NAME)に「田」と「藤」のどちらも含まれていないこと
2.入社日(HIREDATE)が2001年10月1日より前か、2007年4月1日以降であること
3.部署(DEPARTMENT_ID)が「総務(1)」と「開発(3)」以外であること

正解

SELECT department_id, employee_name, hiredate FROM employees
WHERE employee_name NOT LIKE '%田%' AND employee_name NOT LIKE '%藤%'
 AND hiredate NOT BETWEEN '01-10-01' AND '07-03-31'
 AND department_id NOT IN (1, 3);

解説

まず、各条件の式を1つずつ確認してみましょう。
1.名前(EMPLOYEE_NAME)に「田」と「藤」のどちらも含まれていないこと
 「a と b のどちらでもない」という条件は以下のように変換できます。
  NOT(a OR b) = (NOT a) AND (NOT b)

 また、文字パターンに一致しない行を検索する場合は[NOT LIKE 文字]を使用できるので、 
  employee_name NOT LIKE '%田%' AND employee_name NOT LIKE '%藤%'
 と記述します。

2.入社日(HIREDATE)が2001年10月1日より前か、2007年4月1日以降であること
 [NOT BETWEEN 下限値 AND 上限値]を使用して、
  hiredate NOT BETWEEN '01-10-01' AND '07-03-31'
 と記述します。
 NOT BETWEEN演算子では下限値と上限値は含まれないため、2007年4月1日以降は、上限値に'07-03-31'と記述します。

3.部署(DEPARTMENT_ID)が「総務(1)」と「開発(3)」以外であること
 DEPARTMENT_IDが1と3以外という条件なので、
  department_id NOT IN(1, 3) 
 と記述します。

上記3つの条件を全て満たすためには、各条件をAND演算子で結びます。

 条件1 AND 条件2 AND 条件3

各条件中の[NOT] LIKE、[NOT] BETWEEN、[NOT] IN演算子はAND、OR演算子よりも優先順位が高いため、各条件を括弧()で囲む必要はありません。

以上より、
・SELECT department_id, employee_name, hiredate FROM employees
 WHERE employee_name NOT LIKE '%田%' AND employee_name NOT LIKE '%藤%'
  AND hiredate NOT BETWEEN '01-10-01' AND '07-03-31'
  AND department_id NOT IN (1, 3);
が正解となります。

正解のSQL文の実行結果は次のようになります。


 
SQLを表示
SELECT department_id, employee_name, hiredate FROM employees
WHERE employee_name NOT LIKE '%田%' AND employee_name NOT LIKE '%藤%'
 AND hiredate NOT BETWEEN '01-10-01' AND '07-03-31'
 AND department_id NOT IN (1, 3);


その他の選択肢については以下のとおりです。

・SELECT department_id, employee_name, hiredate FROM employees
 WHERE (employee_name NOT LIKE '%田%' OR employee_name NOT LIKE '%藤%')
  AND hiredate NOT BETWEEN '01-10-01' AND '07-03-31'
  AND department_id NOT IN (1, 3);
条件1の中で2つのNOT LIKEがOR演算子で結ばれているため、以下のように解析されます。
 (NOT a) OR (NOT b) = NOT(a AND b)
すなわち[「田」と「藤」の両方を含む場合のみを除外する]条件となるので、どちらか一方を含むデータも検索されてしまいます。したがって、希望の結果は得られません。

 
SQLを表示
SELECT department_id, employee_name, hiredate FROM employees
WHERE (employee_name NOT LIKE '%田%' OR employee_name NOT LIKE '%藤%')
 AND hiredate NOT BETWEEN '01-10-01' AND '07-03-31'
 AND department_id NOT IN (1, 3);


・SELECT department_id, employee_name, hiredate FROM employees
 WHERE employee_name NOT LIKE '%田%' OR employee_name NOT LIKE '%藤%'
  AND hiredate NOT BETWEEN '01-10-01' AND '07-03-31'
  AND department_id NOT IN (1, 3);
以下の優先順位で解析され、希望の結果は得られません。
(条件1のNOT LIKE '%藤%') AND (条件2) AND (条件3) OR (条件1のNOT LIKE '%田%')

 
SQLを表示
SELECT department_id, employee_name, hiredate FROM employees
WHERE employee_name NOT LIKE '%田%' OR employee_name NOT LIKE '%藤%'
 AND hiredate NOT BETWEEN '01-10-01' AND '07-03-31'
 AND department_id NOT IN (1, 3);


・SELECT department_id, employee_name, hiredate FROM employees
 WHERE (employee_name NOT LIKE '%田%' AND employee_name NOT LIKE '%藤%')
 OR hiredate NOT BETWEEN '01-10-01' AND '07-03-31'
 OR department_id NOT IN (1, 3);
各条件がOR演算子で結ばれているため、希望の結果は得られません。

 
SQLを表示
SELECT department_id, employee_name, hiredate FROM employees
WHERE (employee_name NOT LIKE '%田%' AND employee_name NOT LIKE '%藤%')
 OR hiredate NOT BETWEEN '01-10-01' AND '07-03-31'
 OR department_id NOT IN (1, 3);
上に戻る

教えてください

投稿日 2026/01/07

問題文の問合せ条件1に関する質問です。
問題文中の問合せ条件には以下のような記述があるのですが、正答とされているWHERE句に記述されたsql文の条件と不一致ではと思いました。
どなたかわかる方がお見えになりましたら、教えてください。

問題文に記述された条件

1.名前(EMPLOYEE_NAME)に「田」もしくは「藤」のいずれかが含まれていないこと

正答とされる選択肢に記述されたWHERE句の該当条件

WHERE employee_name NOT LIKE '%田%' AND employee_name NOT LIKE '%藤%'
 → このWHERE句の条件の意味は 『「田」と「藤」のいずれもも含まれていないこと』となるのではと考えています。
  

スタッフからの返信

s staff_ishii

2026/01/08 23:40

hayakatsu さん、 ご指摘の点を修正いたしました。 ご報告、誠にありがとうございました。

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