Cum funcționează
a) DESC — de la mare la mic
ORDER BY salariul DESC sortează descrescător. Fără DESC, ordinea e crescătoare (ASC e implicit
și de obicei nu se scrie). Cuvântul-cheie se pune după coloana la care se referă, iar la sortarea
pe mai multe coloane fiecare are propria direcție:
ORDER BY salariul DESC, nume ASC -- salarii mari intai; la salariu egal, alfabetic
Adăugarea celui de-al doilea criteriu face rezultatul reproductibil: fără el, doi angajați cu același
salariu pot apărea în orice ordine, diferită de la o rulare la alta. Vezi și
problema #123, varianta
crescătoare.
b) AVG și rotunjirea
AVG(salariul) = suma salariilor împărțită la numărul de rânduri care au valoare. Rândurile cu
NULL nu intră nici la numărător, nici la numitor — deci AVG nu e SUM(x) / COUNT(*) decât dacă
toate valorile sunt completate.
Media a trei salarii din Comercial (4200, 3800, 3600) e 3866.6666..., adică un număr cu zecimale
infinite. ROUND(..., 2) îl taie la două zecimale: 3866.67. Fără ROUND, rezultatul afișat
depinde de setările serverului și poate ocupa o jumătate de coloană.
| Funcție |
Ce face cu 3866.666 |
ROUND(x, 2) |
3866.67 — rotunjire la 2 zecimale |
ROUND(x) |
3867 — rotunjire la întreg |
TRUNC(x, 2) (Oracle) |
3866.66 — taie, nu rotunjește |
Dacă enunțul nu cere un număr fix de zecimale, ROUND(..., 2) e alegerea sigură pentru sume de bani.
Greșeli frecvente
ORDER BY DESC salariul — ordinea e inversă: coloana, apoi DESC.
ORDER BY salariul DESC, nume DESC când voiai nume alfabetic — DESC nu se propagă, dar nici
nu se aplică automat invers. Fiecare coloană își cere direcția.
AVG fără joncțiune — media pe toată firma (3813), nu pe Comercial (3866.67). Ambele arată
credibil.
SUM(salariul) / COUNT(*) în loc de AVG — dă alt rezultat dacă vreun salariu e NULL.
- Rotunjire cu
TRUNC când enunțul cere rotunjire — 3866.66 în loc de 3866.67.
ORDER BY într-o interogare cu agregare — SELECT AVG(...) ... ORDER BY salariul nu are sens:
rezultatul are un singur rând.