Cursussen › Datagedreven Beslissingen: Van Vraag naar Antwoord

Je Eerste Echte Query op Alpenkorb-bestellingen

Les 5 van 8 · 13 min

De vorm van elke query

Je hebt in de eerste vier labs al kleine queries uitgevoerd. Deze les zet de puzzelstukken op een rij, want bijna elke analysequery heeft hetzelfde skelet.

Text
SELECT   columns or calculations
FROM     table
WHERE    conditions on rows
ORDER BY sort columns
LIMIT    number of rows;

SQL voert de clausules in een andere volgorde uit dan waarin je ze schrijft. Eerst kiest FROM de tabel, dan verwijdert WHERE rijen, dan berekent SELECT de kolommen, dan sorteert ORDER BY en snijdt LIMIT af. Daarom kan WHERE niet filteren op een naam die je in SELECT aanmaakt, terwijl ORDER BY er wel op kan sorteren.

Filters die bij de business passen

Lena wil weten of kortingscodes grotere mandjes opleveren. In de tabel orders bevat discount_code codes zoals WELCOME10 voor een eerste bestelling of AFFILIATE15 van partnersites, en is leeg wanneer er geen code is gebruikt. In SQL is een lege waarde NULL, wat onbekend betekent, en dat vraagt om een eigen test.

SQL
SELECT order_id, order_date, source, discount_code, net_amount
FROM orders
WHERE status = 'delivered'
  AND discount_code IS NOT NULL
  AND order_date >= '2026-01-01'
ORDER BY net_amount DESC
LIMIT 3;

discount_code = NULL zou helemaal geen rijen teruggeven. Iets vergelijken met onbekend geeft onbekend, en WHERE houdt alleen rijen over waar de voorwaarde waar is. Gebruik in plaats daarvan IS NULL en IS NOT NULL.

  • AND vereist elke voorwaarde, OR minstens één. Als je ze combineert, voeg dan haakjes toe: WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').
  • IN is een korte vorm voor meerdere OR's: region IN ('Bern', 'Basel').
  • Tekstvergelijkingen hebben enkele aanhalingstekens en de exacte spelling nodig. De regio's worden geschreven als 'Zurich', 'Geneva' en 'St. Gallen'.

Drie kleine fouten veroorzaken de meeste mislukte eerste queries. Tekstwaarden gebruiken enkele aanhalingstekens: in DuckDB betekent "delivered" tussen dubbele aanhalingstekens een kolom die delivered heet, en dan mislukt de query. Datums worden als tekst geschreven in ISO-vorm, '2026-01-01', wat DuckDB correct vergelijkt met een datumkolom. En een ontbrekende of overtollige komma tussen kolommen geeft een syntaxisfout bij het volgende woord.

De statusvalkuil

De tabel orders bevat elke ooit geplaatste bestelling, inclusief 67 geannuleerde en 80 geretourneerde. Hun net_amount is nog steeds ingevuld, omdat het bedrag bekend was toen de bestelling werd geplaatst. Vergeet je status = 'delivered', dan valt de omzet te hoog uit. In het eerste kwartaal van 2026 verandert die fout CHF 37'107.20 in CHF 38'787.67. De fout is ook niet gelijk verdeeld: annuleringen en retouren komen bij sommige bronnen vaker voor dan bij andere.

Wat liet de kortingsvraag zien? In het eerste kwartaal van 2026 gebruikten 90 van de 648 geleverde bestellingen een code. Hun gemiddelde waarde was CHF 57.16, tegenover CHF 57.28 voor bestellingen zonder code. Op basis hiervan leveren codes geen grotere mandjes op. Ze kunnen nog steeds nieuwe klanten winnen, wat een andere vraag is en een andere query nodig heeft. Vertrouw geen resultaat voordat je het aantal rijen hebt vergeleken met een cijfer dat je al kent: het lab in les 2 gaf 648 geleverde bestellingen terug voor dit kwartaal, dus een filter op hetzelfde kwartaal kan nooit meer opleveren.

💡 Bouw een query stap voor stap op. Begin met SELECT * FROM orders LIMIT 10, voeg één filter toe, voer uit, controleer het aantal rijen, en voeg dan de volgende toe. Een lange query die in één keer wordt geschreven en één keer wordt uitgevoerd, verbergt zijn fouten.
Kennistoets
Waarom geeft WHERE discount_code = NULL geen rijen terug?

Log in om antwoord te geven en je voortgang bij te houden.

Inloggen
</>
Babala Software Netzwerk — Apps, Websites & KI-Lösungen aus Füllinsdorf BL
© 2026 Babala Özdemir · UID CHE-322.105.560 babala.ch info@babala.ch 076 792 63 50 Facebook Instagram