Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие по SQL.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
960 Кб
Скачать

Предложение having

Предположим, что в предыдущем примере, вы хотели бы увидеть только те имена, которые повторяются более двух раз. Вы не сможете использовать агрегатную функцию в предложении WHERE потому что агрегатные функции находятся после того как предложении WHERE уже отработало.

Предложение HAVING определяет критерии используемые чтобы удалять определенные группы из вывода, точно также как предложение WHERE делает это для индивидуальных строк. Для GROUP BY ключевое слово HAVING играет ту же роль, что и WHERE для ORDER BY. Другими словами, WHERE задает условия для значений из выбранных столбцов, а HAVING задает условия для групп, создаваемых с помощью GROUP BY.

Ключевое слово HAVING в операторе SELECT должно следовать за выражением ключевого слова GROUP BY и тоже предшествовать ключевому слову ORDER BY, если последнее используется. Синтаксис:

[GROUP BY <список столбцов> [HAVING <условия поиска>]]

Основным требованием к составу предложения HAVING является то, что имена столбцов в этом предложении обязательно должны присутствовать в списке GROUP BY или быть параметрами агрегатной функции.

При выполнении такого оператора SELECT делается все то же самое, что и при обычном SELECT — выбираются указанные столбцы строк, соответствующие условию в предложении WHERE, вычисляются значения агрегатных функций. После этого выполняется группировка по столбцам, перечисленным в предложении GROUP BY. Затем осуществляется дополнительная "фильтрация" строк на основании условия в предложении HAVING.

Найдем сколько каких имен содержится в нашем списке показывая только те имена, которые повторяются более двух раз:xxx

SELECT COUNT (*) AS "Количество" , PR_NAME2

FROM PERSON

GROUP BY PR_NAME2

HAVING COUNT (*) > 2

ORDER BY 1 DESC , PR_NAME2

Листинг 15. Количество каждого имени в списке людей при условии что это количество превышает 2.

Количество

PR_NAME2

23

Елена

20

Наталья

16

Татьяна

15

Светлана

12

Марина

11

Ирина

11

Оксана

11

Ольга

10

Екатерина

9

Юлия

7

Сергей

6

Александр

6

Анна

5

Алексей

5

Дмитрий

5

Надежда

5

Олег

4

Вера

4

Людмила

4

Мария

3

Владимир

3

Ксения

3

Лариса

3

Максим

Мы получили все те данные, которые нам были нужны.

В процессе обработки запроса система выполняет такие действия.

1. Отбираются те строки, которые соответствуют условию поиска в предложении WHERE, если таковое имеется. В нашем примере это предложение отсутствует.

2. Выбранные строки объединяются в группы на основании значения имени (PR_NAME2).

3. Для каждой группы рассчитываются значения агрегатных функций. При этом для каждой группы создается одна результирующая строка.

4. Полученные в результате строки упорядочиваются в соответствии с предложением ORDER BY (в нашем случае — по количеству строк в группе).