
- •Информационное обеспечение систем управления Построение запросов при работе с базой данных (Учебное пособие)
- •Тестовая база данных
- •Выборка данных. Команда select
- •Синтаксис оператора select
- •Простые варианты поиска данных
- •Упорядочение результата запроса. Предложение order by
- •Использование ключевого слова distinct
- •Предложение where
- •Синтаксис предложения where
- •Использование операторов сравнения
- •Использование варианта between
- •Проверка на присутствие в списке значений (вариант in)
- •Проверка на пустое значение
- •Поиск в строковых столбцах
- •Вариант like
- •Использование логических операций в условиях поиска
- •Порядок выполнения логических операций
- •Преобразование данных при выборке
- •Обобщение Данных с помощью Агрегатных Функций
- •Использование distinct с count
- •Предложение group by
- •Предложение having
- •Соединение таблиц
- •Внутренние соединения (связывание по равенству)
- •Внешние соединения
- •Левое внешнее соединение
- •Правое внешнее соединение
- •Полное внешнее соединение
- •Более сложные примеры соединений
- •Рефлексивное соединение, или самосоединение
- •Использование подзапросов в операторах sql
- •Выбор одного
- •Использование в подзапросе агрегатных функций
- •Связанные подзапросы
- •Использование оператора exists
- •Использование варианта in с подзапросами
- •Использование not exists
- •Объединение запросов
- •Команда union
- •Добавление данных. Команда insert
- •Добавление отдельной строки
- •Добавление группы строк
- •Обновление уже имеющихся данных. Команда update
- •Удаление данных из таблиц. Команда delete
- •Генераторы и их использование
- •Создание генераторов
- •Использование генераторов
- •Увеличение значения генератора
- •Получение значения генератора в приложение
- •Триггер
Предложение 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 (в нашем случае — по количеству строк в группе).