Voorbereiding op SQL-sollicitatiegesprekken · Les

Volledige set oefenopgaven voor sollicitatiegesprekken

Getimede end-to-end-opgaven waarin u onder interviewomstandigheden joins, windows en CTE's combineert.

Les 4 van 413 stappen

Volledige set oefenopgaven voor sollicitatiegesprekken is een gratis Voorbereiding op SQL-sollicitatiegesprekken-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 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.

Verloop van een SQL-interviewronde

In deze afsluitende les doorloop je volledige oefenopgaven waarin joins, vensterfuncties en CTE's onder interviewomstandigheden worden gecombineerd. Eerst de metavaardigheid: hoe je je tijdens het gesprek opstelt.

  • Formuleer het probleem opnieuw en bevestig het schema.
  • Verduidelijk randgevallen, zoals NULL-waarden, gelijke waarden en duplicaten, voordat je code schrijft.
  • Licht je aanpak toe en schrijf daarna de query.
  • Controleer de query in gedachten aan de hand van een heel klein voorbeeld.

Interviewers beoordelen je werkwijze net zo goed als je uiteindelijke query.

Het gedeelde schema

Alle onderstaande opgaven gebruiken dit kleine e-commerceschema. Lees het één keer door, zodat elke query begrijpelijk is.

  • customers(id, name, country)
  • orders(id, customer_id, order_date, status, amount)
  • order_items(order_id, product_id, quantity)
  • products(id, name, category, price)

Houd dit in gedachten; in de rest van de les verwijzen we naar deze tabellen.

-- orders.status is one of: 'paid','pending','cancelled'
-- amount is the order total in the customer's currency

Probleem 1: topklanten op basis van bestedingen

"Geef de 3 klanten met de hoogste totale betaalde bestedingen, met hun naam en totaal."

Aanpak: filter op betaalde bestellingen, aggregeer per klant, rangschik en gebruik LIMIT. Vermeld dat je geannuleerde en nog niet verwerkte bestellingen uitsluit; dat is een randgeval dat interviewers bewust inbouwen.

SELECT c.name,
       SUM(o.amount) AS total_spend
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid'
GROUP BY c.id, c.name
ORDER BY total_spend DESC
LIMIT 3;

Probleem 2: klanten die nooit een bestelling hebben geplaatst

"Geef een lijst van klanten die nooit een bestelling hebben geplaatst." Dit is het patroon van de anti-join. Twee heldere oplossingen zijn een LEFT JOIN met IS NULL of NOT EXISTS.

Geef de voorkeur aan NOT EXISTS, omdat dit veilig met NULL-waarden omgaat, in tegenstelling tot NOT IN. Benoem dat onderscheid; precies daarop probeert de interviewer je te toetsen.

-- NULL-safe anti-join
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.id
);

Probleem 3: op één na hoogste bestelbedrag

"Vind het op één na hoogste verschillende bestelbedrag." De duidelijkste oplossing die goed omgaat met gelijke waarden gebruikt DENSE_RANK, zodat dubbele bedragen dezelfde rang krijgen.

Een randgeval dat je moet benoemen: als er geen tweede verschillende waarde is, levert dit geen rijen op. Dat kan acceptabel zijn, maar afhankelijk van de vereisten kan een omhulling met COALESCE nodig zijn.

SELECT amount
FROM (
  SELECT amount,
         DENSE_RANK() OVER (ORDER BY amount DESC) AS rnk
  FROM orders
) ranked
WHERE rnk = 2;

Probleem 4: de recentste bestelling per klant

"Geef de recentste bestelling van elke klant." Dit is het patroon om per sleutel alleen de nieuwste rij te behouden, opgelost met ROW_NUMBER, gepartitioneerd op klant en aflopend op datum gesorteerd.

Voeg een tiebreaker toe, zoals het bestel-id, zodat het resultaat eenduidig is wanneer twee bestellingen dezelfde datum hebben. Dat detail noemen sterke kandidaten.

SELECT customer_id, id AS order_id, order_date, amount
FROM (
  SELECT o.*,
         ROW_NUMBER() OVER (
           PARTITION BY customer_id
           ORDER BY order_date DESC, id DESC
         ) AS rn
  FROM orders o
) t
WHERE rn = 1;

Probleem 5: maand-op-maandgroei

"Bereken de maandelijkse betaalde omzet en de procentuele verandering ten opzichte van de vorige maand." Hierbij combineer je aggregatie in een CTE met LAG.

In stap één aggregeer je per maand; in stap twee vergelijk je elke maand met de vorige met LAG. Voorkom een fout bij de deling, zodat de eerste maand, waarvoor geen vorige maand bestaat, geen fout veroorzaakt.

WITH monthly AS (
  SELECT DATE_TRUNC('month', order_date) AS mth,
         SUM(amount) AS revenue
  FROM orders
  WHERE status = 'paid'
  GROUP BY DATE_TRUNC('month', order_date)
)
SELECT mth,
       revenue,
       LAG(revenue) OVER (ORDER BY mth) AS prev_revenue,
       ROUND(
         100.0 * (revenue - LAG(revenue) OVER (ORDER BY mth))
         / NULLIF(LAG(revenue) OVER (ORDER BY mth), 0), 2
       ) AS pct_change
FROM monthly
ORDER BY mth;

Probleem 6: het best verkopende product per categorie

"Geef voor elke categorie het best verkopende product op basis van de totale hoeveelheid." Dit is het patroon voor top-N per groep: aggregeer, rangschik binnen de partitie en filter op rang 1.

Als gelijke resultaten belangrijk zijn, vervang je ROW_NUMBER door RANK, zodat alle gedeelde koplopers verschijnen. Door die keuze te benoemen laat je zien dat je het verschil begrijpt.

WITH sales AS (
  SELECT p.category,
         p.name AS product,
         SUM(oi.quantity) AS qty
  FROM order_items oi
  JOIN products p ON p.id = oi.product_id
  GROUP BY p.category, p.name
)
SELECT category, product, qty
FROM (
  SELECT s.*,
         ROW_NUMBER() OVER (
           PARTITION BY category ORDER BY qty DESC
         ) AS rn
  FROM sales s
) r
WHERE rn = 1;

Probleem 7: lopend omzet totaal

"Toon per dag een lopend, cumulatief totaal van de betaalde omzet." Een vensterfunctie SUM met een geordend kader levert het lopende totaal op zonder een self-join.

Benoem het kader op basis van ROWS voor een echte cumulatie rij voor rij; het standaardkader RANGE kan zich onverwacht gedragen bij gelijke datums.

SELECT order_date,
       SUM(daily) OVER (
         ORDER BY order_date
         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
       ) AS running_total
FROM (
  SELECT order_date, SUM(amount) AS daily
  FROM orders
  WHERE status = 'paid'
  GROUP BY order_date
) d
ORDER BY order_date;

Probleem 8: opeenvolgende actieve dagen

"Vind gebruikers met minstens 3 opeenvolgende dagen waarop een betaalde bestelling staat." Dit is een variant op het patroon van gaten en eilanden, met de truc van het verschil tussen rijnummers.

Als je een rijnummer per gebruiker van de datum aftrekt, krijg je binnen een opeenvolgende reeks een constante waarde. Vervolgens groepeer je op die waarde en tel je de rijen. Dit is een signaal op seniorniveau.

WITH days AS (
  SELECT DISTINCT customer_id, order_date
  FROM orders WHERE status = 'paid'
),
grp AS (
  SELECT customer_id, order_date,
         order_date - (ROW_NUMBER() OVER (
           PARTITION BY customer_id ORDER BY order_date
         ) * INTERVAL '1 day') AS island
  FROM days
)
SELECT customer_id, COUNT(*) AS streak_len
FROM grp
GROUP BY customer_id, island
HAVING COUNT(*) >= 3;

Prestaties en veelvoorkomende valkuilen

Nadat je een correcte query hebt geschreven, vragen interviewers: "Hoe zou je dit sneller maken?" Ze letten daarbij op klassieke valkuilen. Houd een checklist bij de hand:

  • Indexeer de kolommen waarop je joint en filtert, bijvoorbeeld orders(customer_id, status); vermijd functies op geïndexeerde kolommen in WHERE.
  • Geef bij grote anti-joins de voorkeur aan EXISTS boven IN; NOT IN met een NULL-waarde levert stilletjes niets op.
  • Door een kolom uit een outer join in WHERE te filteren, verandert de join ongemerkt in een inner join.
  • Voeg altijd een tiebreaker toe, zodat top-N-resultaten eenduidig zijn.
  • Controleer het EXPLAIN-plan op sequentiële scans van grote tabellen.

Korte controle

Je hebt de enige recentste bestelling van elke klant nodig, terwijl twee bestellingen dezelfde datum kunnen hebben.

Samenvatting: volledige reeks oefeninterviews

Je hebt de meest voorkomende interviewopgaven van begin tot eind doorlopen:

  • Aggregatie plus LIMIT voor de hoogste N bestedingen.
  • Anti-joins met NOT EXISTS, veilig met NULL-waarden.
  • DENSE_RANK voor de N-de hoogste waarde en ROW_NUMBER voor de nieuwste rij per sleutel en de hoogste waarde per groep.
  • LAG voor maand-op-maandvergelijkingen en SUM OVER voor lopende totalen.
  • De truc met rijnummers in het patroon van gaten en eilanden voor opeenvolgende reeksen.
  • Sluit elk antwoord af met een bespreking van indexen, EXPLAIN en veelvoorkomende valkuilen.
Gratis beginnen

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 “Volledige set oefenopgaven voor sollicitatiegesprekken” gratis?

Ja — de volledige tekst van “Volledige set oefenopgaven voor sollicitatiegesprekken” 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 “Volledige set oefenopgaven voor sollicitatiegesprekken”?

Getimede end-to-end-opgaven waarin u onder interviewomstandigheden joins, windows en CTE's combineert. 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 4 van 4.

Hoe lang duurt de les “Volledige set oefenopgaven voor sollicitatiegesprekken”?

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

  1. Normaliseren tot en met 3NF
  2. ER-modellering en cardinaliteit van relaties
  3. Star-schema's en datawarehouseontwerp
  4. Volledige set oefenopgaven voor sollicitatiegesprekken
← Terug naar Voorbereiding op SQL-sollicitatiegesprekken