Databaser uden tåge

Din første nyttige forespørgsel

21 min
What you'll learn
  • at skrive forespørgsler med en udtrykkelig liste af kolonner efter SELECT og et rækkefilter via WHERE
  • at oversætte et forretningsspørgsmål til SQL ad ruten: entitet → FROM, begrænsninger → WHERE (med AND), output → SELECT, rækkefølge → ORDER BY
  • at forklare, hvorfor SELECT * er dårlig praksis i forespørgsler, der kører i drift
  • at tjekke en forespørgsel ved at gengive den højt: stemmer gengivelsen med det oprindelige spørgsmål, er forespørgslen rigtig efter mening

Kortet er studeret — og QUERY ændrer reglerne. Indtil nu har du betragtet arkivet som helhed, som en turist; en arkivar arbejder anderledes. På holopanelet slukkes alt på nær én tabel, og en opgave dukker op: stil dit spørgsmål, så svaret ikke indeholder en eneste overflødig række eller en eneste overflødig kolonne.

Vi vælger de kolonner og rækker, vi skal bruge

At tage alt via * er praktisk ved den første kontakt, men i virkeligt arbejde er det som at slæbe hele lageret op til kassen. Som regel skal du bruge konkrete felter: remse dem op med komma efter SELECT.

Med rækkerne er det det samme: i stedet for hele butiksdisken vælger du kun det nødvendige segment via WHERE. Lad os for eksempel bede Kotomarket om kun varerne fra kategorien Bøger:

En kadet indsnævrer en holografisk butiksdisk med en ravgul filterstråle: kun nogle få kapsel-rækker med bøger slipper gennem strålen
Et præcist spørgsmål til arkivet: SELECT navngiver de kolonner, du skal bruge, WHERE lukker kun de nødvendige rækker igennem.

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:

Hvilke bøger der er på butiksdisken, og hvad de koster:
Query result
nameprice
SQL для профи1290.00
Чистый код1490.00
Алгоритмы на практике1690.00

Fra forretningsspørgsmål — til forespørgsel

De rigtige spørgsmål når ikke arkivaren på SQL: »hvilke bøger er billigere end halvandet tusind?«, »hvad af elektronikken koster mere end 5000?«. Oversættelsen går altid ad én rute:

  1. Entitet → tabel. Hvad handler spørgsmålet om: varer, kunder, ordrer? »Bøger billigere end 1500« handler om varer, altså FROM products.
  2. Begrænsninger → WHERE. Hvert vilkår fra spørgsmålet er et separat filtervilkår: kategorien »Bøger«, prisen under 1500.
  3. Hvad skal vises → SELECT. Hvad vil personen gerne se i svaret? Navn og pris — dem remser vi op, resten er støj.
  4. Svarets form → ORDER BY. »Fra billig til dyr« — en sortering efter pris.
-- »Hvilke bøger er billigere end 1500, og hvad koster de, fra billig til dyr?«
SELECT name, price
FROM products
WHERE category = 'Книги' AND price < 1500
ORDER BY price;

Flere vilkår forbindes med ordet AND — filteroperatorerne gennemgår vi grundigt i næste kapitel.

Og den gode arkivars omvendte vane: læs den færdige forespørgsel højt som en sætning. »Tag bøgerne billigere end 1500 fra varerne, vis navn og pris, sortér efter pris« — stemmer gengivelsen med det oprindelige spørgsmål, er forespørgslen rigtig efter mening. Dukker »alle kolonner« eller »hele butiksdisken« op i gengivelsen — så gå tilbage og indsnævr.

Interview question

Spørgsmål fra en jobsamtale: hvorfor regnes SELECT * for dårlig praksis i forespørgsler, der kører i drift?

Et stærkt svar: for det første overflødige data: netværk og hukommelse bruges på kolonner, der ikke er brug for, og databasen mister muligheden for at svare alene ud fra indekset (index-only scan; indekser — kapitel 10). For det andet skrøbelighed: når kolonner tilføjes eller omdøbes, knækker rapporter og kode, der regner med kolonnernes sammensætning og rækkefølge. En udtrykkelig liste af kolonner er forespørgslens kontrakt; SELECT * er højst på sin plads i interaktiv udforskning af data.

Check yourself
Hvad returnerer forespørgslen 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