Cum funcționează
a) > sau >= — pragul se citește din enunț
„Mai mare de 4000" înseamnă strict mai mare: un angajat cu salariul exact 4000 nu intră. Dacă
enunțul ar fi spus „de cel puțin 4000" sau „începând de la 4000", ar fi fost >=.
Subiectele conțin aproape întotdeauna o valoare aflată exact pe prag, special ca să se vadă dacă ai
citit atent. Un semn greșit aici înseamnă un rând în plus sau în minus, fără nicio eroare.
| Formulare din enunț |
Operator |
| „mai mare de 4000" |
> 4000 |
| „de cel puțin 4000", „minim 4000" |
>= 4000 |
| „între 3000 și 4000" |
BETWEEN 3000 AND 4000 (inclusiv ambele capete) |
| „diferit de 4000" |
<> 4000 (sau != 4000) |
Cerința b) e exact motivul pentru care există două tabele. Angajati nu conține denumirea
departamentului, ci doar codul lui (D01) — dacă ar conține și denumirea, aceasta s-ar repeta pe
fiecare rând, iar o redenumire ar cere modificarea tuturor angajaților. Denumirea stă o singură dată,
în Departamente, și se aduce la nevoie prin idd.
Angajati Departamente
nume idd idd denumire
Popescu D01 ─────────────────► D01 Comercial
Georgescu D02 ─────────────────► D02 Financiar
AS departament redenumește coloana în rezultat — altfel capul de tabel ar scrie denumire, ceea ce
nu spune nimic despre ce înseamnă. ORDER BY nu era cerut; e adăugat pentru că o listă de 10
angajați grupată pe departamente se citește mult mai bine.
Explicația detaliată a joncțiunii, cu varianta ei scrisă cu virgulă, e la
problema #121.
Greșeli frecvente
>= în loc de > — intră și angajatul cu salariul exact 4000. Un rând în plus, zero erori.
WHERE salariul > '4000' — se compară un număr cu un șir. Oracle convertește implicit și
merge; într-un câmp declarat text ar compara alfabetic și '900' > '4000' ar fi adevărat.
- Joncțiune fără condiția
ON — produs cartezian: 10 angajați × 5 departamente = 50 de rânduri.
SELECT a.nume, a.prenume, a.idd — afișează codul D01, nu denumirea cerută. Cerința spune
„departamentul", adică numele lui.
- Aliasuri amestecate —
FROM Angajati a INNER JOIN Departamente d ON Angajati.idd = d.idd: în
Oracle, odată ce ai dat un alias, numele complet al tabelului nu mai poate fi folosit.
LEFT JOIN aici — n-ar strica nimic, dar ar arăta și angajații fără departament. Când toți au
unul, INNER JOIN spune mai clar ce vrei. Invers la
problema #128, unde LEFT JOIN e
obligatoriu.