助け合いフォーラム
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)」以外であること

以下の条件を全て満たすデータを検索します。どの問い合わせを使用しますか。
ただし、日付書式は「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文の実行結果は次のようになります。
その他の選択肢については以下のとおりです。
・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)
すなわち[「田」と「藤」の両方を含む場合のみを除外する]条件となるので、どちらか一方を含むデータも検索されてしまいます。したがって、希望の結果は得られません。
・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 '%田%')

・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演算子で結ばれているため、希望の結果は得られません。

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);
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);
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);
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);
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 さん、 ご指摘の点を修正いたしました。 ご報告、誠にありがとうございました。