Direct naar de hoofdinhoud
Module 3 · Les 2 van 410/57 in de cursus~10 min
Modulelessen (2/4)

Alles aan de linkerkant houden: LEFT JOIN

De INNER JOIN uit de vorige les heeft een belangrijk neveneffect: it laat rijen vallen die geen overeenkomst hebben. Als een medewerker geen afdeling heeft (department_id is NULL), ze verdwijnen uit het resultaat.

Soms is dat wat je wilt. Vaak is dat echter niet het geval: in een HR-rapport het is essentieel om alle medewerkers te zien, ook degenen zonder afdeling, en weet wie ze zijn. Dat is waar LEFT JOIN voor is (volledig: LEFT BUITENVERBINDING).

Hoe het werkt

SQL
SELECT columns
FROM   table_a
LEFT JOIN table_b ON table_a.x = table_b.y;

In het Engels gelezen: "bewaar alle rijen van table_a; probeer voor elke rij voeg een rij toe van table_b; als er geen overeenkomst is, vul dan de kolommen in table_b met NULL".

Het sleutelwoord is LEFT: het betekent "linkertabel", d.w.z. degene die geschreven is na FROM. Alle rijen overleven altijd.

SQL
-- All employees, including those without a department:
SELECT e.first_name,
       e.last_name,
       d.name AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

In onze dataset retourneert deze zoekopdracht 10 rijen (elk één medewerker). Andrea Costa, die department_id = NULL heeft, verschijnt met dipartimento = NULL in plaats van te verdwijnen.

De rijen 'geen overeenkomst' zoeken

Een zeer nuttig gevolg: door te filteren met IS NULL op een kolom van de rechtertabel vindt u precies de rijen zonder match:

SQL
-- Orphan employees: no department assigned
SELECT e.first_name, e.last_name
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id
WHERE  d.id IS NULL;

Deze truc wordt in de echte wereld de hele tijd gebruikt: "vind bestellingen voor mij zonder klant", "producten zonder beoordelingen", "gebruikers die nog nooit zijn ingelogd in".

Probeer het

Oefening#sql.m3.l2.e1
Pogingen: 0Laden…

Retourneer de voornaam (voornaam) en achternaam (achternaam) van medewerkers aan wie GEEN afdeling is toegewezen. Eén of meer rijen, twee kolommen.

Editor laden…
Toon hint

Vul WHERE in met d.id IS NULL. U wilt de rijen waarin de LEFT JOIN geen overeenkomende afdeling heeft gevonden.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#sql.m3.l2.e2
Pogingen: 0Laden…

Vermeld alle afdelingen (departments.name) en daarnaast het aantal medewerkers, inclusief afdelingen zonder medewerkers (toon daarvoor 0). Tip: begin bij afdelingen en doe een LEFT JOIN met medewerkers, daarna GROUP BY + COUNT.

Editor laden…
Toon hint

Gebruik COUNT(e.id) (niet COUNT(*)) om 0 te tellen als er geen overeenkomst is: COUNT(*) zou 1 tellen vanwege de LEFT JOIN-rij met NULL.

Oplossing beschikbaar na 3 pogingen