Setbewerkingen nabootsen met joins
EXCEPT en INTERSECT herschrijven in dialecten waarin ze ontbreken
Setbewerkingen nabootsen met joins is een gratis Voorbereiding op programmeerinterviews-les op CoddyKit. Dit is les 4 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 programmeerinterviews. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.
Waarom je setbewerkingen nabootst
Niet elke database ondersteunt INTERSECT en EXCEPT. Oudere versies van MySQL ondersteunden ze bijvoorbeeld helemaal niet. Interviewers toetsen of je setlogica kunt nabootsen met joins en subqueries wanneer de operator niet beschikbaar is.
Als je zowel de setoperator als het gelijkwaardige joinpatroon kent, bewijs je dat je begrijpt wat de operator daadwerkelijk berekent.
INTERSECT als INNER JOIN
INTERSECT vindt de rijen die in beide sets voorkomen. Het gelijkwaardige joinpatroon is een INNER JOIN op alle vergeleken kolommen, plus DISTINCT om hetzelfde ontdubbelingsgedrag te krijgen.
Elke kolom in de vergelijking wordt onderdeel van het joinpredicaat.
-- A INTERSECT B emulated:
SELECT DISTINCT a.customer_id
FROM orders_2023 a
JOIN orders_2024 b
ON a.customer_id = b.customer_id;Waarom DISTINCT nodig is voor INTERSECT
Een gewone INNER JOIN kan rijen vermenigvuldigen: als een waarde aan een of beide kanten meerdere keren voorkomt, maakt de join meerdere rijen. Een standaard-INTERSECT geeft elke gemeenschappelijke rij één keer terug, dus voeg je DISTINCT toe om de duplicaten die de join veroorzaakt samen te voegen.
DISTINCT hier vergeten is een veelgemaakte fout in sollicitatiegesprekken.
-- without DISTINCT, a customer with 3 orders in each year
-- would appear 9 times from the joinEXCEPT als een LEFT JOIN / IS NULL
EXCEPT (A maar niet B) is de anti-join. De database-onafhankelijke vorm is een LEFT JOIN van A naar B op alle kolommen, waarbij je alleen rijen behoudt waarvoor de B-kant NULL is (geen overeenkomst), gevolgd door DISTINCT.
Dit patroon met LEFT JOIN / IS NULL is een van de meest hergebruikte trucs in SQL-sollicitatiegesprekken.
SELECT DISTINCT a.customer_id
FROM orders_2023 a
LEFT JOIN orders_2024 b
ON a.customer_id = b.customer_id
WHERE b.customer_id IS NULL;EXCEPT met NOT EXISTS
Een even database-onafhankelijke vorm van EXCEPT gebruikt NOT EXISTS. Je leest het als: "behoud elke rij uit A waarvoor geen overeenkomende rij in B bestaat". Bovendien gaat het robuust om met NULL-waarden.
Veel ontwikkelaars geven de voorkeur aan NOT EXISTS omdat de bedoeling expliciet is en het de valkuil van NOT IN + NULL omzeilt.
SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE NOT EXISTS (
SELECT 1 FROM orders_2024 b
WHERE b.customer_id = a.customer_id
);INTERSECT met EXISTS
Op vergelijkbare wijze kun je INTERSECT schrijven met EXISTS: behoud elke unieke rij uit A waarvoor een overeenkomende rij in B bestaat.
EXISTS stopt zodra de eerste overeenkomst is gevonden, dus het kan efficiënt zijn. Bovendien voorkomt het de vermenigvuldiging van rijen door de join, waardoor je aan de join-kant soms geen DISTINCT nodig hebt.
SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE EXISTS (
SELECT 1 FROM orders_2024 b
WHERE b.customer_id = a.customer_id
);De NULL-valkuil van NOT IN
Een voor de hand liggende nabootsing van EXCEPT is NOT IN, maar die is gevaarlijk: als de subquery ook maar één NULL oplevert, levert NOT IN helemaal geen rijen op omdat de vergelijking UNKNOWN wordt.
Dit is een veelvuldig getoetste valkuil. Geef de voorkeur aan NOT EXISTS of LEFT JOIN / IS NULL; die zijn veilig voor NULL-waarden.
-- RISKY if orders_2024.customer_id can be NULL:
SELECT DISTINCT customer_id FROM orders_2023
WHERE customer_id NOT IN (
SELECT customer_id FROM orders_2024
);Vergelijken op meerdere kolommen
Wanneer de vergelijking van verzamelingen meerdere kolommen omvat, moet elke kolom in het predicaat voor de join worden opgenomen. Bij een anti-join moet je bovendien rekening houden met NULL-waarden in die kolommen; daarin blinkt NOT EXISTS uit.
Schrijf elke kolom expliciet uit in de ON-clausule; als je er één weglaat, verandert stilletjes wat een "gelijke rij" betekent.
SELECT DISTINCT a.id, a.city
FROM a
LEFT JOIN b
ON a.id = b.id AND a.city = b.city
WHERE b.id IS NULL;UNION nabootsen zonder de operator
UNION ALL is simpelweg aaneenschakeling, die elk dialect rechtstreeks ondersteunt. Om waar nodig een UNION zonder duplicaten na te bootsen, voeg je de resultaten samen met UNION ALL in een subquery en omhul je die met SELECT DISTINCT of GROUP BY voor alle kolommen.
Hieruit blijkt dat UNION eenvoudigweg UNION ALL plus een stap voor het verwijderen van duplicaten is.
SELECT DISTINCT * FROM (
SELECT city FROM a
UNION ALL
SELECT city FROM b
) combined;De juiste nabootsing kiezen
Keuzegids:
- INTERSECT →
EXISTSof INNER JOIN + DISTINCT. - EXCEPT →
NOT EXISTSof LEFT JOIN / IS NULL. - Vermijd
NOT INwanneer NULL-waarden mogelijk zijn. - UNION → UNION ALL omhuld door DISTINCT.
EXISTS / NOT EXISTS zijn het meest database-onafhankelijk en veilig voor NULL-waarden, waardoor ze de veiligste antwoorden in sollicitatiegesprekken zijn.
Alles samenbrengen
Als je verzamelingsoperatoren kunt vertalen naar joins, laat je zien dat je ze begrijpt als verzamelingslogica en niet alleen als syntax. De anti-join (LEFT JOIN / IS NULL of NOT EXISTS) is het patroon met de meeste waarde: je ziet het terug bij het nabootsen van EXCEPT, het vinden van verweesde records en vragen over ontbrekende records.
Begin voor de correctheid met NOT EXISTS en noem daarna de join-vorm bij een bespreking van de prestaties.
Korte controle
Je database ondersteunt EXCEPT niet. Je hebt de customer_ids in orders_2023 nodig die niet in orders_2024 staan, en de kolom kan NULL-waarden bevatten.
Samenvatting
Belangrijkste punten:
INTERSECT→ INNER JOIN + DISTINCT, ofEXISTS.EXCEPT→ LEFT JOIN / IS NULL, ofNOT EXISTS(anti-join).- Voeg
DISTINCTtoe om het deduplicatiegedrag van de verzamelingsoperatoren na te bootsen en de vermenigvuldiging van rijen door joins in toom te houden. - Vermijd
NOT INbij mogelijke NULL-waarden; geef de voorkeur aan NOT EXISTS. UNION= UNION ALL omhuld door DISTINCT.
Leer Voorbereiding op programmeerinterviews 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
- 90
- Lessen
- 360
Veelgestelde vragen
Is de les “Setbewerkingen nabootsen met joins” gratis?
Ja — de volledige tekst van “Setbewerkingen nabootsen met joins” 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 programmeerinterviews wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.
Wat leer ik in “Setbewerkingen nabootsen met joins”?
EXCEPT en INTERSECT herschrijven in dialecten waarin ze ontbreken Je oefent met Voorbereiding op programmeerinterviews 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 programmeerinterviews te beginnen?
Ervaring vooraf is niet nodig. Voorbereiding op programmeerinterviews 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 4 van 4.
Hoe lang duurt de les “Setbewerkingen nabootsen met joins”?
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 programmeerinterviews?
Ja. Elke les over Voorbereiding op programmeerinterviews 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
- UNION versus UNION ALL
- Compatibiliteit van aantal en typen kolommen
- INTERSECT en EXCEPT voor vergelijkingen
- Setbewerkingen nabootsen met joins