Group by having by: Изучение SQL: Операторы GROUP BY и HAVING
Фильтрация групп (предложение HAVING)
Об
объекте
Учебные
материалы
Правила
описания синтаксиса команд SQL
Выборка
данных
Сортировка
выбранных данных
Фильтрация
данных (предложение WHERE)
Создание
вычисляемых полей
Агрегирующие
функции
Итоговые
данные (предложение GROUP BY)
Группировка
по нескольким столбцам
Нулевые
значения
Использование
предложения WHERE
Фильтрация
групп (предложение HAVING)
Объединение
таблиц
Подзапросы
Комбинированные
запросы
Вопросы
для самопроверки
Практические
задания
Список
литературы
Приложение
Фильтрация групп (предложение HAVING)
В
дополнение к способности
группировать данные с помощью предложения GROUP BY, SQL также позволяет
осуществлять фильтрацию — указывать, какие группы должны быть
включены в
результат, а какие исключены из него. Задать условия для групп можно с
помощью
предложения HAVING.
В самом общем смысле, предложение
HAVING работает аналогично предложению WHERE, но применяется к группам.
WHERE накладывает
ограничения на строки, a HAVING — на группы. Т.е. сначала
GROUP BY разделяет
строки на наборы (по типу), затем на полученные группы накладываются
условия
предложения HAVING.
Если в списке выбора имеются агрегирующие
функции, предложение WHERE выполняется перед ними, тогда как
предложение HAVING
применяется ко всему запросу в целом, после вычисления значений функций
и
разбиения на группы.
С точки зрения синтаксиса условного
выражения, предложения HAVING и WHERE идентичны, отличие состоит лишь в
том,
что в условии предложения WHERE не могут находиться агрегирующие
функции. Кроме
того, элементы предложения HAVING быть перечислены в списке выбора.
Если в предложении HAVING есть несколько условий, они объединяются с
помощью операторов AND, OR и NOT.
Пример
Вывести список городов, количество
клиентов из которых превышает 50 человек:
SQL:
SELECT region, COUNT(*)
FROM tbl_clients
GROUP BY region
HAVING COUNT(*)>50
Результат:
region | COUNT(*)
|
Los Angeles | 99 |
Seattle | 77 |
« Previous | Next »
исключение строк после группировки GROUP BY
HAVING — исключение строк после группировки GROUP BY
1.
Введение
1.1 Синтаксис SQL запроса
1.2 Получение данных из таблицы
1.3 Вызов функции
1.4 Конкатенация строк
1.5 Арифметические операции
1.6 Исключение дубликатов
2. Отсечение строк и сортировка
2.1 Выражение WHERE
2.2 Логические операторы
2.3 Порядок условий
2.4 Операции сравнения
2.5 BETWEEN
2.6 IN
2.7 Поиск по шаблону
2.8 Обработка NULL значений
2.9 Сортировка
2.10 Ограничение количества строк LIMIT
2.11 Пропуск первых строк результата
3. Соединения
3.1 Соединение двух таблиц
3.2 Псевдонимы таблиц
3.3 Добавляем WHERE
3.4 Несколько условий соединения
3.5 Использование таблицы несколько раз
3.6 Типы соединения
3.
7 RIGHT JOIN
3.8 FULL JOIN
3.9 Декартово произведение
3.10 Синтаксис через WHERE
4. Агрегатные функции
4.1 Агрегатные функции
4.2 NULL значения в агрегатных функциях
4.3 Количество уникальных значений
4.4 Отсутствие строк
4.5 GROUP BY
4.6 Дополнительные столбцы в списке выборки с GROUP BY
4.7 GROUP BY и WHERE
4.8 GROUP BY по нескольким выражениям
4.9 NULL значения в GROUP BY
4.10 HAVING
4.11 ROLLUP
4.12 CUBE
4.13 GROUPING SETS
5. Операции над множествами
5.1 Доступные операции над множествами
5.2 Из какого запроса строка?
5.3 Пересечение строк
5.4 Исключение строк
5.5 Дубликаты строк
5.6 Совпадение типов данных столбцов
5.
7 Сортировка
5.8 Несколько операций
6. Подзапросы
6.1 Подзапрос одиночной строки
6.2 Коррелированный подзапрос
6.3 Подзапрос вернул более одной строки
6.4 Подзапрос не вернул строк
6.5 Попадание в список значений
6.6 Отсутствие в списке значений
6.7 NULL значения в NOT IN
6.8 Проверка существования строки
6.9 Проверка отсутствия строки
7. Строковые функции
7.1 CONCAT — конкатенация строк
7.2 Преобразование регистра букв
7.3 LENGTH — определение длины строки
7.4 Извлечение подстроки
7.5 POSITION — поиск подстроки
7.6 Дополнение до определенной длины
7.7 TRIM — удаление символов с начала и конца строки
7.8 REPLACE — замена подстроки
7.9 TRANSLATE — замена набора символов
8.
!)
8.5 Получение числа из строки
8.6 ROUND — округление числа
8.7 TRUNC — усечение числа
8.8 CEIL — следующее целое число
8.9 FLOOR — предыдущее целое число
8.10 GREATEST — определение большего числа
8.11 LEAST — определение меньшего числа
8.12 ABS — модуль числа
8.13 TO_CHAR — форматирование числа
9. Рекурсивные подзапросы
9.1 Подзапрос во фразе FROM
9.2 Введение в WITH
9.3 Несколько подзапросов в WITH
9.4 Простейший рекурсивный запрос
9.5 Рекурсивный запрос посложнее
9.6 Строим иерархию объектов
9.7 Путь до элемента
9.8 Сортировка (плохая)
9.9 Сортировка (надежная)
9.10 Форматирование иерархии
9.11 Нумерация вложенных списков
9.12 Листовые строки CONNECT_BY_ISLEAF
10. Оконные функции
10.1 Получение номера строки
10.2 Номер строки в рамках группы
10.3 Составляем рейтинг — RANK
10.4 Несколько человек на место — DENSE_RANK
10.5 Разделение на группы — NTILE
10.6 Агрегатные оконные функции
10.7 Обработка NULL значений
10.8 Нарастающий итог SUM + ORDER BY
10.9 Неуникальные значения в нарастающем итоге SUM + ORDER BY
10.10 Собираем строки через разделитель — STRING_AGG
10.11 WITHIN GROUP
- Оглавление
- Агрегатные функции
После выполнения группировки можно исключать строки из результата выполнения запроса. Для этого в SQL
есть предложение HAVING
, предназначение которого аналогично предложению WHERE
, только работает с группами строк.
Так как HAVING
работает с группами строк, то в условиях отсечения используют агрегатные функции вместо значений столбцов (можно использовать выражения из GROUP BY
, но проще и эффективней это сделать в WHERE
).
Например найдем категории товаров, в которых только один товар. Все товары:
SELECT category_id, product_id, name FROM product ORDER BY category_id
Посчитаем количество товаров в каждой категории:
SELECT category_id, count(*) FROM product GROUP BY category_id ORDER BY category_id
Оставим категории, в которых только один продукт:
SELECT category_id, count(*) FROM product GROUP BY category_id HAVING count(*) = 1 ORDER BY category_id
Стоит отметить, что использованные в HAVING
агрегатные функции нет необходимости использовать в списке выборки. Например, выведем только идентификатор категории товаров:
SELECT category_id FROM product GROUP BY category_id HAVING count(*) = 1 ORDER BY category_id
Практическое задание
HAVING
4.