Введение в раздел 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
Пользовательский ИД | Имя покупателя | город | Страна |
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 | Иделла Харриотт | Севилья | Испания |
Номер заказа | Пользовательский ИД | Дата заказа |
10254 | 14 | 11-07-1996 |
10258 | 20 | 17-07-1996 |
10259 | 13 | 18-07-1996 |
10263 | 20 | 23-07-1996 |
10264 | 24 | 24-07-1996 |
10265 | 7 | 25-07-1996 |
10267 | 25 | 29-07-1996 |
10278 | 5 | 12-08-1996 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 | 04-09-1996 |
10303 | 30 | 11-09-1996 |
10308 | 2 | 18-09-1996 |
10311 | 18 | 20-09-1996 |
10326 | 8 | 10-10-1996 |
10327 | 24 | 11-10-1996 |
10328 | 28 | 14-10-1996 |
10331 | 9 | 16-10-1996 |
10337 | 25 | 24-10-1996 |
10340 | 9 | 29-10-1996 |
10342 | 25 | 30-10-1996 |
10347 | 21 | 06-11-1996 |
10351 | 20 | 11-11-1996 |
10352 | 28 | 12-11-1996 |
10355 | 4 | 15-11-1996 |
10360 | 7 | 22-11-1996 |
10362 | 9 | 25-11-1996 |
10363 | 17 | 26-11-1996 |
10364 | 19 | 26-11-1996 |
10365 | 3 | 27-11-1996 |
10366 | 29 | 28-11-1996 |
10368 | 20 | 29-11-1996 |
10370 | 14 | 03-12-1996 |
10378 | 24 | 10-12-1996 |
10382 | 20 | 13-12-1996 |
10383 | 4 | 16-12-1996 |
10384 | 5 | 16-12-1996 |
10386 | 21 | 18-12-1996 |
10389 | 10 | 20-12-1996 |
10390 | 20 | 23-12-1996 |
10391 | 17 | 23-12-1996 |
10396 | 25 | 27-12-1996 |
10400 | 19 | 01-01-1997 |
10402 | 20 | 02-01-1997 |
10403 | 20 | 03-01-1997 |
10408 | 23 | 08-01-1997 |
10410 | 10 | 10-01-1997 |
10411 | 10 | 10-01-1997 |
10414 | 21 | 14-01-1997 |
10422 | 27 | 22-01-1997 |
10426 | 29 | 27-01-1997 |
10430 | 20 | 30-01-1997 |
10431 | 10 | 30-01-1997 |
10434 | 24 | 03-02-1997 |
10435 | 16 | 04-02-1997 |
10436 | 7 | 05-02-1997 |
10442 | 20 | 11-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 и пример со следующей таблицей клиентов. Вы также можете просмотреть наши другие предлагаемые статьи -
- SQL Вставить Запрос
- Внешний ключ в SQL
- Отличительное ключевое слово в SQL
- Представления SQL
- 6 лучших примеров запросов внутреннего объединения в Oracle