副問合せを使用した問合せの解決28 / 50 問

以下の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の場合である点に注意してください。

前後の問題