Met een subquery kun je eerst informatie opvragen die je nog niet weet. Op basis van die informatie kun je vervolgens een nieuwe query maken. Stel bijvoorbeeld dat je een overzicht wil maken van alle werknemers die in dienst zijn gekomen na Peter Vargas. Dan zul je eerst moeten weten wanneer Peter Vargas in dienst is gekomen!
Eerst maar eens een heel foute manier!
SELECT first_name, last_name, hire_date
FROM employees
WHERE hire_date > '1998-07-09';
Deze manier is erg verkeerd omdat je niet kunt weten dat de hire_date van Peter Vargas 1998-07-09 is. Dat heb je waarschijnlijk opgezocht in de papieren versie of in PHPMyAdmin in de tabel employees. En dat mag dus niet!
Je moet eerst de hire_date van Peter Vargas ophalen met een query.
SELECT hire_date
FROM employees
WHERE last_name = 'Vargas'
Dan neem je die query en die zet je tussen haakjes. Dit gedeelte noemen we de subquery of ook wel de inner query.
(SELECT hire_date
FROM employees
WHERE last_name = 'Vargas')
En dan zetten we daar een andere query voor. Dit gedeelte is de main query of ook wel de outer query genoemd.
SELECT first_name, last_name, hire_date
FROM employees
WHERE hire_date >
(SELECT hire_date
FROM employees
WHERE last_name = 'Vargas');
Een ander voorbeeld: Wie werkt er op dezelfde afdeling als Lex De Haan?
Eerst vraag je het department_id op van De Haan.
SELECT department_id
FROM employees
WHERE last_name = 'De Haan'
Neem die query en zet die tussen haakjes.
(SELECT department_id
FROM employees
WHERE last_name = 'De Haan')
En dan zetten we daar een andere query voor.
SELECT last_name
FROM employees
WHERE department_id =
(SELECT department_id
FROM employees
WHERE last_name = 'De Haan');
Wil je daar De Haan zelf niet bij? Dan zet je in de WHERE met != erbij dat de achternaam niet gelijk mag zijn aan De Haan.
SELECT last_name
FROM employees
WHERE last_name != 'De Haan' AND department_id =
(SELECT department_id
FROM employees
WHERE last_name = 'De Haan');
Er zijn twee soorten subquery's:
•single-row subquery's
•multiple-row subquery's