Adatbázisok ködök nélkül

Az első hasznos lekérdezés

21 min
What you'll learn
  • lekérdezéseket írni a SELECT utáni kifejezett oszloplistával és a sorok WHERE szerinti szűrésével
  • egy üzleti kérdést SQL-re fordítani a következő útvonalon: entitás → FROM, megkötések → WHERE (AND-del), kimenet → SELECT, sorrend → ORDER BY
  • elmagyarázni, miért rossz gyakorlat a SELECT * az éles lekérdezésekben
  • ellenőrizni a lekérdezést hangos elmondással: ha az elmondás egyezik az eredeti kérdéssel, a lekérdezés jelentésében helyes

A térkép tanulmányozva — és a QUERY megváltoztatja a szabályokat. Eddig az egész archívumot szemlélted, mint egy turista; az archivista másképp dolgozik. A holopanelen minden kihuny, egyetlen táblát kivéve, és megjelenik egy feladat: tedd fel úgy a kérdést, hogy a válaszban egyetlen fölösleges sor és egyetlen fölösleges oszlop se legyen.

Kiválasztjuk a szükséges oszlopokat és sorokat

Mindent a *-on át elkérni kényelmes az első ismerkedéskor, de a valódi munkában ez olyan, mintha az egész raktárt a kasszához hoznád. Általában konkrét mezőkre van szükséged: sorold fel őket vesszővel elválasztva a SELECT után.

A sorokkal ugyanígy: az egész kirakat helyett válaszd ki csak a szükséges szegmenst a WHERE-rel. Kérjük el például a „Kotomarket”-től csak a Könyvek kategória termékeit:

Egy kadét borostyánszínű szűrő-sugárral szűkíti a holografikus kirakatot: a sugáron át csak néhány könyvet tartalmazó kapszula-sor jut át
Pontos kérdés az archívumhoz: a SELECT megnevezi a szükséges oszlopokat, a WHERE csak a szükséges sorokat engedi át.

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:

Milyen könyvek vannak a kirakatban, és mennyibe kerülnek:
Query result
nameprice
SQL для профи1290.00
Чистый код1490.00
Алгоритмы на практике1690.00

Az üzleti kérdésből — a lekérdezésbe

A valódi kérdések nem SQL-ben érkeznek az archivistához: „milyen könyvek olcsóbbak ezerötszáznál?”, „mi olcsóbb az elektronikából 5000-nél?”. A fordítás mindig egyazon útvonalon halad:

  1. Entitás → tábla. Miről szól a kérdés: termékekről, vásárlókról, rendelésekről? Az „1500-nál olcsóbb könyvek” a termékekről szól, tehát FROM products.
  2. Megkötések → WHERE. A kérdés minden feltétele egy-egy külön szűrőfeltétel: a „Könyvek” kategória, az 1500-nál kisebb ár.
  3. Mit mutassunk → SELECT. Mit szeretne látni az ember a válaszban? A nevet és az árat — ezeket soroljuk fel, a többi zaj.
  4. A válasz formája → ORDER BY. Az „olcsótól a drágáig” rendezést jelent ár szerint.
-- „Milyen könyvek olcsóbbak 1500-nál, és mennyibe kerülnek, az olcsótól a drágáig?”
SELECT name, price
FROM products
WHERE category = 'Книги' AND price < 1500
ORDER BY price;

Több feltételt az AND szóval kötünk össze — a szűrőoperátorokat részletesen a következő fejezetben vesszük át.

És a jó archivista fordított szokása: olvasd fel a kész lekérdezést mondatként, hangosan. „A termékekből vedd ki az 1500-nál olcsóbb könyveket, mutasd a nevet és az árat, rendezd ár szerint” — ha az elmondás egyezik az eredeti kérdéssel, a lekérdezés jelentésében helyes. Ha az elmondásban felbukkan az „összes oszlop” vagy az „egész kirakat” — menj vissza, és szűkíts.

Interview question

Interjúkérdés: miért tartják rossz gyakorlatnak a SELECT *-ot az éles lekérdezésekben?

Erős válasz: először is, fölösleges adat: a hálózat és a memória olyan oszlopokra megy el, amelyekre nincs szükség, és az adatbázis elveszti azt a lehetőséget, hogy pusztán index alapján válaszoljon (index-only scan; az indexek a 10. fejezet). Másodszor, törékenység: oszlopok hozzáadásakor vagy átnevezésekor eltörnek a riportok és a kód, amely az oszlopok összetételére és sorrendjére számít. A kifejezett oszloplista a lekérdezés szerződése; a SELECT * legfeljebb interaktív adatfeltárásban helyénvaló.

Check yourself
Mit ad vissza a SELECT name FROM products WHERE category = 'Книги' lekérdezés?

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.