Въведение в клаузата за 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Ребека БийгълСтрасбургФранция
8Rosy TippieМадридИспания
9Ауди ХанМарсилияФранция
10Хилдегард БъроузTsawassenКанада
11Cordell DutrembleЛондонВеликобритания
12Нора РейнаБуенос АйресАржентина
13Ursula LaforestMéxico DFМексико
14Клауди НийлБернШвейцария
15Порция ЙеСао ПаулоБразилия
16Ангила СегараЛондонВеликобритания
17Lise WexlerАахенГермания
18Нед МендивилНантФранция
19Сара ВидауриЛондонВеликобритания
20Тайна НавинГрацАвстрия
21Пура РейСао ПаулоБразилия
22Ерика БярдМадридИспания
23Джими ЛюкЛилФранция
24Shayla ByingtonBrackeШвеция
25Кристиана БоденMünchenГермания
26Ирина НитаНантФранция
27Брайана ОлсТориноИталия
28Нора ПикенLisboaПортугалия
29Мория СтюартБарселонаИспания
30Иделла ХариотСевиляИспания
OrderIDКлиентски номерДата на поръчка
102541411/07/1996
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
10278508/12/1996
10280514-08-1996
102891126-08-1996
102901527-08-1996
10297704.09.1996
103033009.11.1996
10308218-09-1996
103111820-09-1996
10326810.10.1996
103272410.11.1996
103282814-10-1996
10331916-10-1996
103372524-10-1996
10340929-10-1996
103422530-10-1996
103472111/06/1996
103512011.11.1996
103522811.12.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
103701412/03/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
104022001.02.1997
104032001.03.1997
10408231.8.1997
104101010.01.1997
104111010.01.1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
104342402.03.1997
10435162.4.1997
10436705.02.1997
104422002/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 и пример със следната таблица от клиенти. Можете да разгледате и другите ни предложени статии -

  1. SQL Insert Query
  2. Външен ключ в SQL
  3. Различна ключова дума в SQL
  4. SQL изгледи
  5. Топ 6 примера за заявки за вътрешно присъединяване в Oracle