Databases zonder mysterie

Je eerste zinvolle query

21 min
What you'll learn
  • queries schrijven met een expliciete lijst kolommen na SELECT en een rijfilter via WHERE
  • een bedrijfsvraag vertalen naar SQL via de route: entiteit → FROM, voorwaarden → WHERE (met AND), uitvoer → SELECT, volgorde → ORDER BY
  • uitleggen waarom SELECT * slechte praktijk is in productiequeries
  • een query controleren door hem hardop na te vertellen: komt je navertelling overeen met de oorspronkelijke vraag, dan klopt de query qua betekenis

De kaart is bestudeerd, en QUERY schakelt naar de volgende modus. Tot nu toe bekeek je het archief als geheel, als een toerist; een archivaris werkt preciezer. Op het holopaneel dooft alles behalve één tabel, en er verschijnt een opdracht: stel je vraag zo dat het antwoord geen enkele overbodige rij en geen enkele overbodige kolom bevat.

We kiezen de juiste kolommen en rijen

Alles met * ophalen is handig voor een eerste verkenning, maar in echt werk is het alsof je het hele magazijn naar de kassa sleept. Meestal heb je concrete velden nodig: som ze na SELECT op, gescheiden door komma's.

Met rijen werkt het net zo: in plaats van de hele etalage te pakken, kies je met WHERE alleen het segment dat je nodig hebt. Laten we «Kotomarket» bijvoorbeeld vragen om alleen de producten uit de categorie Boeken:

Een cadet versmalt een holografische etalage met een amberkleurige filterstraal: alleen enkele rijcapsules met boeken komen door de straal heen
Een precieze vraag aan het archief: SELECT benoemt de benodigde kolommen, WHERE laat alleen de benodigde rijen door.

Choosing the columns and rows you need

Grabbing everything with * is convenient for a first look, but in real work it’s like hauling the entire warehouse up to the checkout. Usually you need specific fields: list them, comma-separated, after SELECT.

It’s the same with rows: instead of the whole storefront, pick only the segment you need via WHERE. For example, let’s ask Kotomarket for only the products in the Books category:

Welke boeken er in de etalage staan en wat ze kosten:
Query result
nameprice
SQL для профи1290.00
Чистый код1490.00
Алгоритмы на практике1690.00

Van bedrijfsvraag naar query

Echte vragen bereiken de archivaris niet als SQL: «welke boeken zijn goedkoper dan vijftienhonderd?», «welke elektronica is duurder dan 5000?». De vertaling loopt altijd via dezelfde route:

  1. Entiteit → tabel. Waar gaat de vraag over: producten, kopers, bestellingen? «Boeken goedkoper dan 1500» gaat over producten, dus FROM products.
  2. Beperkingen → WHERE. Elke voorwaarde uit de vraag wordt een aparte filtervoorwaarde: categorie «Boeken», prijs lager dan 1500.
  3. Wat te tonen → SELECT. Wat moet er in het antwoord staan? De naam en de prijs — die sommen we op, de rest is ruis.
  4. Vorm van het antwoord → ORDER BY. «Van goedkoop naar duur» betekent sorteren op prijs.
-- «Welke boeken zijn goedkoper dan 1500 en hoeveel kosten ze, van goedkoop naar duur?»
SELECT name, price
FROM products
WHERE category = 'Книги' AND price < 1500
ORDER BY price;

Meerdere voorwaarden verbind je met het woord AND; de filteroperatoren behandelen we uitgebreid in het volgende hoofdstuk.

Een goede archivaris heeft ook de omgekeerde gewoonte: lees de afgewerkte query hardop als een zin. «Neem uit de producten de boeken goedkoper dan 1500, toon de naam en de prijs, sorteer op prijs» — komt je navertelling overeen met de oorspronkelijke vraag, dan klopt de query qua betekenis. Hoor je in je navertelling «alle kolommen» of «de hele etalage», ga dan terug en maak de query scherper.

Interview question

Sollicitatievraag: waarom wordt SELECT * als slechte praktijk beschouwd in productiequeries?

Sterk antwoord: ten eerste haal je overbodige data op: netwerk en geheugen gaan naar kolommen die je niet nodig hebt, en de database kan minder vaak alleen via de index antwoorden (index-only scan; indexen — Hoofdstuk 10). Ten tweede maakt het je code breekbaar: als er kolommen worden toegevoegd of hernoemd, kunnen rapporten en code stuklopen die rekenen op de samenstelling en volgorde van de kolommen. Een expliciete lijst kolommen is het contract van de query; SELECT * hoort hooguit thuis bij interactieve dataverkenning.

Check yourself
Wat toont de query SELECT name FROM products WHERE category = 'Книги'?

The index has been read: you know what’s in the five tables and which threads stitch them together. QUERY dims the map, and the next clearance level lights up on the holopanel — the reading terminal.

QUERY: Remember the cardinal property of this place: the archive answers only well-formed questions. From the next clearance on, we learn to ask precisely.

Practice: solve the tasks
Solved 0 of 2