Omet navegació

14. La clàusula HAVING

 

Aquesta clàusula acompanya normalment a la de GROUP BY, i servirà pera poder triar alguns grups que acomplesquen una determinada condició.

Pot anar sense el GROUP BY, però aleshores el seu funcionament és com el WHERE, i per tant no val la pena. És a dir, en la pràctica sempre que trobem un HAVING hi haurà també el GROUP BY i servirà per seleccionar alguns grups, els que acomplesquen la condició del HAVING.

També podríem dir que el HAVING és al GROUP BY, el que el WHERE és al SELECT

 

Sintaxi

SELECT <columnes>
FROM <taules>
[GROUP BY <columnes>]
HAVING <condició>

 

Únicament comentarem el cas en què acompanya al GROUP BY. I com hem dit, el que fa és filtrar els grups: dels grups resultants del GROUP BY, només eixiran els que acomplesquen la condició.

Aquesta condició contindrà alguna funció d'agregat o contindrà columnes incloses en el GROUP BY. Fixeu-vos que és lògic, ja que serveix per a triar grups una vegada fets, i aleshores ja no es podrà anar a un element del grup.

Per exemple, aquesta sentència servirà per traure les comarques on hi ha més de 20 pobles, i el número que hi ha:

SELECT nom_c, COUNT(*)
FROM POBLACIONS
GROUP BY nom_c
HAVING COUNT(*) > 20;

 

Exemples

  1. Traure aquelles poblacions que tenen més d'un de Centres Integrats de Formació Professional. La manera de saber que és un Centre Integrat és perquè el seu nom comença per CIPFP. De moment només traurem el codi de la població, i així només ens fa falta la taula INSTITUTS. Més avant aprendrem a agafar les dades de més d'una taula, i aleshores traurem també el nom de la població

SELECT cod_m, COUNT(*)
FROM INSTITUTS
WHERE nom LIKE 'CIPFP%'
GROUP BY cod_m
HAVING COUNT(*) > 1

El que fem en aquesta sentència és, de la taula INSTITUTS seleccionar únicament els Centres Integrats (utilitzant l'operador LIKE per a que comencen per CIPFP)i i després agrupar pel codi de municipi. Una vegada fets els grups, eliminarem els grups que no acompleixen la condició de HAVING, és a dir, els que tenen 0 o 1 Centre Integrat. I d'aquestos grups seleccionats traurem el codi del municipi i el número de Centres Integrats (que sempre serà igual o major que 2).

  1. Calcular el número d'habitants màxim, el mínim i el número d'habitants mitjà de les poblacions de les comarques amb més de 20 pobles.

SELECT nom_c , COUNT(cod_m) AS "Número de pobles" , Max(poblacio) AS Màxim , Min(poblacio) AS Mínim , Avg(poblacio) AS Mitjana
FROM POBLACIONS
GROUP BY nom_c
HAVING COUNT(cod_m) > 20;

 

  1. Traure l'altura mitjana, total de població i població mitjana, d'aquelles comarques que tenen una altura mitjana superior a 800 metres.

SELECT nom_c , AVG(altura) AS "Altura mitjana" , SUM(poblacio) AS "Total població" , Avg(poblacio) AS "Població mitjana"
FROM POBLACIONS
GROUP BY nom_c
HAVING AVG(altura) > 800;