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.