Ga naar hoofdinhoud

Subquery

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';
first_namelast_namehire_date
DianaLorentz1999-02-07
KevinMourgos1999-11-16
EleniZlotkey2000-01-29
KimberelyGrant1999-05-24

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';
hire_date
1998-07-09

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');
first_namelast_namehire_date
DianaLorentz1999-02-07
KevinMourgos1999-11-16
EleniZlotkey2000-01-29
KimberelyGrant1999-05-24

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';
department_id
90

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');
last_name
King
Kochhar
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');
last_name
King
Kochhar

Er zijn twee soorten subquery's:

  • single-row subquery's
  • multiple-row subquery's