Tietokannat ilman sumua

Ensimmäinen hyödyllinen kysely

21 min
What you'll learn
  • kirjoittamaan kyselyitä, joissa on eksplisiittinen sarakelista SELECT-kohdan jälkeen ja rivisuodatin WHERE-kohdan kautta
  • kääntämään bisneskysymyksen SQL:ksi reittiä pitkin: entiteetti → FROM, rajoitukset → WHERE (AND-sanalla), tuloste → SELECT, järjestys → ORDER BY
  • selittämään, miksi SELECT * on huono käytäntö tuotantokyselyissä
  • tarkistamaan kyselyn kertomalla sen ääneen: jos kertaus osuu alkuperäiseen kysymykseen, kysely on merkitykseltään oikein

Kartta on opittu – ja QUERY muuttaa säännöt. Tähän asti olet katsellut arkistoa kokonaisuutena kuin turisti; arkistoija työskentelee toisin. Holopaneelista sammuu kaikki yhtä taulua lukuun ottamatta, ja eteen ilmestyy tehtävä: esitä kysymyksesi niin, ettei vastaukseen jää yhtään ylimääräistä riviä eikä yhtään ylimääräistä saraketta.

Valitsemme tarvittavat sarakkeet ja rivit

Kaiken hakeminen *:llä on kätevää ensituttavuudessa, mutta oikeassa työssä se on kuin toisi koko varaston kassalle. Yleensä tarvitset tiettyjä kenttiä: luettele ne pilkuilla erotettuina SELECT-kohdan jälkeen.

Rivien kanssa sama juttu: koko hyllyn sijaan valitse vain tarvittava segmentti WHERE-kohdalla. Pyydetään esimerkiksi Kotomarketilta vain Kirjat-kategorian tuotteet:

Kadetti kaventaa meripihkanvärisellä suodatinsäteellä holografista hyllyä: säteen läpi pääsee vain muutama kapseli-rivi kirjoja
Täsmällinen kysymys arkistolle: SELECT nimeää tarvittavat sarakkeet, WHERE päästää läpi vain tarvittavat rivit.

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:

Mitä kirjoja hyllyllä on ja paljonko ne maksavat:
Query result
nameprice
SQL для профи1290.00
Чистый код1490.00
Алгоритмы на практике1690.00

Bisneskysymyksestä kyselyksi

Todelliset kysymykset eivät tule arkistoijalle SQL:nä: ”mitkä kirjat ovat alle puolentoista tuhannen?”, ”mitkä elektroniikkatuotteet maksavat yli 5000?”. Käännös etenee aina yhtä reittiä pitkin:

  1. Entiteetti → taulu. Mistä kysymys on: tuotteista, ostajista, tilauksista? ”Kirjat alle 1500” on tuotteista, eli FROM products.
  2. Rajoitukset → WHERE. Jokainen kysymyksen ehto on erillinen suodatusehto: kategoria ”Kirjat”, hinta alle 1500.
  3. Mitä näyttää → SELECT. Mitä ihminen haluaa nähdä vastauksessa? Nimen ja hinnan – ne luettelemme, muu on kohinaa.
  4. Vastauksen muoto → ORDER BY. ”Halvimmista kalliimpiin” – lajittelu hinnan mukaan.
-- ”Mitkä kirjat ovat alle 1500 ja paljonko ne maksavat, halvimmista kalliimpiin?”
SELECT name, price
FROM products
WHERE category = 'Книги' AND price < 1500
ORDER BY price;

Useat ehdot yhdistetään sanalla AND – käymme suodatusoperaattorit perusteellisesti läpi seuraavassa luvussa.

Ja hyvän arkistoijan käänteinen tapa: lue valmis kysely ääneen lauseena. ”Tuotteista ota kirjat alle 1500, näytä nimi ja hinta, lajittele hinnan mukaan” – jos kertaus osuu alkuperäiseen kysymykseen, kysely on merkitykseltään oikein. Jos kertaukseen pulpahtaa ”kaikki sarakkeet” tai ”koko hylly” – palaa takaisin ja kavenna.

Interview question

Haastattelukysymys: miksi SELECT * katsotaan huonoksi käytännöksi tuotantokyselyissä?

Vahva vastaus: ensinnäkin ylimääräinen data: verkkoa ja muistia kuluu sarakkeisiin, joita ei tarvita, ja tietokanta menettää mahdollisuuden vastata pelkän indeksin perusteella (index-only scan; indeksit – luku 10). Toiseksi hauraus: kun sarakkeita lisätään tai nimetään uudelleen, hajoavat raportit ja koodi, jotka luottavat sarakkeiden joukkoon ja järjestykseen. Eksplisiittinen sarakelista on kyselyn sopimus; SELECT * sopii korkeintaan interaktiiviseen datan tutkimiseen.

Check yourself
Mitä kysely SELECT name FROM products WHERE category = 'Книги' näyttää?

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