Cum funcționează
a) COUNT(*) numără rânduri
COUNT(*) întoarce un singur rând, cu un singur număr: câte înregistrări are tabelul. Nu are
nevoie de nicio coloană, pentru că nu se uită la valori — numără rânduri.
AS nr_angajati dă un nume coloanei din rezultat. Nu e obligatoriu, dar un cap de tabel scris
COUNT(*) arată neterminat.
Diferența care se punctează:
| Scris |
Ce numără |
COUNT(*) |
toate rândurile |
COUNT(nr_telefon) |
doar rândurile în care nr_telefon nu e NULL |
COUNT(DISTINCT idd) |
câte valori diferite de idd există |
Pe un tabel fără valori lipsă, toate trei par identice. La examen, tabelul are aproape întotdeauna
un câmp necompletat, exact ca să se vadă diferența.
b) Filtrare după o valoare din celălalt tabel
Numele departamentului („Comercial") e în Departamente, dar angajații sunt în Angajati. Deci:
joncțiune pe idd, apoi WHERE pe coloana din tabelul lipit. Mecanismul e explicat pe larg la
problema #121.
Ordinea în care le scrie serverul: lipește rândurile, apoi păstrează doar cele care trec de WHERE.
Rezultatul e același indiferent dacă pui condiția în ON sau în WHERE — la INNER JOIN.
Atenție la textul comparat. 'Comercial' trebuie scris exact ca în tabel: cu C mare, fără
spațiu în plus. În Oracle comparația de șiruri e sensibilă la literă mare/mică, deci
'comercial' nu găsește nimic — și nu dă nici eroare, doar zero rânduri. Access și SQL Server sunt,
implicit, insensibile. Dacă nu ești sigur, WHERE UPPER(d.denumire) = 'COMERCIAL' merge oriunde.
Greșeli frecvente
SELECT COUNT(nume) în loc de COUNT(*) — dacă un angajat are numele necompletat, nu e
numărat. Rezultatul e mai mic, fără niciun semn de eroare.
WHERE idd = 'Comercial' — idd e codul (D01), nu denumirea. Zero rânduri.
- Filtrare fără joncțiune — „Comercial" nu există în
Angajati, deci fără INNER JOIN nu ai pe
ce să pui condiția.
COUNT(*) amestecat cu alte coloane — SELECT nume, COUNT(*) FROM Angajati nu are sens: un
singur număr nu poate sta lângă zece nume. Vezi
problema #128 pentru cazul în care chiar
vrei un număr pe fiecare grup.
- Diacritice sau literă mică în șirul comparat — zero rânduri, fără mesaj de eroare.