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.
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.
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.
ANDvereist elke voorwaarde,ORminstens één. Als je ze combineert, voeg dan haakjes toe:WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').INis een korte vorm voor meerdereOR'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.
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.WHERE discount_code = NULL geen rijen terug?Log in om antwoord te geven en je voortgang bij te houden.
Inloggen