Cum funcționează
a) UPDATE fără WHERE, cerut de enunț
„Pentru toate filmele" — deci absența lui WHERE e intenționată. E singura situație în care
regula „UPDATE fără WHERE e o catastrofă" nu se aplică; merită totuși un comentariu, ca să se vadă
că n-ai uitat-o.
SET pret_bilet = pret_bilet + 5 citește valoarea actuală a fiecărui rând, adaugă 5, scrie rezultatul
la loc. Se întâmplă separat pe fiecare film, deci fiecare crește cu exact 5.
Mărirea cu o sumă fixă (+ 5) e diferită de mărirea procentuală (* 1.1), cerută la
problema #139. Aceeași cerință în formă fixă
apare și la problema #125.
b) „Deschis cel mai recent” = MAX pe dată
MAX pe o coloană date întoarce data cea mai nouă. Subinterogarea o calculează, iar WHERE compară
cu ea. Pe datele de test, cinematograful cel mai nou e Grand Cinema (2019), cu un singur film.
De ce nu ORDER BY data_deschidere DESC + primul rând: dacă două cinematografe s-au deschis în
aceeași zi, cerința le vrea pe amândouă. Tiparul complet e explicat la
problema #127, iar varianta cu
MIN (primul deschis) la problema #121.
Contează că data_deschidere e declarată date: dacă ar fi fost text, MAX ar compara alfabetic și
'09.05.2007' ar ieși „mai mare" decât '27.09.2019'.
Greșeli frecvente
SET pret_bilet = 5 — toate biletele devin 5 lei. Datele originale sunt pierdute.
UPDATE cu un WHERE adăugat din reflex — se mărește prețul unui singur film.
WHERE c.data_deschidere = MAX(c.data_deschidere) — agregările nu se pot folosi direct în
WHERE. Îi trebuie subinterogare.
MIN în loc de MAX — „cel mai recent" e data cea mai mare. Confuzia e ușoară pentru că „primul
deschis" și „cel mai nou" sună la fel de definitiv.
ORDER BY ... DESC + primul rând — pierzi cinematografele deschise în aceeași zi.
- Subinterogare pe tabelul greșit —
(SELECT MAX(data_deschidere) FROM Filme): coloana nu există
acolo.