以下のSQL文で、何行のデータが返されますか。
SELECT department_id, department_name FROM departments;
DEPARTMENT_ID DEPARTMENT_NAME
-------------- ----------------
10 総務
20 営業
30 開発
40 経理
SELECT employee_id, department_id FROM employees;
EMPLOYEE_ID DEPARTMENT_ID
------------ --------------
101 10
102 10
104 20
105
SELECT department_name
FROM departments
WHERE department_id NOT IN (SELECT department_id FROM employees);A0行✓
B2行
C3行
Dエラーになる
正解:A解説
副問合せの結果にNULLが含まれると、NOT INの条件は1行もTRUEになりません。
副問合せは10、10、20、NULLを返します。department_id NOT IN (10, 10, 20, NULL)は、次の条件と同じ意味です。
department_id <> 10 AND department_id <> 10 AND department_id <> 20 AND department_id <> NULL department_id <> NULLは常にUNKNOWNになるため、AND条件全体もTRUEになることがありません。開発(30)や経理(40)も含めて、返される行は0行です。
従業員がいない部署(開発、経理)を取得する方法
-- 副問合せからNULLを除く
SELECT department_name
FROM departments
WHERE department_id NOT IN (SELECT department_id FROM employees
WHERE department_id IS NOT NULL);
-- NOT EXISTSを使う
SELECT department_name
FROM departments d
WHERE NOT EXISTS (SELECT 1 FROM employees e
WHERE e.department_id = d.department_id);
DEPARTMENT_NAME
----------------
開発
経理 INは「いずれかと等しい」なので、副問合せにNULLが含まれていても一致する行は返されます。NULLで結果が変わるのはNOT INの場合である点に注意してください。