Cum funcționează
Tiparul canonic e la tabelul Carti. Cerința d) e cea interesantă şi
readuce subinterogarea.
d) Ştergerea rândului cu valoarea maximă
Nu poţi scrie direct DELETE FROM Stocuri WHERE Pret = MAX(Pret) — funcţiile de agregare nu sunt
permise în WHERE. Motivul e logic: WHERE se evaluează rând cu rând, iar MAX are nevoie de tot
tabelul ca să dea un rezultat.
Soluţia e o subinterogare, care se execută prima şi produce o singură valoare:
WHERE Pret = (SELECT MAX(Pret) FROM Stocuri)
Interogarea internă întoarce 29.00, apoi condiţia devine WHERE Pret = 29.00. Se şterge
telecomanda universală.
E acelaşi mecanism ca la tabelul Date_meteo, unde se
căuta data temperaturii minime. Compară şi cu tabelul CursV,
unde se cerea doar valoarea maximă — acolo subinterogarea nu era necesară.
Regula: dacă ai nevoie de rândul care conţine extrema, foloseşti subinterogare; dacă ai
nevoie doar de valoare, MAX simplu ajunge.
Dacă mai multe produse ar avea acelaşi preţ maxim, s-ar şterge toate. E comportamentul corect
pentru cerinţa scrisă.
NULL la produsele nealimentare
Ciorapii şi telecomanda nu au dată de expirare — firesc, nu sunt alimente. Se scrie NULL, nu o
dată inventată şi nu şir gol.
Filtrul de la c) le exclude automat: orice comparaţie cu NULL e nici adevărată, nici falsă, deci
rândul nu trece de WHERE. Detalii la tabelul Clienti.
Rezultat c): Baterii (5.20), apoi Ciocolata 100g (2.79) — descrescător după preţ.
Cantit (N,10.3) — trei zecimale
Cantitatea are trei zecimale pentru că unele produse se vând la kilogram sau litru, unde 1.250 kg
are sens. În datele din enunț toate cantităţile sunt întregi, dar structura permite şi fracţiuni.
Greșeli frecvente
WHERE Pret = MAX(Pret) — funcţiile de agregare nu se pot folosi în WHERE; e nevoie de
subinterogare.
ORDER BY Pret DESC LIMIT 1 cu DELETE — nu e SQL standard; multe baze de date nu acceptă
LIMIT la DELETE.
- Data de expirare inventată pentru produsele nealimentare, în loc de
NULL.
DESC uitat la c).
- Intervalul lunii terminat la
'2015-05-30' — se pierde ultima zi.