Clause HAVING de PostgreSQL

La clause HAVING nous permet de filtrer les données groupées après le regroupement.

La clause WHERE définit des conditions sur les colonnes sélectionnées, tandis que la clause HAVING définit des conditions sur les groupes créés par la clause GROUP BY.

Syntaxe

Voici la position de la clause HAVING dans une requête SELECT :

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

La clause HAVING doit être placée après la clause GROUP BY et avant la clause ORDER BY. Voici la syntaxe de base de la clause HAVING dans une instruction SELECT :

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

Exemples

Créez la table COMPANY (Télécharger le fichier SQL COMPANY), avec les données comme suit :

exampledb# 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)

L'exemple suivant trouvera les données groupées par la valeur du champ NAME, et un nombre de champsnameinférieur à 2 :

SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) < 2;

Les résultats suivants sont obtenus :

  name
 -------
  Teddy
  Paul
  Mark
  David
  Allen
  Kim
  James
(7 rows)

Ajoutons quelques lignes à la table :

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);

À ce stade, les enregistrements dans la table COMPANY sont les suivants :

 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)

L'exemple suivant trouvera les données groupées par la valeur du champ name, et avec un nombre de name supérieur à 1 :

exampledb-# SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) > 1;

Les résultats sont les suivants :

 name
-------
 Paul
 James
(2 rows)
Autres extensions