Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

Фильтрация результатов SQL по COUNT(*): решение и примеры

Быстрый ответ

Для фильтрации групп записей по количеству используйте HAVING после GROUP BY. Это позволяет отсеивать группированные результаты, которые соответствуют условию функции COUNT.

SQL
Скопировать код
SELECT id, COUNT(*)
FROM orders
GROUP BY id
HAVING COUNT(*) > 10;

Этот запрос вернёт id, в которых количество связанных записей в таблице orders превышает 10.

Кинга Идем в IT: пошаговый план для смены профессии

Максимизация преимуществ использования HAVING

Для эффективного использования HAVING необходимо знать разницу между ним и WHERE. WHERE применяется для фильтрации до группировки, в то время как HAVING отфильтровывает уже сгруппированные данные и необходим при использовании агрегатных функций, таких как COUNT, SUM, AVG и других.

Как применить HAVING:

  1. GROUP BY Column_Name – группирует данные.
  2. COUNT(*) – подсчитывает записи в каждой группе.
  3. HAVING Condition – применяет фильтр к группированным результатам согласно заданному условию.
Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Лучшие практики:

  • Убедитесь, что столбцы в блоке GROUP BY соответствуют столбцам в SELECT.
  • Избегайте использования SELECT * в комбинации с GROUP BY, это ускорит выполнение запроса и предотвратит отбор ненужных данных.
  • Точность и четкость в формулировке SQL-запросов существенны для удобства последующего масштабирования и поддержки.

Избегайте типичных ошибок

Помните о необходимости group by

Соответствие в выборе столбцов важно:

  • Все столбцы, указанные в SELECT и не являющиеся агрегатными, должны быть включены в GROUP BY.
  • Несоответствие может привести к ошибкам или некорректным результатам.

Правильное размещение предложения having

Последовательность действий имеет значение:

  • WHERE отфильтровывает строки до группировки.
  • GROUP BY группирует отфильтрованные записи.
  • HAVING применяется к сгруппированным результатам.
  • Нарушение этой последовательности может вызвать ошибки или неожиданные результаты.

Визуализация

Рассмотрим аналогию со стендами на рынке (🍇🍈🍉). Вам больше нравятся стенды с широким ассортиментом фруктов.

Markdown
Скопировать код
Каждый стенд:      🍎🍌🍇🍓🥝...
Ваш фильтр:         COUNT(*) 📈
Критерий:         🍇🍈🍉🥝 (4 Вида)

Выбор стендов по ассортименту:

SQL
Скопировать код
SELECT Stall
FROM Market
GROUP BY Stall
HAVING COUNT(DISTINCT Fruit) >= 4;

Вы получите список стендов с минимум четырьмя различными видами фруктов.

Markdown
Скопировать код
Подходящие стенды: [🍇🍈🍉🥝🍊], [🍌🍎🥭🍐🍑], но не [🍎🍎]

Выбор лучшего стенда

Использование HAVING подобно поиску лучшего предложения на рынке:

  • Игнорируйте стенды, которые не соответствуют вашим критериям.
  • Обратите внимание на те, что предлагают богатый выбор.

Корректировки для разных СУБД

Учтите различия в SQL-синтаксисе для таких СУБД, как MySQL, PostgreSQL и SQL Server.

Особенности различных СУБД:

  • Разные СУБД могут иметь свои уникальные агрегатные функции или методы оптимизации запросов.
  • Базовые правила применения GROUP BY и HAVING одинаковы, но изучите особенности каждой СУБД, чтобы использовать лучшие практики.

Когда лучше не использовать COUNT(*) для фильтрации

Важно знать, когда следует отказаться от использования COUNT(*):

  • Если критерии фильтрации основаны на других агрегатных функциях, таких как SUM или AVG.
  • Если группировка не требуется, в таком случае лучше использовать WHERE.
  • Если приоритетна производительность и существуют более эффективные альтернативы.

Полезные материалы

  1. Функции SQL COUNT(), AVG() и SUM() — основы работы с функцией COUNT и другими агрегатными функциями.
  2. sql – Почему MySQL позволяет запросы с "group by" без агрегатных функций? – Stack Overflow — обсуждение на StackOverflow на тему HAVING против WHERE.
  3. MySQL :: MySQL 8.0 Reference Manual :: 5.3.4.8 Counting Rows — официальная документация MySQL по функции COUNT().
  4. SELECT — объяснение взаимодействия Group By и Having Clauses от Oracle.
  5. Запросы к DMV sys.dm_os_wait_stats в SQL Server — анализ производительности применения HAVING в SQL Server.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой оператор используется для фильтрации сгруппированных результатов в SQL?
1 / 5