Фильтрующие группы, 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

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

Bitrix получить список установленных модулей

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

CSS магия: стилизации элементов на основе нумерации

В статье как с помощью CSS добавить стили для каждого второго, третьего, четвертого элемента и т.д., для четных и нечетных элементов.

Битрикс пропали статусы веб-форм

В статье описана новая настройка модуля веб-форм которая скрывает вкладки Статусы и Поля со страницы редактирования веб-формы

Что нового в PHP 8.3?

Обзор новых возможностей PHP 8.3.

Обзор google keep

Google Keep — универсального инструмента для создания и организации заметок. В статье рассмотрены основные возможности сервиса.

Комментарии

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