Baze podataka bez magle

Prvi koristan upit

21 min
What you'll learn
  • pisati upite s izričitim popisom stupaca iza SELECT i filtrom redaka kroz WHERE
  • prevesti poslovno pitanje u SQL putem: entitet → FROM, ograničenja → WHERE (s AND), izlaz → SELECT, redoslijed → ORDER BY
  • objasniti zašto je SELECT * loša praksa u radnim upitima
  • provjeriti upit prepričavanjem naglas: ako se prepričavanje poklopi s polaznim pitanjem, upit je smisleno ispravan

Karta je proučena — i QUERY mijenja pravila. Dosad si arhiv razgledavao u cijelosti, poput turista; arhivist radi drukčije. Na holoploči se gasi sve osim jedne tablice i pojavljuje se zadatak: postavi pitanje tako da se u odgovoru ne nađe ni jedan suvišan redak ni jedan suvišan stupac.

Biramo potrebne stupce i retke

Uzimati sve kroz * zgodno je za prvo upoznavanje, ali u stvarnome radu to je kao da na blagajnu doneseš cijelo skladište. Obično ti trebaju konkretna polja: nabroji ih zarezima iza SELECT.

S recima je isto: umjesto cijelog izloga odaberi samo potreban segment kroz WHERE. Primjerice, zatražimo od Kotomarketa samo proizvode iz kategorije Knjige:

Kadet jantarnim snopom-filtrom sužava holografski izlog: kroz snop prolazi tek nekoliko redaka-kapsula s knjigama
Precizno pitanje arhivu: SELECT imenuje potrebne stupce, WHERE propušta samo potrebne retke.

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:

Koje knjige ima na izlogu i koliko koštaju:
Query result
nameprice
SQL для профи1290.00
Чистый код1490.00
Алгоритмы на практике1690.00

Iz poslovnog pitanja — u upit

Stvarna pitanja arhivistu ne stižu u SQL-u: „koje su knjige jeftinije od tisuću i pol?”, „što je od elektronike skuplje od 5000?”. Prijevod uvijek ide istim putem:

  1. Entitet → tablica. O čemu je pitanje: o proizvodima, kupcima, narudžbama? „Knjige jeftinije od 1500” — o proizvodima, znači FROM products.
  2. Ograničenja → WHERE. Svaki uvjet iz pitanja zaseban je uvjet filtra: kategorija „Knjige”, cijena manja od 1500.
  3. Što pokazati → SELECT. Što čovjek želi vidjeti u odgovoru? Naziv i cijenu — njih i nabrajamo, ostalo je šum.
  4. Oblik odgovora → ORDER BY. „Od jeftinih prema skupima” — sortiranje po cijeni.
-- „Koje su knjige jeftinije od 1500 i koliko koštaju, od jeftinih prema skupima?”
SELECT name, price
FROM products
WHERE category = 'Книги' AND price < 1500
ORDER BY price;

Nekoliko uvjeta povezuje se riječju AND — operatore filtra detaljno ćemo razložiti u sljedećem poglavlju.

I obrnuta navika dobrog arhivista: pročitaj gotovi upit naglas kao rečenicu. „Iz proizvoda uzmi knjige jeftinije od 1500, pokaži naziv i cijenu, sortiraj po cijeni” — ako se prepričavanje poklopi s polaznim pitanjem, upit je smisleno ispravan. Iskoči li u prepričavanju „svi stupci” ili „cijeli izlog” — vrati se i suzi.

Interview question

Pitanje s razgovora za posao: zašto se SELECT * smatra lošom praksom u radnim upitima?

Snažan odgovor: prvo, suvišni podaci: mreža i memorija troše se na stupce koji ne trebaju, a baza gubi mogućnost odgovoriti samo iz indeksa (index-only scan; indeksi — 10. poglavlje). Drugo, krhkost: pri dodavanju ili preimenovanju stupaca lome se izvještaji i kod koji računa na sastav i redoslijed stupaca. Izričit popis stupaca ugovor je upita; SELECT * je primjeren tek u interaktivnom istraživanju podataka.

Check yourself
Što će pokazati upit 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