Waarom NOT IN?
De focus op de NOT IN-operator komt voort uit de bruikbaarheid in scenario's waar je data wilt uitsluiten. Of je nu data opschoont, rapporten voorbereidt of complexe analyses uitvoert: weten hoe je specifieke datapunten effectief uitsluit, is van onschatbare waarde. Deze operator biedt een eenvoudige syntaxis, maar kent nuances die invloed kunnen hebben op performance en nauwkeurigheid.
We gaan NOT IN uitgebreid verkennen om je een volledig begrip te geven waarmee je deze operator effectief kunt inzetten in je SQL-queries.
SQL NOT IN begrijpen
De basis van NOT IN
De NOT IN-operator wordt gebruikt binnen een WHERE-clausule om rijen uit te sluiten waarbij de waarde van een bepaalde kolom overeenkomt met een opgegeven lijst met waarden. De basis-syntaxis is als volgt:
SELECT column_names
FROM table_name
WHERE column_name NOT IN (value1, value2, ...);
Deze syntaxis benadrukt de rol van de operator bij het filteren van data—een cruciale stap in data-analyse en databasebeheer.
Praktische toepassingen van NOT IN
Stel, je hebt een database met een tabel met klantinformatie. Als je klanten wilt selecteren die niet uit specifieke steden komen, is NOT IN een waardevol hulpmiddel waarmee je die steden eenvoudig uit je resultaten kunt uitsluiten.
Stap-voor-stap NOT IN-voorbeelden
Voorbeeld 1: Specifieke waarden uitsluiten
Stel, we hebben een tabel Customers met kolommen CustomerID, CustomerName en City. Om klanten te vinden die niet in 'New York' of 'Los Angeles' zitten, gebruik je deze query:
|
CustomerlD |
CustomerName |
City |
|
1 |
John Doe |
New York |
|
2 |
Jane Smith |
Los Angeles |
|
3 |
Emily Jones |
Chicago |
|
4 |
Chris Brown |
Miami |
|
5 |
Alex Johnson |
San Francisco |
|
6 |
Jessica White |
New York |
Customers-tabel
SELECT CustomerName, City
FROM Customers
WHERE City NOT IN ('New York', 'Los Angeles');
|
CustomerName |
City |
|
Emily Jones |
Chicago |
|
Chris Brown |
Miami |
|
Alex Johnson |
San Francisco |
Voorbeeld 2: NOT IN met subqueries
NOT IN werkt ook met subqueries. Bijvoorbeeld om producten te vinden die niet besteld zijn:
|
ProductID |
ProductName |
|
1 |
Apple |
|
2 |
Banana |
|
3 |
Orange |
|
4 |
Pear |
|
5 |
Grape |
Tabel Products
|
OrderID |
ProductID |
|
101 |
2 |
|
102 |
4 |
|
103 |
2 |
|
104 |
3 |
Tabel Orders
SELECT ProductName
FROM Products
WHERE ProductID NOT IN (
SELECT ProductID
FROM Orders
);
|
ProductName |
|
Apple |
|
Grape |
Veelvoorkomende valkuilen en hoe je ze vermijdt
Met NULL-waarden omgaan
Een veelvoorkomend probleem met NOT IN ontstaat wanneer de lijst met waarden NULL bevat. Omdat NULL een onbekende waarde vertegenwoordigt, zal elke vergelijking met NULL via NOT IN geen rijen retourneren, zelfs niet als er rijen zijn die logisch zouden moeten worden uitgesloten.
Om dit te omzeilen, zorg je ervoor dat de lijst met waarden geen NULL bevat of gebruik je een alternatieve aanpak zoals NOT EXISTS.
Voorbeeld:
Stel dat we een tabel Orders hebben met een kolom CustomerID, waarvan sommige NULL zijn om gastbestellingen aan te duiden. Als je een query uitvoert om bestellingen te vinden die niet door bepaalde klanten zijn gedaan, zal het opnemen van NULL in de lijst ervoor zorgen dat er geen resultaten worden teruggegeven.
|
OrderID |
CustomerID |
|
101 |
3 |
|
102 |
4 |
|
103 |
2 |
|
104 | |
|
106 |
1 |
Orders-tabel
-- Assume we want to exclude CustomerID 1, 2, and unknown (NULL) customers
SELECT OrderID
FROM Orders
WHERE CustomerID NOT IN (1, 2, NULL);
Deze query retourneert geen rijen, wat waarschijnlijk niet de bedoeling is.
Oplossing: Neem geen NULL op in de lijst voor NOT IN om correcte resultaten te garanderen. Of gebruik een combinatie van NOT IN voor bekende waarden en IS NOT NULL om NULL-waarden goed af te handelen.
SELECT OrderID
FROM Orders
WHERE CustomerID NOT IN (1, 2) AND CustomerID IS NOT NULL;
|
OrderID |
|
101 |
|
102 |
Prestatieoverwegingen
Voor grote datasets of subqueries kan NOT IN minder efficiënt zijn dan alternatieven zoals NOT EXISTS of LEFT JOIN /IS NULL. De inefficiëntie komt voort uit hoe NOT IN elke rij in de tabel vergelijkt met elke waarde in de lijst, wat bij grote datasets tot trage prestaties kan leiden.
Alternatieven voor SQL NOT IN
NOT EXISTS gebruiken
NOT EXISTS wordt vaak aanbevolen boven NOT IN wanneer je werkt met subqueries die NULL-waarden kunnen teruggeven. Het is over het algemeen efficiënter omdat het stopt zodra er een match wordt gevonden.
Voorbeeld:
Om producten te vinden die niet besteld zijn, met NOT EXISTS:
SELECT ProductName
FROM Products p
WHERE NOT EXISTS (
SELECT 1
FROM Orders o
WHERE o.ProductID = p.ProductID
);
|
ProductName |
|
Apple |
|
Grape |
Deze query controleert of een product niet voorkomt in de orders-tabel, wat efficiënter kan zijn dan vergelijken met een mogelijk grote lijst met ID's via NOT IN.
LEFT JOIN / IS NULL
Een ander efficiënt alternatief om rijen uit te sluiten is een LEFT JOIN in combinatie met een WHERE ... IS NULL-clausule. Deze methode is vooral effectief bij grote datasets.
Voorbeeld:
Om hetzelfde doel te bereiken—producten vinden die niet zijn besteld:
SELECT p.ProductName
FROM Products p
LEFT JOIN Orders o ON p.ProductID = o.ProductID
WHERE o.ProductID IS NULL;
|
ProductName |
|
Apple |
|
Grape |
Deze methode gebruikt de LEFT JOIN om alle producten en eventuele bijbehorende orders op te nemen, en filtert vervolgens die producten weg die orders hebben met WHERE o.ProductID IS NULL, zodat ze effectief worden uitgesloten.
Best practices voor het gebruik van NOT IN
- Controleer de lijst op
NULL-waarden: Zorg dat de lijst die inNOT INwordt gebruikt geen NULL-waarden bevat om onverwachte resultaten te voorkomen. - Houd rekening met de datasetgrootte: Evalueer bij grote datasets of subqueries of alternatieven zoals
NOT EXISTSbetere performance bieden. - Indexering: Zorg dat de kolommen die in de
NOT IN-clausule worden gebruikt waar mogelijk geïndexeerd zijn om de query-prestaties te verbeteren.
NOT IN gebruiken in een echt dataproject
In data-analyse wordt de SQL-opdracht "Not IN" vaak gebruikt om specifieke gegevens op te halen. In deze sectie werken we met een boekhandeldatabase die de voorraad (boeken in de winkel) en verkopen (verkochte boeken) bijhoudt. Ons doel is te achterhalen welke boeken nog nooit zijn verkocht.
We hebben twee tabellen:
- Inventory: voor informatie over boeken in de boekhandel.
- Sales: voor records van boeken die zijn verkocht.

Tabel Inventory

Tabel Sales
Nu willen we uitvinden welke boeken nog nooit zijn verkocht.
SELECT Title, Author
FROM Inventory
WHERE BookID NOT IN (
SELECT BookID
FROM Sales
);

Vervolgens willen we boeken in onze voorraad identificeren die in de afgelopen maand niet zijn verkocht, ervan uitgaande dat het vandaag 7 februari 2024 is. Dit houdt in dat we de SaleDate in de Sales-tabel vergelijken met onze huidige datum.
SELECT Title, Author
FROM Inventory
WHERE BookID NOT IN (
SELECT BookID
FROM Sales
WHERE SaleDate >= date('now', '-1 month')
);

Conclusie
De NOT IN-operator is een veelzijdig hulpmiddel in SQL om specifieke waarden uit je queryresultaten uit te sluiten. Door de syntaxis, praktische toepassingen en mogelijke valkuilen te begrijpen, kun je deze operator effectief gebruiken bij je datamanipulatietaken.
Denk aan NULL-waarden en de grootte van je dataset om de prestaties en nauwkeurigheid van je queries te optimaliseren. Naarmate je vertrouwder raakt met NOT IN, zal het een onmisbaar onderdeel van je SQL-gereedschapskist worden, waarmee je preciezere en efficiëntere data-analyse en -beheer mogelijk maakt.
Je kunt meer leren over NOT IN en NOT EXISTS in onze cursus Improving Query Performance in SQL Server en SQL-operators en veel meer verkennen in onze SQL Basics Cheat Sheet en de SQL Fundamentals skill track.
Als gecertificeerd data scientist haal ik met passie het maximale uit de nieuwste technologie om innovatieve machinelearning-toepassingen te bouwen. Met een sterke achtergrond in spraakherkenning, data-analyse en -rapportage, MLOps, conversationele AI en NLP heb ik mijn vaardigheden aangescherpt in het ontwikkelen van intelligente systemen die echt impact maken. Naast mijn technische expertise ben ik ook een sterke communicator met een talent om complexe concepten terug te brengen tot heldere, beknopte taal. Daardoor ben ik uitgegroeid tot een veelgelezen blogger over data science, waar ik mijn inzichten en ervaringen deel met een groeiende community van data-professionals. Op dit moment richt ik me op contentcreatie en redactie, waarbij ik met large language models werk aan krachtige en aansprekende content die zowel bedrijven als individuen helpt het beste uit hun data te halen.


In de wereld van data-analyse en -beheer is SQL (Structured Query Language) een essentieel hulpmiddel voor het benaderen en manipuleren van databasesystemen. Onder de vele functies is de
NOT IN-operator een krachtig middel om datasets te filteren, waarmee je rijen kunt uitsluiten die overeenkomen met een opgegeven lijst met waarden. Deze tutorial is bedoeld om deNOT IN-operator te ontrafelen voor beginners en dataprofessionals, zodat de toepassing helder is en de mogelijke valkuilen duidelijk worden.