Въведение в клаузата за SQL HAVING
Основният въпрос, който идва в ума, е каква е тази клауза за HAVING? Е, клаузата HAVING се използва за филтриране на резултатите от SQL заявка с агрегирани функции. За да се разбере на обикновен английски език, той командва SQL анализатора „Hey SQL, от таблицата ни с клиентски данни, донесе ми имената на държави, имащи над 1 милион клиенти“.
Чакайте, това прави клаузата КЪДЕ, нали? Да, това е много подобно на това как работи клаузата WHERE, но с малка разлика. Клаузата WHERE не работи с агрегирани функции.
Сега, само за да обобщим малко за съвкупните функции, това са функции, които приемат няколко реда като вход и дават по-значително обработен изход. Няколко примера са Count (), Sum (), Min (), Max (), Avg () etc.
Защо има и не къде?
Виждаме, че клаузите 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 | Дени Кокет | México DF | Мексико |
3 | Елинор Калнан | México DF | Мексико |
4 | Алберта Олбъри | Лондон | Великобритания |
5 | Латиша Немхард | Luleå | Швеция |
6 | Мадален Бинг | Манхайм | Германия |
7 | Ребека Бийгъл | Страсбург | Франция |
8 | Rosy Tippie | Мадрид | Испания |
9 | Ауди Хан | Марсилия | Франция |
10 | Хилдегард Бъроуз | Tsawassen | Канада |
11 | Cordell Dutremble | Лондон | Великобритания |
12 | Нора Рейна | Буенос Айрес | Аржентина |
13 | Ursula Laforest | México DF | Мексико |
14 | Клауди Нийл | Берн | Швейцария |
15 | Порция Йе | Сао Пауло | Бразилия |
16 | Ангила Сегара | Лондон | Великобритания |
17 | Lise Wexler | Аахен | Германия |
18 | Нед Мендивил | Нант | Франция |
19 | Сара Видаури | Лондон | Великобритания |
20 | Тайна Навин | Грац | Австрия |
21 | Пура Рей | Сао Пауло | Бразилия |
22 | Ерика Бярд | Мадрид | Испания |
23 | Джими Люк | Лил | Франция |
24 | Shayla Byington | Bracke | Швеция |
25 | Кристиана Боден | München | Германия |
26 | Ирина Нита | Нант | Франция |
27 | Брайана Олс | Торино | Италия |
28 | Нора Пикен | Lisboa | Португалия |
29 | Мория Стюарт | Барселона | Испания |
30 | Иделла Хариот | Севиля | Испания |
OrderID | Клиентски номер | Дата на поръчка |
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 | 08/12/1996 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 | 04.09.1996 |
10303 | 30 | 09.11.1996 |
10308 | 2 | 18-09-1996 |
10311 | 18 | 20-09-1996 |
10326 | 8 | 10.10.1996 |
10327 | 24 | 10.11.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 | 11/06/1996 |
10351 | 20 | 11.11.1996 |
10352 | 28 | 11.12.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 | 12/03/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 | 01.02.1997 |
10403 | 20 | 01.03.1997 |
10408 | 23 | 1.8.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 | 02.03.1997 |
10435 | 16 | 2.4.1997 |
10436 | 7 | 05.02.1997 |
10442 | 20 | 02/11/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 Insert Query
- Външен ключ в SQL
- Различна ключова дума в SQL
- SQL изгледи
- Топ 6 примера за заявки за вътрешно присъединяване в Oracle