Предложение HAVING в PostgreSQL

Предложение HAVING позволяет фильтровать сгруппированные данные после группировки.

Предложение WHERE задаёт условия для выбранных столбцов, тогда как предложение HAVING задаёт условия для групп, созданных предложением GROUP BY.

Синтаксис

Ниже показана позиция предложения HAVING в запросе SELECT:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

Предложение HAVING должно располагаться после предложения GROUP BY и перед предложением ORDER BY. Ниже приведён базовый синтаксис предложения HAVING в инструкции SELECT:

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

Примеры

Создайте таблицу COMPANY (Скачать SQL-файл COMPANY), со следующими данными:

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)

В следующем примере будут найдены данные, сгруппированные по значению поля NAME, и количество значений поляnameменьше 2:

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

Получаются следующие результаты:

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

Давайте добавим несколько строк в таблицу:

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

На данный момент записи в таблице 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
   8 | Paul  |  24 | Houston      |  20000
   9 | James |  44 | Norway       |   5000
  10 | James |  45 | Texas        |   5000
(10 rows)

В следующем примере будут найдены данные, сгруппированные по значению поля name, и с количеством значений name больше 1:

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

Результаты следующие:

 name
-------
 Paul
 James
(2 rows)
Другие расширения