Фильтрующие группы, Having SQL

В дополнение к способности группировать данные с помощью предложения GROUP BY, SQL также позволяет осуществлять фильтрацию — указывать, какие группы должны быть включены в результат, а какие исключены из него. Например, вам может понадобиться список клиентов, которые сделали хотя бы два заказа. Чтобы получить такие данные, необходим фильтр, относящийся к целой группе, а не к отдельным строкам.

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

Но тогда что можно использовать вместо предложения WHERE? SQL предлагает другое предложение, подходящее для этих целей: предложение HAVING. Предложение HAVING очень похоже на предложение WHERE. И действительно, все типы выражений в предложении WHERE могут быть также использованы с предложением HAVING. Единственная разница состоит в том, что WHERE фильтрует строки, a HAVING — группы.

Пример:

Нужно найти страницы с одинаковыми адресами, как выглядит часть таблицы (таблица test):

idnameurl
1 Главная /
2 Раздел /razdel
3 Новость /news
4 Еще один раздел /razdel

Теперь напишем запрос который выведит нужные записи:

select `url` from `test` group by `url` having count(*)>=2

Данный запрос группирует все записи по полю url и выводит те значения поля url которые встречаются 2 или более раз.

Результат будет:

url
 /razdel

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

Вот как это можно рассматривать: WHERE фильтрует до того, как данные будут сгруппированы, a HAVING фильтрует после того, как данные были сгруппированы. Это— важное различие; строки, которые были выброшены по предложению WHERE, не будут включены в группу, иначе это могло бы изменить вычисляемые значения, которые, в свою очередь, могли бы повлиять на фильтрацию групп в предложении HAVING.

Статья написана на основе главы "Фильтрующие группы" из книги Освой самостоятельно SQL.

Рубрики: SQL

Если есть вопросы, что-то в статье не понятно или нашли ошибку, напишите об этом в комментариях, все комментарии читаются и по возможности материал будет доработан.
Популярные статьи

Использование chatGpt в работе: генерация html

В этой статье мы рассмотрим пару примером генерации html кода с помощью нейросетей, что позволяет ускорить процесс разработки.

Bitrix куда писать AddEventHandler

В статье дается ответ о том куда лучше всего добавить AddEventHandler, чтобы от точно сработал.

Bitrix: как подключить js или css файл?

Чтобы подключить JavaScript и CSS файлы в bitrix сущствуют специальные методы addJs и addCss у класса \Bitrix\Main\Page\Asset. Давайте рассмотрим примеры их использования более подробно.

PHP календарь на месяц

Функция для вывода календаря на заданный месяц и пример её использования.

Полезные материалы по Битрикс

Решили собрать все полезные материалы, которые могут пригодится при работе с Битрикс, в одной статье.

Шпаргалка по PHP

Здесь описаны функции, переменные, конструкции и т.д. которые используются часто. Кое-что легче скопировать и вставить, чем писать каждый раз заново.

Комментарии

Комментариев пока нет
Данный сайт использует файлы cookies. Продолжая просмотр сайта, вы соглашаетесь с использованием файлов cookies.
ОК