Voorbereiding op SQL-sollicitatiegesprekken · Les

Subquery's in de FROM-component (derived tables)

Een query als virtuele tabel verpakken en begrijpen waarom aliassen verplicht zijn

Les 2 van 413 stappen

Subquery's in de FROM-component (derived tables) is een gratis Voorbereiding op SQL-sollicitatiegesprekken-les op CoddyKit. Dit is les 2 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.

Wat een afgeleide tabel is

Een subquery in de FROM-clausule heet een afgeleide tabel (of inline view). In plaats van één waarde te retourneren, levert deze een volledige resultatenset op die de buitenste query behandelt alsof het een echte tabel is.

  • De tabel kan veel rijen en veel kolommen bevatten.
  • Je kunt de tabel bevragen, ermee joinen en erop filteren zoals met elke andere tabel.

In sollicitatiegesprekken worden afgeleide tabellen gebruikt om te toetsen of je een probleem in stappen kunt opsplitsen.

Aliassen zijn verplicht

De belangrijkste valkuil: een afgeleide tabel moet een alias hebben. Zonder alias wijzen de meeste databasesystemen de query af.

  • MySQL: Elke afgeleide tabel moet een eigen alias hebben.
  • Postgres: subquery in FROM moet een alias hebben.

Geef de tabel een naam (hier dept_avg), dan kun je met die naam naar de kolommen verwijzen.

SELECT dept_avg.dept_id, dept_avg.avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS dept_avg;

Waarom je in een afgeleide tabel vooraf aggregeert

Een veelvoorkomend probleem in sollicitatiegesprekken: toon elke werknemer naast het gemiddelde salaris van diens afdeling. Je kunt de detailrij niet rechtstreeks combineren met een aggregatie zonder problemen met groeperen.

De nette aanpak is om het gemiddelde per afdeling in een afgeleide tabel te berekenen en die daarna terug te joinen met de detailrijen. De afgeleide tabel wordt eerst teruggebracht tot één rij per afdeling.

SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d ON e.dept_id = d.dept_id;

Filteren op een aggregatieresultaat

Met afgeleide tabellen kun je filteren op een berekende aggregatie zonder omslachtige HAVING-constructies in de buitenste query. Stel dat we alleen afdelingen willen waarvan het gemiddelde salaris hoger is dan 60000.

Binnenin voeren we de aggregatie uit en daarbuiten passen we met een gewone WHERE een filter toe op de afgeleide kolom. De buitenste query ziet avg_salary als een gewone kolom.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d
WHERE avg_salary > 60000;

Twee aggregatieniveaus

Afgeleide tabellen zijn ideaal wanneer je een aggregatie van een aggregatie nodig hebt — een klassieke vraag in sollicitatiegesprekken: wat is het gemiddelde van de gemiddelde salarissen per afdeling?

Je kunt AVG(AVG(...)) niet rechtstreeks nesten. De binnenste query levert één gemiddelde per afdeling; de buitenste query berekent daarvan het gemiddelde.

SELECT AVG(avg_salary) AS avg_of_dept_avgs
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d;

Berekende kolommen een naam geven

Elke expressie in een afgeleide tabel heeft een alias nodig als je er buiten naar wilt verwijzen. Voor de binnenste salary * 12 zou anders een door de database toegewezen naam worden gebruikt waarop je niet kunt vertrouwen.

Geef berekende kolommen altijd een alias — interviewers merken het als je verwijst naar een expressie zonder alias en een kolomnaam veronderstelt die misschien niet bestaat.

SELECT name, annual_salary
FROM (
  SELECT name, salary * 12 AS annual_salary
  FROM employees
) AS yearly
WHERE annual_salary > 100000;

Twee afgeleide tabellen combineren

Je kunt meerdere afgeleide tabellen met elkaar combineren. Hier vergelijken we het aantal werknemers per afdeling met de totale loonsom door twee vooraf geaggregeerde subqueries aan elkaar te koppelen.

Elke afgeleide tabel beantwoordt één deelvraag; de combinatie ervan vormt het uiteindelijke rapport. Deze stapsgewijze manier van denken wordt precies gewaardeerd in sollicitatiegesprekken voor functies op mediorniveau.

SELECT c.dept_id, c.headcount, p.payroll
FROM (
  SELECT dept_id, COUNT(*) AS headcount
  FROM employees GROUP BY dept_id
) AS c
JOIN (
  SELECT dept_id, SUM(salary) AS payroll
  FROM employees GROUP BY dept_id
) AS p ON c.dept_id = p.dept_id;

Bereik: de buitenste query kan de binnenste niet zien

Een belangrijke regel: de buitenste query kan alleen verwijzen naar de kolommen die de afgeleide tabel in zijn SELECT-lijst beschikbaar stelt. Kolommen die alleen binnen de subquery worden gebruikt, zijn daarbuiten onzichtbaar.

Als de binnenste query dept_id en avg_salary selecteert, zijn salary of name daarbuiten niet beschikbaar — ze zijn binnen de aggregatie gebruikt. Interviewers toetsen deze grens van de zichtbaarheid.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
) AS d;

Afgeleide tabel versus CTE

Een afgeleide tabel en een Common Table Expression (CTE) leveren vaak hetzelfde uitvoeringsplan op. In sollicitatiegesprekken kan de vraag komen waarom je de ene boven de andere kiest:

  • Afgeleide tabel: inline, geschikt voor eenmalig gebruik.
  • CTE (WITH): bovenaan benoemd, leesbaar en opnieuw bruikbaar als je er meerdere keren naar verwijst.

Bij diep geneste logica lees je een CTE-verwerkingsstroom van boven naar beneden; een afgeleide tabel lees je van binnen naar buiten.

WITH dept_avg AS (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
)
SELECT * FROM dept_avg WHERE avg_salary > 60000;

De LATERAL-/gecorreleerde subquery in FROM

Normaal gesproken kan een subquery in FROM niet verwijzen naar rijen uit de buitenste query. LATERAL (Postgres) of CROSS APPLY (SQL Server) heft die beperking op, zodat de afgeleide tabel per buitenste rij kan worden uitgevoerd.

Hiermee kun je per rij de beste N resultaten opzoeken. Dat je dit sleutelwoord kent, laat zelfs tijdens een mediorselectie zien dat je verder kijkt dan de basis.

SELECT d.dept_name, top_emp.name, top_emp.salary
FROM departments d
CROSS JOIN LATERAL (
  SELECT name, salary FROM employees e
  WHERE e.dept_id = d.id
  ORDER BY salary DESC LIMIT 1
) AS top_emp;

Interviewkernzin

Als je wordt gevraagd naar subqueries in de FROM-clausule, zeg je: "Een afgeleide tabel is een subquery in FROM die een resultaatset retourneert die de buitenste query als een tabel gebruikt. De subquery moet een alias hebben, de buitenste query kan alleen de kolommen zien die de subquery selecteert en dit is ideaal om vóór een join vooraf te aggregeren of een aggregatie te aggregeren."

Voeg eraan toe dat LATERAL naar rijen uit de buitenste query kan verwijzen, en je hebt alle invalshoeken behandeld.

Snelle controle

Kies de bewering die altijd vereist is voor een subquery in de FROM-clausule.

Samenvatting

Afgeleide tabellen, vastgelegd:

  • Een FROM-subquery retourneert een virtuele tabel — veel rijen, veel kolommen.
  • Deze moet een alias hebben; de buitenste query ziet alleen de geselecteerde kolommen.
  • Gebruik deze om vóór een join vooraf te aggregeren, op aggregaties te filteren of een aggregatie te aggregeren.
  • Een CTE is het leesbare, benoemde alternatief; LATERAL/CROSS APPLY laten deze verwijzen naar rijen uit de buitenste query.

Volgende onderwerp: subqueries voor setlidmaatschap met IN, ANY en ALL.

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 “Subquery's in de FROM-component (derived tables)” gratis?

Ja — de volledige tekst van “Subquery's in de FROM-component (derived tables)” 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 “Subquery's in de FROM-component (derived tables)”?

Een query als virtuele tabel verpakken en begrijpen waarom aliassen verplicht zijn 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 2 van 4.

Hoe lang duurt de les “Subquery's in de FROM-component (derived tables)”?

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. Scalaire subquery's in SELECT en WHERE
  2. Subquery's in de FROM-component (derived tables)
  3. IN-, ANY- en ALL-subquery's
  4. EXISTS versus IN: prestaties
← Terug naar Voorbereiding op SQL-sollicitatiegesprekken