Предложение 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)Другие расширения