PostgreSQL - Clausola HAVING
La clausola HAVING ci consente di selezionare righe particolari in cui il risultato della funzione soddisfa una certa condizione.
La clausola WHERE pone condizioni sulle colonne selezionate, mentre la clausola HAVING pone condizioni sui gruppi creati dalla clausola GROUP BY.
Sintassi
Di seguito è riportata la posizione della clausola HAVING in una query SELECT:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
La clausola HAVING deve seguire la clausola GROUP BY in una query e deve anche precedere la clausola ORDER BY, se utilizzata. Quanto segue è la sintassi dell'istruzione SELECT, inclusa la clausola HAVING:
SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2
Esempio
Considera che la tabella AZIENDA ha i record come segue:
# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
Il seguente è un esempio, che visualizzerebbe un record per il quale il conteggio dei nomi è inferiore a 2 -
testdb-# SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) < 2;
Ciò produrrebbe il seguente risultato:
name
-------
Teddy
Paul
Mark
David
Allen
Kim
James
(7 rows)
Ora, creiamo altri tre record nella tabella COMPANY utilizzando le seguenti istruzioni INSERT:
INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00);
INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00);
INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);
Ora, la nostra tabella ha i seguenti record con nomi duplicati:
id | name | age | address | salary
----+-------+-----+--------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
8 | Paul | 24 | Houston | 20000
9 | James | 44 | Norway | 5000
10 | James | 45 | Texas | 5000
(10 rows)
Il seguente è l'esempio, che visualizzerebbe il record per il quale il conteggio dei nomi è maggiore di 1 -
testdb-# SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) > 1;
Ciò produrrebbe il seguente risultato:
name
-------
Paul
James
(2 rows)