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

 

clip0185

 

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'

 

clip0184

 

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');

 

 

clip0185

 

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'

 

clip0186

 

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');

 

clip0187

 

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');

 

clip0188

 

Er zijn twee soorten subquery's:

single-row subquery's

multiple-row subquery's