Cum funcționează
a) Singurul UPDATE care se scrie corect fără WHERE
Regula pe care o repetă toți profesorii — UPDATE fără WHERE modifică tot tabelul — e aici
exact ce se cere: „salariul fiecărui angajat". Așa că lipsa lui WHERE e intenționată, nu o
scăpare. Merită scris în comentariu, ca să se vadă că nu ai uitat-o.
Partea care se înțelege greșit e SET salariul = salariul + 100. Nu e o ecuație (care n-ar avea
soluție), e o atribuire: citește valoarea actuală a coloanei, adună 100, scrie rezultatul la
loc. Se întâmplă separat pe fiecare rând, deci fiecare angajat primește exact +100 față de salariul
lui.
Mărirea cu o sumă fixă e mai simplă decât mărirea procentuală, care apare la
problema #139 — acolo + 100 devine * 1.1.
b) „Cel mai recent” = MAX pe o dată
MAX pe o coloană de tip dată întoarce data cea mai nouă, nu cea mai mare ca text. De aceea
contează că data_infiintare e declarată date: dacă ar fi fost text, '09.12.2020' s-ar compara
alfabetic cu '11.01.2012' și ai obține răspunsul greșit.
Structura e simetrică celei de la
problema #121 — acolo MIN (primul înființat), aici
MAX (ultimul). Pe datele de test, departamentul cel mai nou e IT (2021), cu un singur angajat.
Atenție la un caz care se ratează: departamentul cel mai nou poate să nu aibă încă angajați.
Atunci răspunsul corect e „niciun rând", nu o eroare — și nu e cazul să modifici interogarea până
„iese ceva".
Greșeli frecvente
SET salariul = 100 — nu mărește, înlocuiește. Toate salariile devin 100 și datele
originale sunt pierdute definitiv. Cea mai scumpă greșeală din tot subiectul.
UPDATE Angajati SET salariul = salariul + 100 WHERE ida = 1 — un WHERE „de siguranță",
adăugat din reflex, mărește salariul unui singur angajat.
ORDER BY data_infiintare DESC și se ia primul rând — vezi
problema #121: dacă două departamente au aceeași
dată, pierzi jumătate din răspuns.
WHERE d.data_infiintare = MAX(d.data_infiintare) — agregarea nu se poate folosi direct în
WHERE; îi trebuie subinterogare.
- Ordinea cerințelor inversată — dacă rulezi b) înainte de a), rezultatul afișat e cel de
dinainte de mărire. Aici nu contează (nu se afișează salariul), dar la
problema #139 contează foarte mult.