Podatkovne baze brez megle

Prva uporabna poizvedba

21 min
What you'll learn
  • pisati poizvedbe z izrecnim seznamom stolpcev za SELECT in filtrom vrstic prek WHERE
  • prevesti poslovno vprašanje v SQL po poti: entiteta → FROM, omejitve → WHERE (z AND), izpis → SELECT, vrstni red → ORDER BY
  • razložiti, zakaj je SELECT * slaba praksa v delovnih poizvedbah
  • preveriti poizvedbo s pripovedovanjem na glas: če se pripoved ujema z izhodiščnim vprašanjem, je poizvedba pomensko pravilna

Zemljevid je preučen — in QUERY spremeni pravila. Doslej si arhiv razgledoval v celoti, kot turist; arhivist dela drugače. Na holopanelu ugasne vse razen ene tabele in pojavi se naloga: zastavi vprašanje tako, da v odgovoru ne bo niti ene odvečne vrstice in niti enega odvečnega stolpca.

Izberemo potrebne stolpce in vrstice

Vzeti vse prek * je priročno za prvo seznanitev, v resničnem delu pa je to, kot bi na blagajno prinesel celo skladišče. Običajno potrebuješ konkretna polja: naštej jih z vejicami za SELECT.

Z vrsticami je enako: namesto cele izložbe izberi le potreben segment prek WHERE. Na primer, prosimo Kotomarket samo za izdelke iz kategorije Knjige:

Kadet z jantarnim žarkom-filtrom oži holografsko izložbo: skozi žarek pridejo le nekatere vrstice-kapsule s knjigami
Natančno vprašanje arhivu: SELECT poimenuje potrebne stolpce, WHERE prepusti le potrebne vrstice.

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:

Katere knjige so na izložbi in koliko stanejo:
Query result
nameprice
SQL для профи1290.00
Чистый код1490.00
Алгоритмы на практике1690.00

Iz poslovnega vprašanja — v poizvedbo

Resnična vprašanja k arhivistu ne pridejo v SQL: »katere knjige so cenejše od poldrugega tisoča?«, »kaj iz elektronike je dražje od 5000?«. Prevod vedno poteka po eni poti:

  1. Entiteta → tabela. O čem govori vprašanje: o izdelkih, kupcih, naročilih? »Knjige pod 1500« je o izdelkih, torej FROM products.
  2. Omejitve → WHERE. Vsak pogoj iz vprašanja je samostojen pogoj filtra: kategorija »Knjige«, cena pod 1500.
  3. Kaj prikazati → SELECT. Kaj človek želi videti v odgovoru? Naziv in ceno — ta dva naštejemo, ostalo je šum.
  4. Oblika odgovora → ORDER BY. »Od cenenih k dragim« je razvrstitev po ceni.
-- »Katere knjige so cenejše od 1500 in koliko stanejo, od cenenih k dragim?«
SELECT name, price
FROM products
WHERE category = 'Книги' AND price < 1500
ORDER BY price;

Več pogojev se poveže z besedo AND — operatorje filtra bomo podrobno razčlenili v naslednjem poglavju.

In obratna navada dobrega arhivista: preberi dokončano poizvedbo na glas kot stavek. »Iz izdelkov vzemi knjige, cenejše od 1500, prikaži naziv in ceno, razvrsti po ceni« — če se pripoved ujema z izhodiščnim vprašanjem, je poizvedba pomensko pravilna. Če v pripovedi pricurlja »vsi stolpci« ali »cela izložba« — vrni se in oži.

Interview question

Vprašanje z razgovora: zakaj velja SELECT * za slabo prakso v delovnih poizvedbah?

Močan odgovor: prvič, odvečni podatki: omrežje in pomnilnik se trošita na stolpce, ki niso potrebni, baza pa izgubi možnost odgovoriti samo iz indeksa (index-only scan; indeksi — 10. poglavje). Drugič, krhkost: pri dodajanju ali preimenovanju stolpcev se podrejo poročila in koda, ki računata na sestavo in vrstni red stolpcev. Izrecen seznam stolpcev je pogodba poizvedbe; SELECT * je primeren kvečjemu pri interaktivnem raziskovanju podatkov.

Check yourself
Kaj bo prikazala poizvedba 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.