Știți clauza WHERE. Aceasta definește ce rânduri ale unui tabel vor face parte din setul de rezultate. Clauza HAVING are aceeași semnificație la nivel de grup. Acesta determină ce grupuri vor face parte din setul de rezultate.
-- HAVING completează GROUP BY
SELECT ...
FROM ...
GROUP BY <columnname>
HAVING <having clause>; -- specificați un criteriu care poate fi aplicat grupurilor
Preluăm exclusiv familii cu mai mult de 1 membru:
SELECT lastname
FROM person
GROUP BY lastname -- gruparea peste nume de familie
HAVING count(*) > 1; -- mai mult de o persoană în cadrul grupului
Toate familiile cu un membru nu mai fac parte din rezultat.
Într-un al doilea exemplu, ne concentrăm pe astfel de grupuri care îndeplinesc un criteriu privind coloana firstname. Luați în considerare că firstname nu este coloana de grupare.
-- Grupuri care conțin o persoană al cărei prenume are mai mult de 4 caractere: 5 rânduri rezultate
SELECT lastname
FROM person
GROUP BY lastname
HAVING max(length(firstname)) > 4; -- max() returnează valoarea ONE (cea mai mare) pentru toate rândurile fiecărui grup 'lastname'
Rezultatul arată cele cinci familii Baker, de Winter, Goldstein, Rich și Stefanos (dar nu rândul(rândurile) cu firstname lung).
Vă rugăm să rețineți că acest rezultat este foarte diferit de interogarea similară pentru persoanele al căror prenume are mai mult de patru caractere:
-- Persoane al căror prenume are mai mult de patru caractere: șase rânduri rezultate!!
SELECT lastname, firstname
FROM person
WHERE length(firstname) > 4;
-- fără GROUP BY și fără HAVING. WHERE nu este un înlocuitor echivalent pentru HAVING!!
De unde vine rândul suplimentar? În familia de Winter, există două persoane cu un prenume mai lung de patru caractere: James și Victor. Pentru că în comanda fără GROUP BY selectăm pentru persoane și nu pentru familii, ambele rânduri sunt afișate individual.
Pe scurt, putem spune că clauza HAVING decide care grupuri fac parte din setul de rezultate și care nu.
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns