Direct naar de hoofdinhoud
Module 14 · Les 1 van 353/57 in de cursus~12 min
Modulelessen (1/3)

Inleiding tot CTE's (MET)

Inleiding tot CTE's (MET)

Vroeg of laat overkomt het iedereen: je moet gegevens filteren op basis van het resultaat van een aggregatie, dan dat filter nemen en het samenvoegen met een andere geaggregeerde query. Je begint met het schrijven van een SELECT in een SELECT, die op zijn beurt terechtkomt in de FROM van nog een andere SELECT.

Het resultaat? Spaghetti SQL, een zoekopdracht die voor geen enkel mens leesbaar is.

Met CTE's (Common Table Expressions) kunt u deze puinhoop ontwarren. U activeert ze met het trefwoord WITH, waarmee u tijdelijke benoemde query's kunt definiëren en deze vervolgens kunt hergebruiken als 'virtuele tabellen' in de uiteindelijke query.

Basissyntaxis

SQL
WITH premium_customers AS (
  SELECT customer_id, SUM(total_amount) AS total_spent
  FROM orders
  GROUP BY customer_id
  HAVING SUM(total_amount) > 1000
)
SELECT customers.first_name, premium_customers.total_spent
FROM customers
JOIN premium_customers ON customers.id = premium_customers.customer_id;

Zoals u kunt zien, leest de hoofdquery onderaan premium_customers alsof het een echte tabel is! En het is veel leesbaarder dan een mega inner-join met geneste subquery's.

Oefening#sql.m14.l1.e1
Pogingen: 0Laden…

Wij willen de zeer dure producten. Gebruik een CTE met de naam 'luxury_products' om 'id' en 'price' te selecteren uit 'products' waarbij 'price > 500' is. Voer vervolgens een hoofdquery uit op deze CTE en toon alles (*).

Editor laden…
Toon hint

Begin met MET luxe_producten AS (...) en SELECTEER * UIT luxe_producten.

Oplossing beschikbaar na 3 pogingen

Oefening#sql.m14.l1.e2
Pogingen: 0Laden…

We willen gebruikers vinden die beoordelingen schrijven. Creëer een CTE 'reviewers' die de unieke (DISTINCT) 'customer_id'-waarden uit 'reviews' haalt. Extraheer vervolgens 'id', 'voornaam', 'achternaam' uit de tabel 'klanten' en \`JOIN\` met de CTE van de 'reviewers' op id.

Editor laden…
Toon hint

MET reviewers AS (SELECTEER VERSCHILLENDE klant_id UIT beoordelingen) SELECTEER id, voornaam, achternaam VAN klanten WORD LID VAN reviewers OP customers.id = reviewers.customer_id;

Oplossing beschikbaar na 3 pogingen