LEFT JOIN en niet-overeenkomende rijen behouden
Wat LEFT JOIN behoudt en hoe NULL's verschijnen bij niet-overeenkomende rijen
LEFT JOIN en niet-overeenkomende rijen behouden is een gratis Voorbereiding op SQL-sollicitatiegesprekken-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Voorbereiding op SQL-sollicitatiegesprekken. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op SQL-sollicitatiegesprekken bevat in totaal 4 lessen.
De interviewsituatie
Een interviewer zegt: "Geef elke klant en diens bestellingen weer, ook klanten die nog nooit een bestelling hebben geplaatst." Een INNER JOIN laat klanten zonder bestellingen weg, dus voldoet niet aan deze vereiste. De oplossing is LEFT JOIN.
Een LEFT JOIN behoudt elke rij uit de linker (als eerste genoemde) tabel en voegt overeenkomende rijen uit de rechtertabel toe wanneer die bestaan. In deze les bouwen we het precieze denkmodel op dat interviewers verwachten.
Wat LEFT JOIN garandeert
De kernbelofte: elke rij uit de linkertabel verschijnt minstens één keer in de uitvoer, met of zonder overeenkomst.
- Als een rij aan de linkerkant overeenkomsten aan de rechterkant vindt, krijg je één uitvoerrij per overeenkomst.
- Als een rij aan de linkerkant geen overeenkomst vindt, krijg je nog steeds één uitvoerrij, met
NULLin alle kolommen van de rechtertabel.
Daarom noemen interviewers dit een outer join: rijen buiten de verzameling overeenkomsten blijven behouden in plaats van te worden verwijderd.
De twee tabellen
Tijdens deze hele les gebruiken we twee eenvoudige tabellen. customers bevat elke klant; orders legt aankopen vast en verwijst via customer_id naar een klant.
Let op: klant 3 (Carol) heeft geen rij in orders. Die niet-gematchte klant is precies wat een LEFT JOIN moet behouden.
-- customers
-- id | name
-- 1 | Alice
-- 2 | Bob
-- 3 | Carol
-- orders
-- id | customer_id | amount
-- 10 | 1 | 50
-- 11 | 1 | 75
-- 12 | 2 | 20De LEFT JOIN schrijven
De syntaxis lijkt op die van een inner join: vervang INNER door LEFT (het woord OUTER is optioneel: LEFT JOIN en LEFT OUTER JOIN zijn identiek).
De tabel die vóór het sleutelwoord staat, is de behouden linkerzijde. De volgorde is belangrijk: customers LEFT JOIN orders behoudt alle klanten, niet alle bestellingen.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id;Het resultaat lezen
Dit is de uitvoer van die query. Alice heeft twee overeenkomsten en verschijnt daarom twee keer. Bob heeft één overeenkomst. Carol heeft geen enkele overeenkomst, dus ze verschijnt toch met NULL in de kolom amount.
Die ene rij voor Carol met NULL is het kenmerk van een LEFT JOIN. Een interviewer die je hardop ziet redeneren, wil horen: "Niet-gematchte rijen aan de linkerkant blijven behouden, met NULL-waarden aan de rechterkant."
-- name | amount
-- Alice | 50
-- Alice | 75
-- Bob | 20
-- Carol | NULL <-- preserved, no matchWaar de NULL-waarden vandaan komen
De NULL wordt nergens opgeslagen. De database genereert deze waarde omdat er geen rij uit de rechtertabel is die amount kan leveren.
Elke kolom uit de rechtertabel wordt NULL voor een niet-gematchte rij aan de linkerkant: o.id, o.customer_id en o.amount zijn allemaal NULL in de rij van Carol. Dit is belangrijk omdat het feit dat o.customer_id NULL is niet betekent dat de klant geen id heeft; het betekent dat er helemaal geen overeenkomende bestelling was.
Bestellingen per klant tellen
Een veelvoorkomende vervolgvraag is: "Hoeveel bestellingen heeft elke klant, ook klanten met nul bestellingen?" Een LEFT JOIN in combinatie met COUNT is hiervoor perfect, maar je moet de kolom uit de rechtertabel tellen, niet *.
COUNT(o.id) negeert NULL-waarden, dus Carol krijgt 0. COUNT(*) zou ten onrechte 1 voor Carol opleveren, omdat de gegenereerde NULL-rij nog steeds als rij wordt geteld.
SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 2
-- Bob | 1
-- Carol | 0Valkuil: COUNT(*) versus COUNT(kolom)
Dit is een klassieke interviewvalkuil. Na een LEFT JOIN bestaat de niet-gematchte rij aan de linkerkant fysiek in het resultaat, met NULL in de kolommen aan de rechterkant.
COUNT(*)telt die rij en geeft 1 voor een klant zonder bestellingen.COUNT(o.id)slaat de NULL over en geeft terecht 0.
Tel altijd een kolom die NULL is aan de kant zonder overeenkomst wanneer je echte nullen nodig hebt.
-- WRONG: Carol shows 1
SELECT c.name, COUNT(*) AS n
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;Optellen met LEFT JOIN
Aggregaten naast COUNT gaan voorzichtig om met de gegenereerde NULL-waarden. SUM negeert NULL-waarden, dus een niet-gematchte klant levert NULL op (geen fout).
Interviewers willen voor rapportages vaak nul in plaats van NULL. Plaats het aggregaat binnen COALESCE om een standaardwaarde in te vullen.
SELECT c.name,
COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 125
-- Bob | 20
-- Carol | 0Linker- versus rechtertabel, duidelijk uitgelegd
Wanneer een interviewer vraagt "welke tabel blijft behouden?", antwoord dan vol vertrouwen: de tabel links van het JOIN-sleutelwoord. Lees van links naar rechts.
A LEFT JOIN B = behoud alle rijen van A. Als je in plaats daarvan alle rijen van B wilt behouden, draai je de volgorde om naar B LEFT JOIN A of gebruik je een RIGHT JOIN. De meeste teams gebruiken vanwege de leesbaarheid uitsluitend LEFT JOIN en ordenen daarvoor simpelweg de tabellen opnieuw.
Een mentale controlelijst
Als je in een interview een LEFT JOIN ziet, loop dan deze controlelijst hardop langs:
- Behouden zijde? De linkertabel; alle rijen blijven behouden.
- Niet-gematchte rijen? Verschijnen één keer met NULL-waarden uit de rechtertabel.
- Tellen? Gebruik
COUNT(right_col)voor echte nullen. - Optellen? Plaats het aggregaat binnen
COALESCEals je 0 en niet NULL nodig hebt.
Door deze controlelijst hardop te verwoorden, laat je grondigheid op seniorniveau zien.
Korte controle
Toets je intuïtie voor LEFT JOIN bij het tellen.
Samenvatting
LEFT JOIN behoudt elke rij van de linkertabel. Rijen aan de linkerkant met een overeenkomst worden gekoppeld aan hun overeenkomsten aan de rechterkant; niet-gematchte rijen aan de linkerkant blijven één keer behouden met NULL in alle kolommen van de rechtertabel.
- De linkertabel is de tabel vóór het sleutelwoord
JOIN. - Door de database gegenereerde NULL-waarden markeren rijen zonder overeenkomst.
COUNT(right_col)geeft echte nullen;COUNT(*)doet dat niet.COALESCE(SUM(...), 0)verandert NULL-totalen in nul.
Dit vormt de basis voor het vinden van ontbrekende gegevens en anti-joins in de volgende lessen.
Leer SQL met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “LEFT JOIN en niet-overeenkomende rijen behouden” gratis?
Ja — de volledige tekst van “LEFT JOIN en niet-overeenkomende rijen behouden” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Voorbereiding op SQL-sollicitatiegesprekken wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op SQL-sollicitatiegesprekken bevat in totaal 4 lessen.
Wat leer ik in “LEFT JOIN en niet-overeenkomende rijen behouden”?
Wat LEFT JOIN behoudt en hoe NULL's verschijnen bij niet-overeenkomende rijen Je oefent met Voorbereiding op SQL-sollicitatiegesprekken door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Voorbereiding op SQL-sollicitatiegesprekken te beginnen?
Ervaring vooraf is niet nodig. Voorbereiding op SQL-sollicitatiegesprekken op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “LEFT JOIN en niet-overeenkomende rijen behouden”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Voorbereiding op SQL-sollicitatiegesprekken?
Ja. Elke les over Voorbereiding op SQL-sollicitatiegesprekken bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- LEFT JOIN en niet-overeenkomende rijen behouden
- Semantiek van RIGHT en FULL OUTER JOIN
- Rijen zonder overeenkomst vinden (anti-join)
- De valkuil van WHERE bij outer joins