Bazele de date, fără mistere

Prima interogare utilă

21 min
What you'll learn
  • să scrii interogări cu o listă explicită de coloane după SELECT și cu un filtru de rânduri prin WHERE
  • să traduci o întrebare de business în SQL pe ruta: entitate → FROM, restricții → WHERE (cu AND), afișare → SELECT, ordine → ORDER BY
  • să explici de ce SELECT * este o practică proastă în interogările de producție
  • să verifici sensul unei interogări spunând-o cu voce tare: dacă formularea coincide cu întrebarea inițială, interogarea e corectă ca sens

Harta e studiată, iar QUERY schimbă regulile. Până acum ai privit arhiva în întregime, ca un vizitator; arhivarul lucrează altfel. Pe holopanou se stinge totul în afară de un tabel și apare o sarcină: pune întrebarea astfel încât în răspuns să nu existe niciun rând în plus și nicio coloană în plus.

Alegem coloanele și rândurile de care avem nevoie

Să iei totul prin * e comod la prima explorare, dar în munca reală e ca și cum ai aduce la tejghea tot depozitul. De obicei ai nevoie de anumite câmpuri: enumeră-le după SELECT, despărțite prin virgulă.

La fel stau lucrurile și cu rândurile: în loc să iei tot raftul, alege doar segmentul de care ai nevoie prin WHERE. De exemplu, să cerem din „Kotomarket” doar produsele din categoria Cărți:

Cadetul îngustează raftul holografic cu un fascicul-filtru chihlimbariu: prin fascicul trec doar câteva rânduri-capsule cu cărți
O întrebare precisă către arhivă: SELECT numește coloanele de care ai nevoie, WHERE lasă să treacă doar rândurile de care ai nevoie.

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:

Ce cărți sunt pe raft și cât costă:
Query result
nameprice
SQL для профи1290.00
Чистый код1490.00
Алгоритмы на практике1690.00

Din întrebarea de business în interogare

Întrebările reale nu ajung la arhivar în SQL: „care cărți sunt mai ieftine de 1500?”, „ce produse din electronice costă peste 5000?”. Traducerea urmează mereu aceeași rută:

  1. Entitate → tabel. Despre ce este întrebarea: despre produse, cumpărători, comenzi? „Cărți mai ieftine de 1500” este despre produse, deci FROM products.
  2. Restricții → WHERE. Fiecare condiție din întrebare devine o condiție separată de filtru: categoria „Cărți”, prețul mai mic de 1500.
  3. Ce să arătăm → SELECT. Ce vrea omul să vadă în răspuns? Denumirea și prețul — pe acestea le enumerăm, restul este zgomot.
  4. Forma răspunsului → ORDER BY. „De la ieftine la scumpe” înseamnă sortare după preț.
-- „Care cărți sunt mai ieftine de 1500 și cât costă, de la ieftine la scumpe?”
SELECT name, price
FROM products
WHERE category = 'Книги' AND price < 1500
ORDER BY price;

Mai multe condiții se unesc cu cuvântul AND — operatorii de filtrare îi vom analiza în detaliu în capitolul următor.

Un alt obicei bun de arhivar: citește interogarea gata făcută cu voce tare, ca pe o frază. „Din produse ia cărțile mai ieftine de 1500, arată denumirea și prețul, sortează după preț” — dacă formularea coincide cu întrebarea inițială, interogarea e corectă ca sens. Dacă a apărut „toate coloanele” sau „tot raftul”, întoarce-te și îngustează.

Interview question

Întrebare de interviu: de ce SELECT * este considerat o practică proastă în interogările de producție?

Răspuns puternic: în primul rând, aduce date inutile: rețeaua și memoria se consumă pe coloane de care nu ai nevoie, iar baza pierde uneori posibilitatea de a răspunde doar din index (index-only scan; indecșii — Capitolul 10). În al doilea rând, este fragil: la adăugarea sau redenumirea coloanelor se pot strica rapoartele și codul care se bazează pe setul și ordinea coloanelor. O listă explicită de coloane este contractul interogării; SELECT * este potrivit cel mult pentru explorarea interactivă a datelor.

Check yourself
Ce va arăta interogarea 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