Ga naar hoofdinhoud

JOIN

Tot nu toe hebben we vrijwel alleen nog maar informatie gehaald uit één tabel, maar heel vaak zul je informatie op willen halen die uit verschillende tabellen komt. Stel bijvoorbeeld dat je alle achternamen wil tonen met hun department_id en de department_name. De last_name staat in de tabel employees, department_name staat in departments en het department_id staat zowel in employees als in departments. Probeer onderstaande query en je zult zien dat je een foutmelding krijgt!

SELECT last_name, department_id, department_name
FROM employees, departments;

Het systeem meldt dat de kolom department_id ambigu (tweeslachtig) is. Dat komt omdat department_id zowel in employees staat als in departments en het systeem weet niet welke kolom je bedoelt. Door het gebruik van een alias voor de tabellen employees en departments kun je aangeven uit welke tabel department_id genomen moet worden. We passen nu de query aan door een alias toe te voegen aan de beide tabellen. De tabel employees noemen we tijdelijk 'e' en de tabel departments noemen we tijdelijk 'd'. De query zal het nu wel doen, maar we hebben een ander probleem!

SELECT e.last_name, d.department_id, d.department_name
FROM employees e, departments d
LIMIT 20;

Er verschijnen 160 rijen en je ziet dat alle employees allemaal op alle departments werken. Er zijn 20 employees en 8 departments en je krijgt dus 20 x 8 = 160 rijen terug. In onderstaande afbeelding worden enkel King en Kochar getoond. In zo'n geval spreekt men van een Cartesisch product.

last_namedepartment_iddepartment_name
King10Administration
King20Marketing
King50Shipping
King60IT
King80Sales
King90Executive
King110Accounting
King190Contracting
Kochhar10Administration
Kochhar20Marketing
Kochhar50Shipping
Kochhar60IT
Kochhar80Sales
Kochhar90Executive
Kochhar110Accounting
Kochhar190Contracting
De Haan10Administration
De Haan20Marketing
De Haan50Shipping
De Haan60IT

Je begrijpt dat dit niet de bedoeling is. King en Kochar werken alleen maar op de afdeling Executive. Om de juiste gegevens te krijgen moet je iets heel belangrijks doen en dat is dat je een join voorwaarde inbouwt. Dat kan bijvoorbeeld op de volgende manier met een WHERE component.

SELECT e.last_name, d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id;

Nu krijg je de juiste informatie met 19 rijen. Geen 20 want Grant werkt niet op een afdeling.

last_namedepartment_iddepartment_name
King90Executive
Kochhar90Executive
De Haan90Executive
Hunold60IT
Ernst60IT
Lorentz60IT
Mourgos50Shipping
Rajs50Shipping
Davies50Shipping
Matos50Shipping
Vargas50Shipping
Zlotkey80Sales
Abel80Sales
Taylor80Sales
Whalen10Administration
Hartstein20Marketing
Fay20Marketing
Higgins110Accounting
Gietz110Accounting

We noemen dit een equijoin. Equi (gelijk) slaat op het is-gelijk-teken. Er is een aantal mogelijkheden om de juiste informatie uit verschillende tabellen te halen. Hierna komen ze allemaal aan bod zodat je ze herkent.

notitie

In de praktijk wordt echter vooral de LEFT JOIN ON gebruikt en daar moeten we de grootste aandacht naar uit laten gaan.