Veure vídeo
Així com la clàusula “WHERE” permet seleccionar (o rebutjar) registres individuals; la clàusula “having” permet seleccionar (o rebutjar) un grup de registres.
Si volem saber la quantitat de llibres agrupats per editorial fem servir la següent instrucció ja apresa:
select editorial, count(*) from libros group by editorial;
Si volem saber la quantitat de llibres agrupats per editorial però considerant només alguns grups, per exemple, els que tornin un valor major a 2, fem servir la següent instrucció:
select editorial, count(*) from libros group by editorial having count(*)>2;
s’utilitza “having”, seguit de la condició de recerca, per seleccionar certes files retornades per la clàusula “group by”.
Vegem altres exemples. Volem la mitjana dels preus agrupats per editorial, però només d’aquells grups amb una mitjana superi els 25 pesos:
select editorial, avg(precio) from libros group by editorial having avg(precio)>25;
En alguns casos és possible confondre les clàusules ” WHERE “i” having “. Volem comptar els registres agrupats per editorial sense tenir en compte a l’editorial “Planeta”.
Analitzem les següents sentències:
select editorial, count(*) from libros where editorial'Planeta' group by editorial; select editorial, count(*) from libros group by editorial having editorial'Planeta';
Les dues tornen el mateix resultat, però són diferents. La primera, selecciona tots els registres rebutjant els d’editorial “Planeta” i després els agrupa per comptar-los. La segona, selecciona tots els registres, els agrupa per explicar-los i finalment rebutja fila amb el compte corresponent a l’editorial “Planeta”.
No hem de confondre la clàusula “WHERE” amb la clàusula “having”; la primera estableix condicions per a la selecció de registres d’un “select”; la segona estableix condicions per a la selecció de registres d’una sortida “group by”.
Vegem altres exemples combinant “WHERE” i “having”. Volem la quantitat de llibres, sense considerar els que tenen preu nul, agrupats per editorial, sense considerar l’editorial “Planeta”:
select editorial, count(*) from libros where precio is not null group by editorial having editorial'Planeta';
Aquí, selecciona els registres rebutjant els que no compleixin amb la condició donada en “WHERE”, després els agrupa per “editorial” i finalment rebutja els grups que no compleixin amb la condició donada en el “having”.
Es fa servir la clàusula “having” amb funcions de grup, això no pot fer-ho la clàusula “WHERE”. Per exemple volem la mitjana dels preus agrupats per editorial, d’aquelles editorials que tenen més de 2 llibres:
select editorial, avg(precio) from libros group by editorial having count(*) > 2;
En una clàusula “having” pot haver-hi diverses condicions. Quan utilitzeu diverses condicions, ha de combinar-les amb operadors lògics (and, or, not).
Podem trobar el major valor dels llibres agrupats i ordenats per editorial i seleccionar les files que tinguin un valor menor a 100 i major a 30:
select editorial, max(precio) as mayor from libros group by editorial having min(precio)30 order by editorial;
Llavors, fem servir la clàusula “having” per a restringir les files que retorna una sortida “group by”. Va sempre després de la clàusula “group by” i abans de la clàusula “order by” si n’hi ha.