Въведение в клаузата за 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
Клиентски номер | Потребителско име | град | Страна |
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