Het kan zijn dat bij een single-row subquery de subquery als resultaat NULL oplevert. Zo heeft Grant bijvoorbeeld geen department_id.
SELECT department_id
FROM employees
WHERE last_name = 'Grant'
En we stellen de vraag wie er op dezelfde afdeling werken als Grant.
SELECT last_name
FROM employees
WHERE department_id =
(SELECT department_id
FROM employees
WHERE last_name = 'Grant');
Dan krijg je een leeg resultaat terug. Geen enkele rij dus, maar deze melding.
Een vergelijking met NULL levert altijd FALSE op. En als een conditie FALSE is, worden de rijen uitgesloten van het query resultaat.
Als bij een multiple-row query één van de waarden van de subquery NULL is, dan worden enkel de waarden die niet NULL zijn gebruikt.
Welke werknemers zijn er allemaal manager? Dat zijn de manager_id's die voorkomen in de lijst van employee_id's.
Eerst halen we alle manager_id's op. Daar zit één NULL waarde bij. King is de grootste baas en hij heeft geen manager.
SELECT DISTINCT manager_id
FROM employees;
Die subquery (inner query) zetten we tussen haakjes en daar zetten we de outer query boven.
SELECT last_name, employee_id
FROM employees
WHERE employee_id IN
(SELECT DISTINCT manager_id
FROM employees);
Het is altijd oppassen met NULLS in de subquery bij het gebruik van IN of NOT IN. Als je niet zeker weet of een NULL voor gaat komen in de subquery en er misschien een verkeerd resultaat uit volgt, kun je beter die NULL uitsluiten met een WHERE.
SELECT last_name, employee_id
FROM employees
WHERE employee_id IN
(SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL);