Cum funcționează
Este cea mai grea problemă din categorie, pentru că cerința c) nu se poate rezolva cu o interogare
simplă. Structura de bază e cea de la tabelul Carti.
c) Problema: „afişează data la care apare minimul"
Prima tentație e să scrii:
SELECT Data, MIN(Temp_min) FROM Date_meteo WHERE ID_Judet = 'BV'; -- GRESIT
Nu funcționează. MIN comprimă toate rândurile într-unul singur, dar Data are o valoare
diferită pe fiecare rând — care ar trebui afişată? Unele baze de date dau eroare, altele aleg o dată
la întâmplare, ceea ce e mai periculos: primeşti un rezultat care pare corect.
Soluția e o subinterogare: întâi afli care e minimul, apoi cauți rândul care îl conține.
WHERE ID_Judet = 'BV'
AND Temp_min = (SELECT MIN(Temp_min) FROM Date_meteo WHERE ID_Judet = 'BV')
Interogarea din paranteze se execută prima și returnează o singură valoare — aici 7. Apoi
interogarea exterioară devine, practic:
WHERE ID_Judet = 'BV' AND Temp_min = 7
Rezultat: 2011-05-08.
Atenție la filtrul ID_Judet = 'BV' din interiorul subinterogării. Fără el s-ar calcula minimul
pe toată țara (tot 7, din întâmplare, în datele astea), iar la alte date rezultatul ar fi greşit.
Condiția trebuie să apară în ambele locuri.
Alternativă mai scurtă, acceptată de obicei:
SELECT Data FROM Date_meteo WHERE ID_Judet = 'BV' ORDER BY Temp_min ASC LIMIT 1;
Sortezi crescător şi iei primul rând. E mai simplu, dar afişează un singur rând chiar dacă
minimul apare de mai multe ori — subinterogarea le afişează pe toate. În Access, LIMIT 1 se
scrie SELECT TOP 1.
d) Media pe un interval de timp
WHERE Data BETWEEN '2011-05-01' AND '2011-05-31'
BETWEEN e forma scurtă pentru Data >= '2011-05-01' AND Data <= '2011-05-31'. Capetele
sunt incluse.
„Din România" nu adaugă niciun filtru — tabelul conține doar date din România, deci e context, nu
cerință. Citeşte cu atenție ce e informație şi ce e condiție.
Media se calculează pe cele trei înregistrări din mai 2011: (27 + 23 + 19) / 3 = 23.
Aici AVG se foloseşte fără GROUP BY, deci calculează pe tot ce a rămas după WHERE — un
singur număr. Comparativ, la tabelul Filme AVG se aplică pe
grupuri, dând câte un rând pentru fiecare gen.
Greșeli frecvente
SELECT Data, MIN(Temp_min) fără subinterogare — data afişată nu corespunde minimului.
- Filtrul lipsă din subinterogare — se calculează minimul pe tot tabelul, nu pe judeţul cerut.
- Confuzia
Temp_min / Temp_max — cerința c) cere minima, d) media maximelor.
- Adăugarea unui filtru pentru „România" — nu există o astfel de coloană.
BETWEEN cu capetele inversate — BETWEEN '2011-05-31' AND '2011-05-01' nu returnează nimic.
- Luna scrisă ca
'mai' — datele se compară în format AAAA-LL-ZZ.