Точно так же, как предложение WHERE используется для отбора отдельных строк, участвующих в запросе, предложение HAVING можно применить для отбора групп строк. Например, ранее рассмотренный запрос для определения среднедушевого дохода жителей каждой квартиры можно модифицировать с помощью предложения HAVING, чтобы получить информацию только о квартирах, в которых проживает более одного человека:
SELECT ADR, AVG (SUMD) FROM PERSON.
GROUP BY ADR.
HAVING C0UNT (*)>1.
Запрос выполняется в такой последовательности. Вначале предложение GROUP BY разделяет жителей на группы по адресам. После этого предложение HAVING исключает все группы, в которых количество строк равно единице. И наконец, предложение SELECT вычисляет среднедушевой доход для каждой из оставшихся групп и генерирует таблицу результатов запроса.
Ограничения на условия поиска групп
Условие поиска, используемое в предложении HAVING, применяется не к отдельным строкам, а к группе в целом. Это значит, что в условие поиска может входить:
- 1) константа;
- 2) агрегатная функция, возвращающая одно значение для всех строк, входящих в группу;
- 3) столбец группировки, который, по определению, имеет одно и то же значение во всех строках группы;
- 4) выражение, включающее в себя перечисленные выше элементы.
На практике условие поиска в предложении HAVING всегда должно включать в себя как минимум одну агрегатную функцию. Если это не гак, то условие поиска можно переместить в предложение WHERE. Чтобы определить, где следует указать условие поиска, необходимо помнить, как применяются эти предложения:
- 1) предложение WHERE применяется к отдельным строкам, поэтому выражения, содержащиеся в нем, должны вычисляться для отдельных строк;
- 2) предложение HAVING применяется к группам строк, поэтому выражения, содержащиеся в нем, должны вычисляться для групп строк.