Введение в раздел SQL HAVING

Самый основной вопрос, который приходит в голову, - что это за пункт HAVING? Хорошо, предложение HAVING используется для фильтрации результатов запроса SQL с помощью агрегатных функций. Чтобы понять на простом английском языке, он дает команду синтаксического анализатора SQL «Эй, SQL, из нашей таблицы данных о клиентах, приведите названия стран, в которых более 1 миллиона клиентов».

Подождите, это то, что делает пункт WHERE, не так ли? Да, это очень похоже на то, как работает предложение WHERE, но с небольшой разницей. Предложение WHERE не работает с агрегатными функциями.

Теперь, чтобы кратко рассказать о агрегатных функциях, это функции, которые принимают несколько строк в качестве входных данных и дают более значительно обработанный вывод. Вот несколько примеров: Count (), Sum (), Min (), Max (), Avg () и т. Д.

Почему ИМЯ, а не ГДЕ

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

Чтобы ответить на этот вопрос, нам нужно понять, как механизм SQL обрабатывает два предложения. Предложение FROM в каждой команде SQL сообщает механизму, откуда читать строки. Данные хранятся на диске и загружаются в память для обработки. Поскольку строки читаются одна за другой с диска в память, они проверяются на условие WHERE. Строки, которые не соответствуют предложению WHERE, не загружаются в память. Таким образом, предложение WHERE оценивается для каждой строки, так как они обрабатываются механизмом SQL.

Напротив, предложение HAVING вступает в действие только после загрузки строк в память. После загрузки в память агрегатные функции выполняют свои задачи в строках, ИМЕЯ желаемое условие.

Теперь, если бы мы поместили предложение WHERE в агрегатную функцию, такую ​​как avg (), это бы запутало механизм SQL в том, включать ли строку для вычисления среднего или нет. По сути, мы бы дали команду движку не читать строку, поскольку он не прошел критерии avg () в предложении WHERE. Но, эй, чтобы определить, прошел или нет критерий вычисления avg (), строка должна быть считана в память. Состояние тупика.

Синтаксис

SELECT
FROM


ГДЕ - опционально
GROUP BY - группирует строки для применения агрегатной функции
HAVING - агрегатная функция в условии
СОРТИРОВАТЬ ПО ; - определить порядок сортировки, необязательно

Примечание. Предложение GROUP BY требуется вместе с предложением HAVING. Это связано с тем, что в условии «Наличие» нужна группа данных, чтобы применить статистическую функцию и отфильтровать результаты.

Как работает HAVING?

Давайте разберемся, как работает предложение HAVING в SQL.

Предложение HAVING всегда сопровождается предложением GROUP BY. Предложение GROUP BY группирует данные, которые соответствуют определенному критерию. Он имеет три этапа - разделить, применить и объединить. Разделенная фаза делит строки на группы. Фаза применения применяет некоторые агрегатные функции к группам данных. Объединенная фаза дает единый результат, объединяя группы с результатом агрегированной функции.

Теперь, когда группы сформированы, появляется предложение HAVING. Затем предложение HAVING отфильтровывает группы, которые не удовлетворяют данному условию.

SELECT Col_A, avg(Col_B) as Col_B
FROM MyTable
GROUP BY Col_A
HAVING avg(Col_B)>30

Таким образом, в приведенном выше примере мы видим, что таблица сначала разбивается на три группы на основе столбца Col_A. Агрегирующая функция для расчета среднего значения Col_B затем применяется к группам. Это приводит к отдельной строке для каждой группы. Затем строки объединяются и фильтруются на основе условия в предложении HAVING.

пример

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

Пользовательский ИДИмя покупателягородСтрана
1Аня ДамианБерлинГермания
2Денни КокеттМексика Д.Ф.Мексика
3Элеонора КалнанМексика Д.Ф.Мексика
4Альберта ОлбериЛондонВеликобритания
5Латиша НембхардЛулеоШвеция
6Мадален БингMannheimГермания
7Ребека БиглСтрасбургФранция
8Рози ТиппиМадридИспания
9Оди ХанМарсельФранция
10Хильдегард БерроузTsawassenКанада
11Корделл ДютремблЛондонВеликобритания
12Нора РейнаБуэнос айресАргентина
13Урсула ЛафорестМексика Д.Ф.Мексика
14Клоди НилБернШвейцария
15Порция ЙиСан-ПаулуБразилия
16Ангила СегарраЛондонВеликобритания
17Лиз ВекслерAachenГермания
18Нед МендивильНантФранция
19Сара ВидарриЛондонВеликобритания
20Тайна НавинГрацАвстрия
21Пура РэйСан-ПаулуБразилия
22Эрика БярдМадридИспания
23Джимми ЛюкЛилльФранция
24Шейла БайингтонBräckeШвеция
25Кристиана боденMünchenГермания
26Ирина НиттаНантФранция
27Брианна ОллсTorinoИталия
28Нора ПикенLisboaПортугалия
29Мориа СтюартБарселонаИспания
30Иделла ХарриоттСевильяИспания
Номер заказаПользовательский ИДДата заказа
102541411-07-1996
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
10278512-08-1996
10280514-08-1996
102891126-08-1996
102901527-08-1996
10297704-09-1996
103033011-09-1996
10308218-09-1996
103111820-09-1996
10326810-10-1996
103272411-10-1996
103282814-10-1996
10331916-10-1996
103372524-10-1996
10340929-10-1996
103422530-10-1996
103472106-11-1996
103512011-11-1996
103522812-11-1996
10355415-11-1996
10360722-11-1996
10362925-11-1996
103631726-11-1996
103641926-11-1996
10365327-11-1996
103662928-11-1996
103682029-11-1996
103701403-12-1996
103782410-12-1996
103822013-12-1996
10383416-12-1996
10384516-12-1996
103862118-12-1996
103891020-12-1996
103902023-12-1996
103911723-12-1996
103962527-12-1996
104001901-01-1997
104022002-01-1997
104032003-01-1997
104082308-01-1997
104101010-01-1997
104111010-01-1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
104342403-02-1997
104351604-02-1997
10436705-02-1997
104422011-02-1997

Теперь мы хотим знать, клиенты каких стран разместили у нас в общей сложности 5 или более заказов. Это может быть один клиент, размещающий более 5 заказов, или 5 клиентов, размещающих по 1 заказу каждый.

Для этого нам нужно

Шаг 1 : Соедините две таблицы

Шаг 2: Сгруппируйте клиентов по странам

Шаг 3: Подсчитайте количество заказов для каждой группы

Шаг 4. Отфильтруйте результаты по 5 и более заказам.

Давайте сформулируем команду:

SELECT C.Country, COUNT(O.OrderId) as NumberOfOrders -- Step 1, 3
FROM Customers C -- Step 1
INNER JOIN Orders O on C.CustomerID = O.CustomerID -- Step 1
GROUP BY C.Country -- Step 2
HAVING COUNT(O.OrderId) >= 5 -- Step 4
ORDER BY COUNT(O.OrderId) DESC

Вот результаты:

СтранаNumberOfOrders
Австрия10
Франция9
Швеция7
Германия6
Великобритания6

Заключение - пункт SQL HAVING

Таким образом, мы увидели, какова цель предложения HAVING и как он работает. Важно понимать основную работу, иначе вы можете запутаться, почему предложение HAVING не дает желаемых результатов. Продолжайте играть с различными столами, объединениями и комбинациями вместе с предложением HAVING.

Рекомендуемые статьи

Это руководство к предложению SQL HAVING. Здесь мы обсудим работу предложения HAVING в SQL и пример со следующей таблицей клиентов. Вы также можете просмотреть наши другие предлагаемые статьи -

  1. SQL Вставить Запрос
  2. Внешний ключ в SQL
  3. Отличительное ключевое слово в SQL
  4. Представления SQL
  5. 6 лучших примеров запросов внутреннего объединения в Oracle