Joins

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;

 

clip0275

 

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;

 

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 Cartesiaans of Cartesisch product.

 

clip0276

 

 

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.

 

clip0277

 

 

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.

 

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