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
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.
-- 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:
-- 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
Retourneer de voornaam (voornaam) en achternaam (achternaam) van medewerkers aan wie GEEN afdeling is toegewezen. Eén of meer rijen, twee kolommen.
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
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.
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