Last chance! 50% off DataCamp Premium
Sale ends in
Of je nu een werkzoekende bent die een nieuwe kans zoekt om je SQL-vaardigheden toe te passen of een hiring manager die een kandidaat gaat bevragen voor een openstaande functie in het bedrijf, het kennen van veelvoorkomende SQL-sollicitatievragen en -antwoorden is een must.
In dit artikel vind je 99 SQL-sollicitatievragen en -antwoorden voor 2026, met kernonderwerpen in SQL die je helpen om je effectief voor te bereiden, bij te leren en gericht te werven, waaronder:
Wil je je kennis en vaardigheden verder uitbouwen? Verken dan onze uitgebreide cursussen in data engineering, cloudtechnologieën en AWS.
SQL-interviews lijken vaak op de manier waarop mensen de taal daadwerkelijk leren.
In het begin gaat het om vocabulaire en grammatica, zoals weten wat een join is, hoe SELECT werkt, en het verschil tussen DDL en DML.
Naarmate je vertrouwder raakt, verschuift de focus van "kun je een query schrijven" naar "kun je de juiste query schrijven." Je leert begrijpen wanneer een index helpt, waarom normalisatie ertoe doet, en hoe subtiel verschillende commando’s zoals DELETE en TRUNCATE zich onder de motorkap gedragen.
Op senior niveau wordt de syntax verondersteld bekend te zijn en draait de echte test om probleemoplossing: omgaan met duplicaten, NULLs, ties en rankinglogica met windowfuncties en CTE’s, en redeneren over transacties, gelijktijdigheid en performance.
Functies in SQL. Je moet aggregate en scalar functies kennen, evenals ingebouwde en door de gebruiker gedefinieerde functies.
Geavanceerde commando’s. Vragen kunnen onderwerpen behandelen zoals joins, primary en foreign keys, indexen en SQL-relaties.
Databaseontwerp. Verwacht vragen over normalisatie, denormalisatie en de verschillen tussen diverse SQL-statements zoals DELETE, TRUNCATE en DROP.
Geavanceerde queries. Je kunt vragen krijgen over subqueries, zowel geneste als gecorreleerde, en hoe je specifieke taken uitvoert zoals het vinden van de n-de hoogste waarde in een kolom.
Voor ze je technische vragen stellen, kan je interviewer eerst wat algemene vragen stellen over je totale ervaring met SQL.\
Maak je geen zorgen als je ervaring met SQL beperkt is: dit weet je interviewer waarschijnlijk al uit je cv. Aangezien ze toch met je willen praten, is je profiel als goede match voor hun bedrijf beoordeeld. Bovendien is het helemaal prima als je slechts met één SQL-dialect hebt gewerkt. Onthoud dat alle SQL-dialecten behoorlijk op elkaar lijken. Vertrouwd zijn met één dialect is daarom een solide basis om andere dialecten te leren.
Het staat voor Structured Query Language en is een programmeertaal die wordt gebruikt om te communiceren met relationele databasebeheersystemen (RDBMS). Dit omvat het ophalen, bijwerken, invoegen en verwijderen van data uit tabellen.
De verschillende versies van SQL, zowel gratis als betaald, worden ook wel SQL-dialecten genoemd. Alle dialecten van SQL hebben een zeer vergelijkbare syntax en verschillen slechts beperkt in aanvullende functionaliteit. Enkele voorbeelden zijn Microsoft SQL Server, PostgreSQL, MySQL, SQLite, T-SQL en Oracle.
Met SQL kunnen we:
Je interviewer kan het gesprek op gang brengen met de makkelijkere vragen:
Ook bekend als een SQL-commando. Het is een tekenreeks die door de SQL-engine wordt geïnterpreteerd als een geldig commando en dienovereenkomstig wordt uitgevoerd. Enkele voorbeelden van SQL-statements zijn SELECT, CREATE, DELETE, DROP, REVOKE, enzovoort.
Een query is een stukje code in SQL om data uit een database te benaderen of te wijzigen.
Er zijn twee soorten SQL-queries: queries voor data-opvraging en datamanipulatie. De eerste categorie wordt gebruikt om de benodigde data op te halen (waaronder ook het beperken, groeperen, sorteren van data, data uit meerdere tabellen halen, enz.), terwijl de tweede wordt gebruikt om data te maken, toe te voegen, verwijderen, bijwerken en hernoemen.
Ook wel een inner query genoemd: een query die in een andere (outer) query is geplaatst. Een subquery kan voorkomen in clausules zoals SELECT, FROM, WHERE, UPDATE, enz. Het is ook mogelijk om een subquery binnen een andere subquery te hebben. De binnenste subquery wordt eerst uitgevoerd en het resultaat wordt doorgegeven aan de omvattende query (of subquery).
Een clausule die wordt gebruikt om records uit twee of meer tabellen te combineren en op te halen. SQL-tabellen kunnen worden gejoined op basis van de relatie tussen de kolommen van die tabellen. Bekijk onze SQL joins-tutorial voor meer context, plus onze gids met SQL-join-sollicitatievragen.
Een voor mensen leesbare toelichting op wat een bepaald stuk code doet. SQL-codecommentaar kan uit één regel bestaan (voorafgegaan door twee streepjes --) of meerdere regels beslaan (als volgt: /*comment_text*/). Wanneer de SQL-engine draait, worden codecommentaren genegeerd. Het doel van SQL-commentaar is om de code begrijpelijker te maken voor mensen die deze later lezen.
Een tijdelijke naam die aan een tabel (of kolom in een tabel) wordt gegeven tijdens het uitvoeren van een bepaalde SQL-query. Aliassen worden gebruikt om de leesbaarheid te verbeteren en de code compacter te maken. Een alias wordt geïntroduceerd met het sleutelwoord AS:
SELECT col_1 AS column
FROM table_name;
Laten we nu doorgaan met de technische SQL-sollicitatievragen en mogelijke antwoorden daarop.
Bij technische vragen is het het beste om zo precies mogelijk te antwoorden. Te vage antwoorden kunnen overkomen als een poging om af te dwalen van het onderwerp en mogelijk extra vragen oproepen waar je je minder zeker over voelt.
Al met al kun je met SQL een database op meerdere manieren bevragen. Bovendien integreert SQL eenvoudig met andere programmeertalen, zoals Python of R, zodat we hun gecombineerde kracht kunnen benutten.
DDL: CREATE, ALTER TABLE, DROP, TRUNCATE en ADD COLUMN
DML: UPDATE, DELETE en INSERT
DCL: GRANT en REVOKE
TCL: COMMIT, SET TRANSACTION, ROLLBACK en SAVEPOINT
DQL: – SELECT
Dit staat voor Database Management System, een softwarepakket dat wordt gebruikt om verschillende bewerkingen uit te voeren op de data die in een database is opgeslagen, zoals benaderen, bijwerken, opschonen, invoegen en verwijderen van data. Er zijn verschillende typen DBMS, zoals relationeel, hiërarchisch, netwerk-, grafen- of objectgeoriënteerd. Deze typen zijn gebaseerd op de manier waarop data in het systeem wordt georganiseerd, gestructureerd en opgeslagen.
Dit staat voor Relational Database Management System. Het is het meest gebruikte type DBMS voor het werken met data die in meerdere tabellen is opgeslagen en via gedeelde keys aan elkaar is gerelateerd. De programmeertaal SQL is ontworpen om met RDBMS te communiceren. Voorbeelden van RDBMS zijn MySQL, PostgreSQL, Oracle, MariaDB, enz.
Een tabel is een geordende set gerelateerde data die in tabelvorm is opgeslagen, d.w.z. in rijen en kolommen. Een veld is een andere benaming voor een kolom van een tabel.
Een set voorwaarden die het type data definiëren dat in elke kolom van een tabel kan worden ingevoerd. Constraints zorgen voor dataintegriteit in een tabel en blokkeren ongewenste acties.
DEFAULT – levert een standaardwaarde voor een kolom.
UNIQUE – staat alleen unieke waarden toe.
NOT NULL – staat alleen niet-NULL-waarden toe.
PRIMARY KEY – staat alleen unieke en strikt niet-NULL-waarden toe (NOT NULL en UNIQUE).
FOREIGN KEY – zorgt voor gedeelde keys tussen twee of meer tabellen.
(INNER) JOIN – retourneert alleen die records die voldoen aan een gedefinieerde joinvoorwaarde in beide (of alle) tabellen. Dit is de standaard SQL-join.
LEFT (OUTER) JOIN – retourneert alle records uit de linkertabel en die records uit de rechtertabel die voldoen aan een gedefinieerde joinvoorwaarde.
RIGHT (OUTER) JOIN – retourneert alle records uit de rechtertabel en die records uit de linkertabel die voldoen aan een gedefinieerde joinvoorwaarde.
FULL (OUTER) JOIN – retourneert alle records uit beide (of alle) tabellen. Dit kun je zien als een combinatie van left en right joins.
Let op: FULL OUTER JOIN wordt ondersteund door PostgreSQL, SQL Server, Oracle en MySQL 8.0 en hoger, maar MySQL staat dit alleen toe via UNION-patronen; ondertussen ondersteunt SQLite geen RIGHT JOIN, wat kan worden nagebootst met LEFT JOIN in combinatie met UNION.
Een kolom (of meerdere kolommen) van een tabel waarop de PRIMARY KEY-constraint is toegepast om unieke en niet-NULL-waarden in die kolom te garanderen. Met andere woorden, een primary key is een combinatie van de NOT NULL- en UNIQUE-constraints. De primary key identificeert elke record in de tabel uniek.
Gerelateerd concept — Surrogaatkey: Een surrogaatkey is een kunstmatig gegenereerde identifier (meestal een sequentieel geheel getal of UUID) die aan elke record wordt toegekend, onafhankelijk van de daadwerkelijke datavelden. In tegenstelling tot natuurlijke keys (bijv. een e-mailadres) blijven surrogaatkeys stabiel wanneer bedrijfsdata verandert, waardoor ze in productiedatabases vaak als primary key worden gebruikt.
Elke tabel kan hoogstens één PRIMARY KEY definiëren (die samengesteld kan zijn). Een PRIMARY KEY wordt sterk aanbevolen maar is niet door alle engines strikt vereist.
Een kolom (of meerdere kolommen) van een tabel waarop de UNIQUE-constraint is toegepast om unieke waarden in die kolom te garanderen, inclusief een mogelijke NULL-waarde (hoogstens één).
Let op:
NULL toegestaan, tenzij je een gefilterde index gebruikt.NULL's toegestaan omdat NULL <> NULL.Een kolom (of meerdere kolommen) van een tabel waarop de FOREIGN KEY- (of UNIQUE-key-) constraint is toegepast om deze kolom te koppelen aan de primary key in een andere tabel (of meerdere tabellen). Het doel van foreign keys is om verschillende tabellen in een database met elkaar verbonden te houden.
Een speciale datastructuur die is gekoppeld aan een databasetabel en wordt gebruikt om belangrijke delen ervan op te slaan en snellere zoek- en ophaalacties mogelijk te maken. Indexen zijn vooral efficiënt voor grote databases, waar ze de queryprestaties aanzienlijk verbeteren.
Een verzameling van structurele elementen van een database, zoals tabellen, stored procedures, indexen, functies en triggers. Het toont de algehele databasearchitectuur, specificeert de relaties tussen verschillende objecten in een database en definieert verschillende toegangsrechten ervoor. Lees onze gids over databaseschema’s voor meer diepgang.
Een gereserveerd teken, een tekencombinatie of een sleutelwoord dat in SQL-queries wordt gebruikt om een specifieke bewerking uit te voeren. SQL-operatoren worden vaak gebruikt met de WHERE-clausule om een voorwaarde(n) te stellen voor het filteren van data.
Aritmetisch (+, -, *, /, enz.)
Vergelijking (>, <, =, >=, enz.)
Samengesteld (+=, -=, *=, /=, enz.)
Logisch (AND, OR, NOT, BETWEEN, enz.)
String (%, _, +, ^, enz.)
Set (UNION, UNION ALL, INTERSECT en MINUS (of EXCEPT))
Een voorwaarde die aan een SQL-query wordt opgelegd om de data te filteren en zo het gewenste resultaat te verkrijgen. Enkele voorbeelden zijn WHERE, LIMIT, HAVING, LIKE, AND, OR, ORDER BY, enz.
De meest voorkomende zijn FROM, GROUP BY, JOIN, WHERE, ORDER BY, LIMIT en HAVING.
Met hetCREATE TABLE-statement. Om bijvoorbeeld een tabel met drie kolommen van vooraf gedefinieerde datatypes te maken, gebruiken we de volgende syntax:
CREATE TABLE table_name (col_1 datatype,
col_2 datatype,
col_3 datatype);
Met het UPDATE-statement. De syntax is:
UPDATE table_name
SET col_1 = value_1, col_2 = value_2
WHERE condition;
Met het DROP TABLE-statement. De syntax is: DROP TABLE table_name;.
Met de COUNT()-aggregatiefunctie met een asterisk als argument: SELECT COUNT(*) FROM table_name;.
Met het ORDER BY-statement:
SELECT * FROM table_name
ORDER BY col_1;
We kunnen aangeven dat we een aflopende sortering nodig hebben met het sleutelwoord DESC; anders is de sortering standaard oplopend. Ook kunnen we op meer dan één kolom sorteren en per kolom afzonderlijk oplopend of aflopend specificeren. Bijvoorbeeld:
SELECT * FROM table_name
ORDER BY col_1 DESC, col_3, col_6 DESC;
Met de asterisk * bij het SELECT-statement. De syntax is: SELECT * FROM table_name;.
Met het INTERSECT-statement:
SELECT col1, col2 FROM table_1
INTERSECT
SELECT col1, col2 FROM table_2;
Let op: INTERSECT vereist hetzelfde aantal kolommen en compatibele types.
Dit statement wordt gebruikt met SELECT om duplicaten te filteren en alleen unieke waarden uit een kolom van een tabel te retourneren. De syntax is:
SELECT DISTINCT col_1
FROM table_name;
Relaties zijn de verbindingen en correlaties tussen entiteiten; ze geven in feite aan hoe twee of meer tabellen in een database met elkaar zijn verbonden. Zo kan een ID van dezelfde klant zowel in een tabel met verkoopdata als in een klantentabel voorkomen.
Een NULL-waarde geeft de afwezigheid van data aan voor een bepaalde cel van een tabel. Nul daarentegen is een geldige numerieke waarde en een lege string is een legale string van lengte nul.
SQL-databases zijn relationeel, gestructureerd en gebruiken tabellen met vooraf gedefinieerde schema’s, terwijl NoSQL-databases niet-relationeel, schemaloos zijn en ontworpen om ongestructureerde of semi-gestructureerde data te verwerken.
Uitdagingen zijn onder meer het tunen van performance voor grote datasets, het beheren van indexeringsstrategieën, het waarborgen van dataintegriteit met constraints, omgaan met gelijktijdige transacties en het optimaliseren van query-uitvoering.
Een Common Table Expression (CTE) is een tijdelijke benoemde resultaatset waarnaar je kunt verwijzen binnen een SELECT-, INSERT-, UPDATE- of DELETE-statement. CTE’s verbeteren de leesbaarheid van queries en stellen je in staat complexe queries op te splitsen in eenvoudigere, herbruikbare delen. De syntax gebruikt het sleutelwoord WITH:
WITH sales_summary AS (
SELECT product_id, SUM(amount) AS total_sales
FROM sales
GROUP BY product_id
)
SELECT p.product_name, s.total_sales
FROM products p
JOIN sales_summary s ON p.id = s.product_id
WHERE s.total_sales > 10000;
CTE’s zijn bijzonder handig voor recursieve queries (hiërarchische data zoals organogrammen) en wanneer je meerdere keren naar dezelfde subquery moet verwijzen.
Windowfuncties voeren berekeningen uit over een set rijen die gerelateerd zijn aan de huidige rij, zonder het resultaat samen te vouwen tot één enkele uitvoerrij zoals aggregatiefuncties doen. Ze gebruiken de OVER()-clausule om het venster van rijen te definiëren.
Belangrijke windowfuncties zijn:
ROW_NUMBER() – kent een unieke opeenvolgende nummering toe aan elke rijRANK() – kent een rang toe met gaten bij gelijke waardenDENSE_RANK() – kent een rang toe zonder gaten bij gelijke waardenLAG() / LEAD() – toegang tot data uit vorige/volgende rijenSUM() OVER(), AVG() OVER() – lopende of cumulatieve berekeningenVoorbeeld: Running total van sales berekenen
SELECT
order_date,
amount,
SUM(amount) OVER (ORDER BY order_date) AS running_total
FROM orders;
Alle drie zijn ranking-windowfuncties, maar ze gaan anders om met gelijke waarden:
ROW_NUMBER() – kent altijd unieke opeenvolgende nummers toe (1, 2, 3, 4...), ook bij gelijke waardenRANK() – kent dezelfde rang toe bij gelijke waarden, en slaat dan nummers over (1, 2, 2, 4...)DENSE_RANK() – kent dezelfde rang toe bij gelijke waarden, zonder over te slaan (1, 2, 2, 3...)SELECT
name,
score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num,
RANK() OVER (ORDER BY score DESC) AS rank,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM students;
Gebruik DENSE_RANK() bij het zoeken naar de "n-de hoogste" waarde waarbij gelijke waarden dezelfde positie moeten delen.
In deze sectie bekijken we de meest populaire intermediate SQL-vragen en -antwoorden, zodat je weet wat je van je interviewer kunt verwachten.
Een databaseobject dat een set SQL-statements vertegenwoordigt die vaak voor een bepaalde taak worden gebruikt. Een functie neemt invoerparameters aan, voert berekeningen of andere bewerkingen daarop uit en retourneert het resultaat. Functies verbeteren de leesbaarheid van code en voorkomen herhaling van dezelfde codesnippets.
Anderzijds kunnen SQL-functies ingebouwd zijn (door het systeem gedefinieerd) of user-defined (door de gebruiker gemaakt voor specifieke behoeften).
AVG() – retourneert de gemiddelde waarde
SUM() – retourneert de som van waarden
MIN() – retourneert de minimumwaarde
MAX() – retourneert de maximumwaarde
COUNT() – retourneert het aantal rijen, inclusief die met NULL-waarden
LEN() (in andere SQL-dialecten – LENGTH()) – retourneert de lengte van een string, inclusief spaties
UCASE() (in andere SQL dialecten – UPPER()) – retourneert een string in hoofdletters
LCASE() (in andere SQL dialecten – LOWER()) – retourneert een string in kleine letters
INITCAP() – retourneert een string in titelcasus (d.w.z. elk woord van de string begint met een hoofdletter)
MID() (in andere SQL dialecten – SUBSTR()) – extraheert een substring uit een string
ROUND() – retourneert de numerieke waarde afgerond op een opgegeven aantal decimalen
NOW() – retourneert de huidige datum en tijd
Case-manipulatiefuncties vormen een subset van tekstfuncties en worden gebruikt om de lettercase van tekstdata te wijzigen. Met deze functies kunnen we data omzetten naar hoofdletters, kleine letters of titelcasus.
UCASE() (in andere SQL dialecten – UPPER()) – retourneert een string in hoofdletters
LCASE() (in andere SQL dialecten – LOWER()) – retourneert een string in kleine letters
INITCAP() – retourneert een string in titelcasus (d.w.z. elk woord van de string begint met een hoofdletter)
Tekstringmanipulatiefuncties vormen een subset van tekstfuncties en worden gebruikt om tekstdata te wijzigen.
CONCAT() – voegt twee of meer stringwaarden samen door de tweede string achter de eerste te plaatsen
SUBSTRING()/SUBSTR() – retourneert een deel van een string op basis van opgegeven begin- en eindpunten
LENGTH() (in andere SQL dialecten – LEN()) – retourneert de lengte van een string, inclusief spaties
REPLACE() – vervangt alle voorkomens van een gedefinieerde substring in een gegeven string door een andere substring
INSTR() – retourneert de numerieke positie van een gedefinieerde substring in een gegeven string
LPAD() en RPAD() – leveren padding van het linker-/rechterteken voor rechts-/linksuitgelijnde waarden
TRIM() – verwijdert alle gedefinieerde tekens, evenals witruimtes, van de linker-, rechter- of beide uiteinden van een gegeven string
Lokale variabelen zijn alleen toegankelijk binnen de functie waarin ze zijn gedeclareerd. Globale variabelen daarentegen, gedeclareerd buiten elke functie, worden opgeslagen in vaste geheugenstructuren en kunnen in het hele programma worden gebruikt.
SQL is een standaardtaal voor het bevragen en beheren van relationele databases, vooral gebruikt voor datamanipulatie en -opvraging. PL/SQL (Procedural Language/SQL) is een uitbreiding van SQL die wordt gebruikt in Oracle-databases en procedurele programmeerconstructies bevat zoals lussen, voorwaarden en foutafhandeling, waardoor complexe bedrijfslogica binnen de database kan worden geïmplementeerd. We hebben een ander artikel over de Top 20 PL/SQL Interview Questions and Answers, wat een goede review is als je weet dat je naar je Oracle-kennis gevraagd wordt.
Er is geen verschil tussen LEFT JOIN en LEFT OUTER JOIN. Ze zijn uitwisselbaar. In SQL is het sleutelwoord OUTER optioneel, dus LEFT JOIN is simpelweg een afkorting voor LEFT OUTER JOIN. Beide retourneren alle records uit de linkertabel en de overeenkomende records uit de rechtertabel.
Indexering creëert een speciale datastructuur die het ophalen van data versnelt doordat de database rijen efficiënter kan vinden. Het werkt als een geoptimaliseerde opzoektabel, waardoor volledige tabelscans minder vaak nodig zijn. Te veel indexen kunnen echter insert-, update- en delete-bewerkingen vertragen doordat indexen moeten worden bijgehouden.
Een stored procedure is een voorgecompileerde set SQL-statements die als een eenheid wordt uitgevoerd om een taak uit te voeren. Procedures kunnen data of schema-objecten wijzigen, transacties beheren en nul of meer resultaatsets retourneren. Functies daarentegen worden doorgaans gebruikt in SQL-expressies, moeten een waarde retourneren (scalair of tabelvormig) en zijn in veel databases beperkt in bijwerkingen. Exact gedrag verschilt per DB (bijv. T-SQL heeft scalair- en tabelvormige functies; PostgreSQL maakt onderscheid tussen functies en procedures).
Standaard is oplopend (NULLS FIRST/LAST verschilt per DB). Gebruik per kolom de sleutelwoorden ASC/DESC als volgt:
SELECT * FROM table_name
ORDER BY col_1 DESC;
UNION – retourneert de records verkregen door ten minste één van twee queries (exclusief duplicaten)
UNION ALL – retourneert de records verkregen door ten minste één van twee queries (inclusief duplicaten)
INTERSECT – retourneert de records die door beide queries zijn verkregen
EXCEPT (in MySQL en Oracle MINUS genoemd) – retourneert alleen de records die door de eerste query zijn verkregen maar niet door de tweede
De LIKE-operator in combinatie met de wildcards % en _. De %-wildcard staat voor elk aantal tekens, inclusief nul, terwijl _ – strikt één teken vertegenwoordigt.
Hoewel beide soorten keys unieke waarden in een kolom van een tabel garanderen, identificeert de eerste elke record van de tabel uniek, en de tweede voorkomt duplicaten in die kolom.
De primary key van een tabel, gebaseerd op meerdere kolommen.
SELECT – FROM – JOIN – ON – WHERE – GROUP BY – HAVING – ORDER BY – LIMIT
Dit is de SQL-uitvoervolgorde:
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT/OFFSET (FETCH)
Een virtuele tabel met een subset van data die uit één of meer databasetabellen (of andere views) wordt opgehaald. Standaard views slaan geen data op; gematerialiseerde views wel. Views kunnen queries vereenvoudigen, logica inkapselen en, gecombineerd met privileges, kolommen/rijen beperken. Ze kunnen data uit meerdere tabellen joinen/aggregeren.
Ja. Dit staat ook bekend als geneste views. We moeten echter voorkomen dat we meerdere views nesten, omdat de code dan moeilijk te lezen en te debuggen wordt.
Nee. Alle views die op die tabel zijn gebaseerd, worden ongeldig nadat de basistabel is verwijderd. Als we zo’n view toch proberen te gebruiken, krijgen we een foutmelding.
In sommige SQL-dialecten, zoals PostgreSQL, bestaat het BOOLEAN-datatype expliciet en neemt het de waarden TRUE, FALSE of NULL aan. In andere dialecten, zoals Microsoft SQL Server, wordt het BIT-datatype gebruikt om Booleaanse waarden als gehele getallen op te slaan: 1 (true) of 0 (false).
Normalisatie is een proces in databaseontwerp waarbij data wordt georganiseerd en herstructureren om redundantie, afhankelijkheid, duplicatie en inconsistentie te verminderen. Dit leidt tot verbeterde dataintegriteit, meer tabellen binnen de database, efficiëntere data-toegang en beveiligingscontrole, en grotere queryflexibiliteit.
Denormalisatie is het tegenovergestelde proces van normalisatie: het introduceert dataredundantie en combineert data uit meerdere tabellen. Denormalisatie optimaliseert de performance van de database-infrastructuur in situaties waarin leesbewerkingen belangrijker zijn dan schrijfbewerkingen, omdat het complexe joins helpt vermijden en de uitvoeringstijd van queries verkort.
Een kolom hernoemen betekent de daadwerkelijke naam permanent wijzigen in de oorspronkelijke tabel. Een alias toekennen aan een kolom betekent deze een tijdelijke naam geven tijdens het uitvoeren van een SQL-query, met als doel de code leesbaarder en compacter te maken.
Een gecorreleerde subquery is een inner query genest in een grotere (outer) query die voor de uitvoering verwijst naar waarden uit de outer query; met andere woorden, een gecorreleerde subquery is afhankelijk van de outer query. Een niet-gecorreleerde subquery daarentegen is niet afhankelijk van data uit de outer query en kan onafhankelijk worden uitgevoerd.
Een clustered index bepaalt de fysieke volgorde van records in een tabel en zoekt data op basis van keywaarden, terwijl een non-clustered index de volgorde van records bewaart die niet overeenkomt met de fysieke volgorde van de daadwerkelijke data op de schijf. Een tabel kan slechts één clustered index hebben maar meerdere non-clustered indexen.
De manier om if-then-else-logica in SQL te implementeren. Deze functie controleert sequentieel de opgegeven voorwaarden in de WHEN-clausules en retourneert de waarde uit de overeenkomstige THEN-clausule wanneer de eerste voorwaarde is voldaan. Als geen van de voorwaarden is voldaan, retourneert de functie de waarde uit de ELSE-clausule als die is opgegeven; anders retourneert hij NULL. De syntax is:
CASE
WHEN condition_1 THEN value_1
WHEN condition_2 THEN value_2
WHEN condition_3 THEN value_3
...
ELSE value
END;
DELETE is een DML-commando (Data Manipulation Language) dat wordt gebruikt om één of meer rijen uit een tabel te verwijderen op basis van een voorwaarde in de WHERE-clausule. Het is omkeerbaar alleen als het is ingekapseld in een transactie (via ROLLBACK).
TRUNCATE is een DDL-commando (Data Definition Language) dat alle rijen uit een tabel verwijdert door pagina’s vrij te geven. Het is sneller maar in het algemeen onomkeerbaar, en kan niet worden gebruikt op tabellen waarnaar een foreign key verwijst.
DROP verwijdert een tabel volledig uit de database, inclusief de tabelstructuur en alle bijbehorende constraints, relaties met andere tabellen en toegangsrechten. TRUNCATE verwijdert alle rijen uit een tabel zonder de tabelstructuur en constraints te beïnvloeden. Beide zijn DDL. DROP verwijdert de tabel en de metadata; TRUNCATE verwijdert alle rijen maar behoudt de tabeldefinitie. Performance en transactioneel gedrag hangen af van de DB-engine.
De eerste werkt op geaggregeerde data nadat deze gegroepeerd zijn, terwijl de tweede elke rij individueel controleert. Als beide statements in een query voorkomen, staan ze in de volgende volgorde:WHERE – GROUP BY – HAVING. De SQL-engine interpreteert ze ook in die volgorde.
Met het INSERT INTO -statement in combinatie met VALUES. De syntax is:
INSERT INTO table_name
VALUES (value_1, value_2, ...);
Met het DELETE-statement. De syntax is:
DELETE FROM table_name
WHERE condition;
Zo kunnen we ook meerdere records verwijderen als ze aan de opgegeven voorwaarde voldoen.
Met het ALTER TABLE-statement in combinatie met ADD. De syntax is:
ALTER TABLE table_name
ADD column_name datatype;
Met het ALTER TABLE-statement in combinatie met RENAME COLUMN ... TO ... De syntax is:
ALTER TABLE table_name
RENAME COLUMN old_column_name TO new_column_name;
Met het ALTER TABLE-statement in combinatie met DROP COLUMN. De syntax is:
ALTER TABLE table_name
DROP COLUMN column_name;
Door de rest bij deling door 2 te controleren. In sommige SQL-versies (bijv. PostgreSQL en MySQL) gebruiken we de MOD-functie; in andere (Microsoft SQL Server en SQLite) – de modulo-operator (%). Om alle even records te selecteren met MOD:
SELECT * FROM table_name
WHERE MOD(ID_column, 2) = 0;
Om alle even records te selecteren met %:
SELECT * FROM table_name
WHERE ID_column % 2 = 0;
Om alle oneven records te selecteren is de syntax in beide gevallen identiek, behalve dat we de ongelijk-operator <> gebruiken in plaats van =.
Met het DISTINCT-statement in combinatie met SELECT of door een unique key voor die tabel te maken.
Met het INSERT INTO-statement in combinatie met VALUES. De syntax is:
INSERT INTO table_name
VALUES (value_1, value_2, ...),
(value_3, value_4, ...),
(value_5, value_6, ...),
...;
Gebruik windowfuncties om correct met gelijke waarden om te gaan:
SELECT column_name
FROM (
SELECT column_name, DENSE_RANK() OVER (ORDER BY column_name DESC) AS rnk
FROM table_name
) t
WHERE rnk = :n;
Voor de n-de rij op volgorde (zonder rekening te houden met ties): ORDER BY column_name DESC OFFSET n-1 ROWS FETCH NEXT 1 ROW ONLY.
Met de LIKE-operator in combinatie met de wildcards % en _. Stel dat we alle achternamen in een tabel willen vinden die beginnen met "A". De query is:
SELECT * FROM table_name
WHERE surname LIKE 'A_';
Hier gaan we ervan uit dat een achternaam minstens twee letters moet bevatten. Zonder deze aanname (dus dat een achternaam ook alleen A kan zijn) is de query als volgt:
SELECT * FROM table_name
WHERE surname LIKE 'A%';
De eenvoudigste methode is de aggregatiefunctie MAX() te gebruiken.
SELECT MAX(id) AS highest_id
FROM table_name;
Met ORDER BY en LIMIT of TOP
SELECT id
FROM table_name
ORDER BY id DESC
LIMIT 1;
Met de RAND()-functie in combinatie met ORDER BY en LIMIT. In sommige SQL-dialecten, zoals PostgreSQL, heet dit RANDOM(). Bijvoorbeeld, de volgende code retourneert vijf willekeurige rijen uit een tabel in MySQL:
SELECT * FROM table_name
ORDER BY RAND()
LIMIT 5;
Scenariogebaseerde vragen testen je vermogen om echte zakelijke problemen met SQL op te lossen. Interviewers gebruiken deze om niet alleen je syntaxiskennis te beoordelen, maar ook je probleemaanpak en je vaardigheid om randgevallen zoals duplicaten, NULL-waarden en ties af te handelen.
Duplicaten vinden:
SELECT email, COUNT(*) AS duplicate_count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
Duplicaten verwijderen (één record behouden):
WITH duplicates AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users
WHERE id IN (SELECT id FROM duplicates WHERE rn > 1);
Deze aanpak gebruikt een CTE met ROW_NUMBER() om duplicaten te identificeren en behoudt het record met de laagste ID.
Gebruik de SUM()-windowfunctie met een ORDER BY-clausule:
SELECT
transaction_date,
amount,
SUM(amount) OVER (ORDER BY transaction_date) AS running_total
FROM transactions;
Voor een running total per categorie (bijv. per klant):
SELECT
customer_id,
transaction_date,
amount,
SUM(amount) OVER (
PARTITION BY customer_id
ORDER BY transaction_date
) AS customer_running_total
FROM transactions;
Dit is een klassiek scenario voor een gecorreleerde subquery:
SELECT e.name, e.department, e.salary
FROM employees e
WHERE e.salary > (
SELECT AVG(salary)
FROM employees
WHERE department = e.department
);
Alternatief met een windowfunctie:
SELECT name, department, salary
FROM (
SELECT
name,
department,
salary,
AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees
) t
WHERE salary > dept_avg;
Gebruik LEAD() om elke waarde met de volgende te vergelijken:
SELECT
invoice_number,
LEAD(invoice_number) OVER (ORDER BY invoice_number) AS next_invoice,
LEAD(invoice_number) OVER (ORDER BY invoice_number) - invoice_number - 1 AS gap_size
FROM invoices
WHERE LEAD(invoice_number) OVER (ORDER BY invoice_number) - invoice_number > 1;
Dit identificeert waar de kloof tussen opeenvolgende factuurnummers groter is dan 1.
Gebruik LAG() om te vergelijken met de vorige rij:
WITH monthly_purchases AS (
SELECT
customer_id,
DATE_TRUNC('month', purchase_date) AS purchase_month,
LAG(DATE_TRUNC('month', purchase_date)) OVER (
PARTITION BY customer_id
ORDER BY DATE_TRUNC('month', purchase_date)
) AS prev_month
FROM purchases
GROUP BY customer_id, DATE_TRUNC('month', purchase_date)
)
SELECT DISTINCT customer_id
FROM monthly_purchases
WHERE purchase_month = prev_month + INTERVAL '1 month';
Gebruik conditionele aggregatie met CASE-statements:
SELECT
product_name,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 1 THEN amount ELSE 0 END) AS jan_sales,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 2 THEN amount ELSE 0 END) AS feb_sales,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 3 THEN amount ELSE 0 END) AS mar_sales
FROM sales
GROUP BY product_name;
Sommige databases (SQL Server, Oracle) hebben hiervoor native PIVOT-syntax.
Gebruik DENSE_RANK() met PARTITION BY:
WITH ranked_products AS (
SELECT
category,
product_name,
SUM(sales_amount) AS total_sales,
DENSE_RANK() OVER (
PARTITION BY category
ORDER BY SUM(sales_amount) DESC
) AS sales_rank
FROM sales
GROUP BY category, product_name
)
SELECT category, product_name, total_sales
FROM ranked_products
WHERE sales_rank <= 3
ORDER BY category, sales_rank;
ACID is een acroniem voor de vier kerneigenschappen die betrouwbare database-transacties garanderen:
Voorbeeldtransactie:
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
Een deadlock treedt op wanneer twee of meer transacties op elkaar wachten om locks vrij te geven, waardoor een cirkelafhankelijkheid ontstaat waarbij geen van beide kan doorgaan.
Voorbeeldscenario: Transactie A vergrendelt Tabel X en wacht op Tabel Y, terwijl Transactie B Tabel Y vergrendelt en wacht op Tabel X.
Preventiestrategieën:
Belangrijke optimalisatiestrategieën:
Voeg passende indexen toe: Maak indexen op kolommen die in WHERE-, JOIN- en ORDER BY-clausules worden gebruikt
Analyseer uitvoeringsplannen: Gebruik EXPLAIN (PostgreSQL/MySQL) of EXPLAIN PLAN (Oracle) om knelpunten te identificeren
Vermijd SELECT *: Haal alleen de kolommen op die je nodig hebt
Gebruik JOINs in plaats van subqueries: JOIN’s zijn vaak efficiënter dan gecorreleerde subqueries
Beperk resultaatsets: Gebruik LIMIT/TOP wanneer je niet alle rijen nodig hebt
Vermijd functies op geïndexeerde kolommen: WHERE YEAR(date_col) = 2026 kan geen index gebruiken; gebruik in plaats daarvan WHERE date_col >= '2026-01-01'
Overweeg partitionering: Voor zeer grote tabellen, partitioneer op datum of categorie
NULL staat voor ontbrekende of onbekende data en vereist speciale behandeling:
Vergelijkingen: Gebruik IS NULL of IS NOT NULL in plaats van = NULL
COALESCE(): Retourneert de eerste niet-NULL-waarde: COALESCE(column, 'default')
NULLIF(): Retourneert NULL als twee waarden gelijk zijn: NULLIF(a, b)
ISNULL() / NVL(): Databasespecifieke functies om NULL-waarden te vervangen
SELECT
name,
COALESCE(phone, email, 'No contact') AS contact_info,
CASE WHEN status IS NULL THEN 'Unknown' ELSE status END AS status
FROM customers;
Dit is een geavanceerd "eilanden en gaten"-probleem:
WITH login_groups AS (
SELECT
user_id,
login_date,
login_date - ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY login_date
) * INTERVAL '1 day' AS group_id
FROM user_logins
)
SELECT
user_id,
MIN(login_date) AS streak_start,
MAX(login_date) AS streak_end,
COUNT(*) AS streak_length
FROM login_groups
GROUP BY user_id, group_id
ORDER BY streak_length DESC
LIMIT 1;
De truc is om van elke datum een rijnummer af te trekken – opeenvolgende datums leveren dezelfde "group_id" op.
Hoewel voorbereiding op SQL-interviews cruciaal is voor werkzoekenden en hiring managers, is het net zo belangrijk voor bedrijven om te investeren in doorlopende SQL-training voor hun teams. Met data kunnen werken is belangrijker dan ooit, dus ervoor zorgen dat je medewerkers sterke SQL-vaardigheden hebben kan een gamechanger zijn voor het succes van je bedrijf.
Ben je teamleider of ondernemer en wil je dat je hele team vaardig is in SQL, dan biedt DataCamp for Business op maat gemaakte trainingsprogramma’s die je medewerkers kunnen helpen SQL-vaardigheden te beheersen, van de basis tot geavanceerde concepten. We kunnen bieden:
Investeren in SQL-upskilling via platforms zoals DataCamp vergroot niet alleen de capaciteiten van je team, maar geeft je bedrijf ook een strategisch voordeel, waardoor je concurrerend blijft en resultaten behaalt. Praat met iemand van ons team en vraag vandaag nog een demo aan.
Kort samengevat hebben we de 99 essentiële SQL-sollicitatievragen voor beginners, intermediate en scenariogebaseerde situaties en de juiste antwoorden daarop besproken. Hopelijk helpt deze informatie je om je voor te bereiden op het interview en je zekerder te voelen, of je nu zoekt naar een baan in SQL of kandidaten interviewt voor een intermediate SQL-functie.
Als je denkt dat je meer training nodig hebt om je beter voor te bereiden op een interview, bekijk dan onze volledige lijst met SQL-cursussen:
Om te beginnen met SQL, start je met de basis van databaseconcepten en relationele databasebeheersystemen. DataCamp heeft veel resources om je op weg te helpen, zoals de Introduction to SQL-cursus, de Data Analyst in SQL Career Track en de SQL-cheatsheet. Of bezoek de pagina met SQL-cursussen om alle resources te bekijken.
Op het DataCamp-platform zijn er veel SQL-projecten om je vaardigheden aan te scherpen, geschikt voor alle niveaus.
Beginners wordt vaak gevraagd om basis-SQL-concepten uit te leggen, zoals het verschil tussen SELECT- en INSERT-statements, het doel van keys in een database (primary keys en foreign keys), en eenvoudige queries om data uit één tabel op te halen met voorwaarden (de WHERE-clausule).
Intermediate practitioners kunnen vragen krijgen over complexere SQL-concepten zoals joins (INNER, LEFT, RIGHT, FULL), subqueries, aggregaties en het groeperen van data (GROUP BY), en het gebruik van setoperaties zoals UNION, INTERSECT en EXCEPT. Ook kunnen ze gevraagd worden om problemen op te lossen die draaien om het optimaliseren van queries voor performance.
De voorbereiding op een SQL-interview zou het volgende moeten omvatten:
In een technisch SQL-interview kun je vragen verwachten die je kennis van SQL-syntax, databaseontwerp, queryoptimalisatie en probleemoplossing met SQL testen. Om je vaardigheden te demonstreren:
Hoewel de kernsyntax van SQL consistent is over verschillende RDBMS, heeft elk systeem (zoals MySQL, PostgreSQL, SQL Server, Oracle) zijn eigen dialect met unieke features en functies. Het leren van een specifiek SQL-dialect is belangrijk als je mikt op rollen die een bepaald RDBMS gebruiken. Richt je op het dialect dat het meest relevant is voor je carrièredoelen of het meest voorkomt in jouw sector. Een sterke basis in standaard SQL maakt het echter makkelijker om je aan te passen aan verschillende dialecten wanneer dat nodig is.
Ja! Als je momenteel docent of student aan een universiteit bent, kun je DataCamp Classrooms gebruiken om GRATIS toegang te krijgen tot onze volledige premiumcatalogus. Dit omvat onze SQL-tracks en certificeringen.
Bekijk ook onze gratis SQL Basics-cheatsheet.
Richt je op deze kerngebieden: (1) Joins en subqueries – begrijp INNER, LEFT, RIGHT en FULL joins, plus gecorreleerde vs. niet-gecorreleerde subqueries; (2) Windowfuncties – ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD en running totals; (3) CTE’s (Common Table Expressions) – voor leesbare, onderhoudbare queries; (4) Aggregaties en GROUP BY – inclusief gebruik van de HAVING-clausule; (5) Queryoptimalisatie – indexeringsstrategieën en uitvoeringsplannen.
Alle drie zijn ranking-windowfuncties, maar ze gaan anders om met ties: ROW_NUMBER() kent unieke opeenvolgende nummers toe, ook bij ties (1, 2, 3, 4); RANK() geeft dezelfde rang bij ties maar slaat daaropvolgende nummers over (1, 2, 2, 4); DENSE_RANK() geeft dezelfde rang bij ties zonder over te slaan (1, 2, 2, 3). Gebruik DENSE_RANK bij het bepalen van de "n-de hoogste" waarde waarbij gelijke waarden dezelfde positie moeten delen.
IBM Certified Data Scientist (2020), eerder petroleumgeoloog/geomodelleur voor olie- en gasvelden wereldwijd, met 12+ jaar internationale werkervaring. Vaardig in Python, R en SQL. Expertisegebieden: datacleaning, datamanipulatie, datavisualisatie, data-analyse, datamodellering, statistiek, storytelling, machine learning. Ruime ervaring met het beheren van datascience-communities en het schrijven/reviewen van artikelen en tutorials over data science en carrière-onderwerpen.
Leer meer over SQL met deze cursussen!
Cursus
Cursus
Cursus

blog
Adel Nehme
15 min