Tutorial voor SQL-subquery’s: Typen, gecorreleerde subquery’s en BESTAAN met voorbeelden
Een subquery is een query binnen een andere query. Leer elk type en waar het past, begrijp gecorreleerde subquery’s goed en vermijd de NOT IN-val die stilletjes helemaal geen rijen retourneert.
- Een subquery is een query die in een andere query is genest en de buitenste query gebruikt het resultaat ervan.
- Subquery’s kunnen voorkomen in
WHERE,FROM,SELECTenHAVING. - Een gecorreleerde subquery verwijst naar de buitenste rij en wordt dus logisch per rij geëvalueerd.
- Geef de voorkeur aan
NOT EXISTSbovenNOT INwanneer NULL’s mogelijk zijn.
Voor het beantwoorden van sommige vragen zijn twee stappen nodig. “Welke bestellingen zijn bovengemiddeld?” vereist dat u eerst het gemiddelde vindt en vervolgens elke bestelling daarmee vergelijkt. Met SQL-subquery’s kunt u beide stappen als één instructie schrijven.
In deze zelfstudie wordt elk type behandeld met behulp van twee kleine tabellen. We hebben deze query’s uitgevoerd in SQLite 3.50 en de weergegeven resultaten zijn afkomstig van die run. De standaardsyntaxis van subquery’s wordt breed ondersteund en we wijzen op de punten waarop databases verschillen.
Wat is een subquery?
Een subquery, ook wel een innerlijke of geneste query genoemd, is een SELECT-instructie die tussen ronde haakjes in een andere instructie wordt geplaatst. Conceptueel gezien levert de binnenste query een resultaat op dat vervolgens door de buitenste query wordt gebruikt.
SELECT id, total
FROM orders
WHERE total > (SELECT AVG(total) FROM orders);
De voorbeeldtabellen
CREATE TABLE customers (id INT, name TEXT, city TEXT);
CREATE TABLE orders (id INT, customer_id INT, total INT);
INSERT INTO customers VALUES
(1,'Asha','Pune'), (2,'Ben','Delhi'), (3,'Chitra','Pune'), (4,'Dev','Goa');
INSERT INTO orders VALUES
(101,1,1200), (102,1,800), (103,2,300), (104,3,2500), (105,3,100);
Houd er rekening mee dat Dev geen orders heeft. Dat detail is van belang voor verschillende voorbeelden hieronder.
Soorten subquery’s in één oogopslag
| Typ | Retouren | Typische locatie | Algemene operatoren |
|---|---|---|---|
| Scalair | Eén waarde | WHERE, SELECT |
=, >, < |
| Meerdere rijen | Eén kolom, veel rijen | WAAR |
IN, ANY, ALL |
| Tabel (afgeleid) | Veel kolommen en rijen | VAN |
Gebruikt als tafel |
| Gecorreleerd | Afhankelijk van de buitenste rij | WHERE, SELECT |
Elke, en EXISTS |
Scalaire subquery’s
Een scalaire subquery retourneert precies één waarde, zodat u deze overal kunt gebruiken waar een enkele waarde zinvol is. Hier is de vraag van eerder, met het resultaat. Het gemiddelde van alle bestellingen is 980:
SELECT id, total
FROM orders
WHERE total > (SELECT AVG(total) FROM orders);
-- 101 | 1200
-- 104 | 2500
Je kon niet WHERE total > AVG(total) schrijven, omdat aggregaten niet rechtstreeks in WHERE zijn toegestaan. De subquery omzeilt dit door de waarde afzonderlijk te berekenen.
Wat als een ‘scalaire’ subquery meerdere rijen retourneert? De meeste databases, waaronder PostgreSQL, MySQL en SQL Server, geven een foutmelding. SQLite niet. In onze test gebruikte het stilletjes alleen de eerste rij, die een echte bug zou kunnen verbergen, dus vertrouw niet op dit gedrag.
IN en NIET IN
Wanneer de innerlijke query een lijst retourneert, gebruik dan IN. Dit vindt klanten met minstens één bestelling boven de 1000:
SELECT name FROM customers
WHERE id IN (SELECT customer_id FROM orders WHERE total > 1000);
-- Asha
-- Chitra
NOT IN doet het tegenovergestelde en vindt klanten die nog nooit hebben besteld:
SELECT name FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);
-- Dev
Dat werkt hier, maar NOT IN heeft een gevaarlijk randgeval, dat we hieronder bespreken.
Subquery’s in FROM
Een subquery in FROM fungeert als een tijdelijke tabel, vaak een afgeleide tabel genoemd. Dit is handig als u twee keer moet aggregeren, zoals in deze zoekopdracht voor de gemiddelde uitgaven per klant in elke stad:
SELECT city, AVG(spent) AS avg_spent
FROM (
SELECT c.city, SUM(o.total) AS spent
FROM customers c
JOIN orders o ON o.customer_id = c.id
GROUP BY c.id, c.city
) AS per_customer
GROUP BY city;
-- Delhi | 300.0
-- Pune | 2300.0
De binnenste zoekopdracht telt het totaal van elke klant, en de buitenste telt het gemiddelde van deze totalen. Het is een goede gewoonte om de afgeleide tabel een alias te geven, aangezien sommige databases dit vereisen. Als GROUP BY nieuw voor je is, zie dan SQL GROUP BY en HAVING.
Subquery’s in SELECT
Een scalaire subquery kan ook een berekende kolom toevoegen. Deze telt bestellingen per klant:
SELECT name,
(SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.id) AS order_count
FROM customers c;
-- Asha | 2
-- Ben | 1
-- Chitra | 2
-- Dev | 0
Dev verschijnt met nul. Een inner join zou Dev volledig hebben verwijderd, omdat Dev geen overeenkomende rijen heeft. Je zou hetzelfde resultaat kunnen krijgen met een LEFT JOIN en GROUP BY, wat we uitleggen in SQL-joins uitgelegd.
Gecorreleerde subquery’s
Het vorige voorbeeld is ook gecorreleerd, aangezien de binnenste query verwijst naar c.id uit de buitenste query. Een niet-gecorreleerde subquery kan alleen worden uitgevoerd. Een gecorreleerde kan dat niet, omdat deze afhankelijk is van een waarde uit de huidige buitenste rij.
Dit vindt bestellingen boven het eigen gemiddelde van diezelfde klant:
SELECT o.id, o.customer_id, o.total
FROM orders o
WHERE o.total > (
SELECT AVG(i.total)
FROM orders i
WHERE i.customer_id = o.customer_id
);
-- 101 | 1 | 1200
-- 104 | 3 | 2500
Hier leest u hoe u het kunt lezen. Voor bestelling 101 berekent de interne zoekopdracht het gemiddelde van de bestellingen van klant 1 (1200 en 800), wat 1000 oplevert. Omdat 1200 groter is, wordt de rij behouden. Voor bestelling 102 geldt hetzelfde gemiddelde, maar 800 is niet groter en valt dus weg. De enkele bestelling van klant 2 is gelijk aan zijn eigen gemiddelde, dus deze wordt ook geschrapt.
| Functie | Niet-gecorreleerd | Gecorreleerd |
|---|---|---|
| Gebruikt buitenste querywaarden? | Nee | Ja |
| Kan op eigen kracht draaien? | Ja | Nee |
| Logische uitvoering | Een keer | Eén keer per buitenste rij |
| Prestatierisico | Meestal laag | Kan hoog op grote tafels staan |
“Eenmaal per rij” beschrijft de logica, en query-optimalisatieprogramma’s herschrijven deze vaak in iets veel efficiënter. Toch is een langzame gecorreleerde subquery het onderzoeken waard. Een index op de binnenste kolom, hier orders.customer_id, kan een groot verschil maken. Zie SQL-indexen uitgelegd.
BESTAAT en BESTAAT NIET
EXISTS stelt een ja of nee-vraag: retourneert de innerlijke query minstens één rij? Het kan stoppen bij de eerste match, en wat je daarin selecteert, doet er niet toe. Daarom schrijven mensen vaak SELECT 1.
SELECT c.name FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
-- Asha, Ben, Chitra
SELECT c.name FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
-- Dev
De NOT IN NULL-val
Dit is een van de meest voorkomende subquery-bugs. We hebben een tabel gemaakt met één echte ID en één NULL, en vervolgens beide formulieren erop uitgevoerd:
CREATE TABLE r (customer_id INT);
INSERT INTO r VALUES (1), (NULL);
SELECT name FROM customers
WHERE id NOT IN (SELECT customer_id FROM r);
-- (no rows at all)
SELECT c.name FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM r WHERE r.customer_id = c.id);
-- Ben, Chitra, Dev
Waarom levert de eerste niets op? id NOT IN (1, NULL) betekent id <> 1 AND id <> NULL. Elke vergelijking met NULL is eerder onbekend dan waar, dus de hele voorwaarde kan nooit waar zijn. Er is geen foutmelding en geen waarschuwing, alleen een leeg resultaat dat er plausibel uitziet.
Tip: Gebruik standaard NOT EXISTS voor anti-joins. Als u NOT IN gebruikt, voegt u WHERE customer_id IS NOT NULL toe aan de subquery.
Subquery versus JOIN versus CTE
Veel query’s kunnen op meer dan één manier worden geschreven. Eerder vonden we klanten met een grote bestelling via IN. Hier is hetzelfde resultaat met een join:
SELECT DISTINCT c.name FROM customers c
JOIN orders o ON o.customer_id = c.id AND o.total > 1000;
-- Asha
-- Chitra
Let op de DISTINCT. Een join kan duplicaten opleveren als een klant meerdere matches heeft, terwijl IN en EXISTS dat niet kunnen.
| Gebruik | Wanneer |
|---|---|
| DOE MEE | Je hebt kolommen uit beide tabellen nodig |
| IN of BESTAAT | U hoeft alleen maar te filteren op de vraag of er een match bestaat |
| Afgeleide tafel | Je moet eerst aggregeren en het blijft kort |
| CTE | De logica bestaat uit verschillende stappen of wordt meerdere keren gebruikt |
| Raamfunctie | Naast elke rij heeft u een cijfer per groep nodig |
De prestaties variëren per database en data, en moderne optimizers produceren vaak vergelijkbare plannen. Kies dus eerst de duidelijkste vorm en vink vervolgens EXPLAIN aan als deze langzaam blijkt te zijn.
Veel voorkomende fouten
- Gebruik
=met een resultaat met meerdere rijen. GebruikINof zorg ervoor dat de binnenste query één rij retourneert. - Gebruik
NOT INvoor een null-kolom. Je kunt elke rij stilletjes kwijtraken. - Gebruik onduidelijke aliassen. Bij gecorreleerde zoekopdrachten moet u elke kolom kwalificeren, anders kan deze aan de verkeerde tabel worden gekoppeld.
- Diepe nesting. Drie niveaus zijn moeilijk te lezen, dus converteer ze naar CTE’s.
- Het toevoegen van
ORDER BYaan de binnenkant. Dit heeft meestal geen effect op het uiterlijke resultaat, en sommige databases wijzen dit af.
Tot slot
Subquery’s zijn een natuurlijke manier om vragen in twee stappen uit te drukken. Begin met scalaire subquery’s en IN, en oefen vervolgens met de gecorreleerde subquery’s door één buitenste rij tegelijk te doorlopen. En onthoud NOT EXISTS wanneer NULL’s mogelijk zijn. Om te oefenen kunt u een vraag op drie manieren schrijven, met een subquery, een join en een CTE, en zowel de resultaten als de leesbaarheid vergelijken.
Veelgestelde vragen
Wat is een subquery in SQL?
Een subquery is een SELECT-instructie die tussen haakjes in een andere SQL-instructie is genest. De buitenste instructie gebruikt het resultaat als een waarde, een lijst of een tabel.
Wat is een gecorreleerde subquery?
Het is een subquery die verwijst naar een kolom uit de buitenste query. Het is afhankelijk van de huidige buitenste rij en kan dus niet zelfstandig draaien.
Wat is sneller: een subquery of een JOIN?
Het hangt af van de database en gegevens, en optimizers komen vaak met vergelijkbare plannen. Schrijf eerst de duidelijkste versie en vergelijk vervolgens de uitvoeringsplannen als de prestaties ertoe doen.
Wat is het verschil tussen IN en EXISTS?
IN vergelijkt een waarde met een lijst met resultaten. EXISTS controleert of er überhaupt een rij wordt geretourneerd. Ze gedragen zich anders met NULL’s wanneer ze worden genegeerd.
Kan een subquery meerdere kolommen retourneren?
Ja, bij gebruik in FROM als een afgeleide tabel, en sommige databases staan ook rijvergelijkingen toe. Een scalaire subquery mag slechts één kolom en één rij retourneren.
Blijf leren
Hulp nodig met testen, WordPress of SEO?
We helpen teams betere software te leveren en hun sites te laten groeien. Vertel ons waar u mee bezig bent en wij stellen een duidelijke volgende stap voor.
Meer handleidingen over testen, AI en moderne ontwikkeling
Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.
AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen
AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…
Lees artikel →DevOpsOmgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan
Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…
Lees artikel →SoftwareontwikkelingAPI-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten
API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…
Lees artikel →TestautomatiseringSpotten in Python: unittest.mock, patch en de fouten die tests doen liegen
Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…
Lees artikel →SoftwaretestenCodedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent
Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…
Lees artikel →Databases & SQLDELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken
DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…
Lees artikel →Databases & SQLSQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden
SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…
Lees artikel →SoftwareontwikkelingTypeScript-interface versus type: echte verschillen, getest met de compiler
TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…
Lees artikel →SoftwareontwikkelingPython *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden
Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…
Lees artikel →SoftwareontwikkelingPython Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken
Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…
Lees artikel →Kunstmatige intelligentieWat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren
Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…
Lees artikel →DevOpsMonitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen
Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…
Lees artikel →DevOpsDocker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier
Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…
Lees artikel →TestautomatiseringTDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt
TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…
Lees artikel →SoftwaretestenGebruikersacceptatietesten (UAT): proces, checklist en echte voorbeelden
Gebruikersacceptatietesten uitgelegd: wie voert het uit, hoe het verschilt van QA, een proces in zeven stappen, een UAT-testcase-sjabloon, een check…
Lees artikel →Databases & SQLSQL NULL-waarden uitgelegd: IS NULL, COALESCE, NULLIF en de te vermijden vallen
SQL NULL-waarden uitgelegd met query's die we hebben uitgevoerd: logica met drie waarden, IS NULL, COALESCE, NULLIF, hoe aggregaten, joins en sorter…
Lees artikel →Databases & SQLSQL CASE WHEN-instructie: syntaxis, echte voorbeelden en veelvoorkomende fouten
SQL CASE WHEN uitgelegd met vragen die we hebben uitgevoerd: eenvoudige en doorzochte formulieren, volgorde van de voorwaarden, draaipunten met SUM,…
Lees artikel →SoftwareontwikkelingWat is JWT? JSON-webtokens uitgelegd met een werkend voorbeeld
Wat is JWT? JSON Web Tokens uitgelegd: de drie delen, een token gebouwd en waarmee is geknoeid in de code die we hebben uitgevoerd, JWT versus sessi…
Lees artikel →SoftwareontwikkelingJavaScript-gebeurtenislus uitgelegd: call-stack, microtaken en timers met voorbeelden
De JavaScript-gebeurtenislus uitgelegd met code die we hebben uitgevoerd: call-stack, taak- en microtask-wachtrijen, waarom setTimeout 0 niet onmidd…
Lees artikel →SoftwareontwikkelingPython-generatoren en opbrengst uitgelegd: bespaar geheugen met echte voorbeelden
Python-generatoren en opbrengst uitgelegd met code die we hebben uitgevoerd: hoe ze pauzeren en hervatten, gemeten geheugenbesparingen, pijplijnen, …
Lees artikel →Kunstmatige intelligentieWat zijn inbeddingen? Vectoren en cosinusovereenkomst eenvoudig uitgelegd
Wat zijn insluitingen? Een gids in duidelijke taal over vectoren, cosinusovereenkomst en semantisch zoeken, met een klein voorbeeld dat we hebben ui…
Lees artikel →DevOpsImplementatie van blauwgroen versus kanarie: verschillen, afwegingen en hoe te kiezen
Blauw-groen versus kanarie-implementatie uitgelegd: hoe elk werkt, kosten, risico's en terugdraaien, stabiele gebruikersbucket die we hebben getest,…
Lees artikel →TestautomatiseringSchilferige tests: wat de oorzaak ervan is en hoe u ze voorgoed kunt oplossen
Zwakke tests uitgelegd met demo's die we hebben uitgevoerd: de belangrijkste oorzaken, hoe je er een kunt bevestigen en diagnosticeren, goede oploss…
Lees artikel →SoftwaretestenBelastingtesten versus stresstesten: verschillen, statistieken en k6-voorbeelden
Belastingtesten versus stresstesten uitgelegd: wat elk bewijst, piek- en soak-tests, de statistieken die er toe doen, waarom gemiddelden misleiden, …
Lees artikel →SoftwaretestenTestcase versus testscenario: belangrijkste verschillen, voorbeelden en wanneer deze te gebruiken
Testcase versus testscenario uitgelegd: duidelijke definities, een tabel naast elkaar, één functie voor het opnieuw instellen van wachtwoorden, over…
Lees artikel →Databases & SQLOptimalisatie van SQL-query's: lees uitvoeringsplannen en repareer langzame query's, met timing
Optimalisatie van SQL-query's getest op een miljoen rijen: lees uitvoeringsplannen, voeg de juiste indexen toe, repareer niet-sargeerbare filters, g…
Lees artikel →Databases & SQLSQL UNION versus UNION ALL: verschillen, voorbeelden en geteste prestaties
SQL UNION versus UNION ALL uitgelegd met de query's die we hebben uitgevoerd: duplicaten, de regels volgen beide, een echte databug, gemeten prestat…
Lees artikel →SoftwareontwikkelingJavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs
Een JavaScript Fetch API-tutorial getest tegen een lokale server: GET en POST, waarom 404 niet gooit, een herbruikbare helper, queryreeksen, time-ou…
Lees artikel →SoftwareontwikkelingPython-bestandsverwerking: lezen, schrijven, CSV, JSON en pathlib met voorbeelden
Het verwerken van Python-bestanden uitgelegd met code die we hebben uitgevoerd: open modi, met het lezen van grote bestanden, CSV, JSON, pathlib, bi…
Lees artikel →SoftwareontwikkelingPython-klassen en -objecten: OOP-zelfstudie met echte voorbeelden
Python-klassen en -objecten uitgelegd met code die we hebben uitgevoerd: __init__, methoden, klasse versus instantie-attributen, overerving, eigensc…
Lees artikel →Kunstmatige intelligentieWat is een groot taalmodel? Hoe LLM's werken, uitgelegd zonder de hype
Wat is een groot taalmodel? LLM's uitgelegd in duidelijke taal: tokens, inbedding, aandacht, training, temperatuur- en contextvensters, een kleine d…
Lees artikel →DevOpsLinux-opdrachten voor beginners: de essentiële terminalgids met voorbeelden
Linux-opdrachten voor beginners, gegroepeerd op taak: navigatie, bestanden, logboeken bekijken, grep, pipelines, machtigingen, processen en archieve…
Lees artikel →TestautomatiseringSelenium versus toneelschrijver: belangrijkste verschillen, code vergeleken en welke te kiezen
Selenium versus Playwright vergeleken: architectuur, wachten, browser- en taalondersteuning, debuggen, dezelfde test in beide tools, migratieadvies …
Lees artikel →SoftwaretestenEquivalentiepartitionering: testontwerptechniek uitgelegd met uitgewerkte voorbeelden
Equivalentiepartitionering uitgelegd: hoe je geldige en ongeldige partities kunt vinden, uitgewerkte voorbeelden voor leeftijden, wachtwoorden en ko…
Lees artikel →SoftwaretestenErnst versus prioriteit bij het testen van software: verschillen, matrix en echte voorbeelden
Ernst versus prioriteit bij het testen van software uitgelegd: duidelijke definities, een vierwegmatrix met voorbeelden, niveauschalen, wie deze bep…
Lees artikel →Databases & SQLTutorial voor SQL-subquery's: typen, gecorreleerde subquery's en BESTAAN met voorbeelden
Een SQL-subquery-tutorial met query's die we hebben uitgevoerd: scalaire, IN-, FROM- en SELECT-subquery's, gecorreleerde subquery's, EXISTS, de NOT …
Lees artikel →Databases & SQLSQL-transacties en ACID uitgelegd: COMMIT-, ROLLBACK- en isolatieniveaus
SQL-transacties en ACID uitgelegd met een bankoverschrijving die we hebben uitgevoerd: COMMIT, ROLLBACK, savepoints, locks, isolatieniveaus, dirty r…
Lees artikel →SoftwareontwikkelingGit merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt
Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.
Lees artikel →SoftwareontwikkelingPython list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt
Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.
Lees artikel →Databases & SQLSQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)
Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.
Lees artikel →