Вступ до пункту 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 - сукупна функція в умові
СОРТУВАТИ ПО ; - визначити порядок сортування, необов'язково

Примітка - За допомогою пункту HAVING необхідний пункт GROUP BY. Це пояснюється тим, що для створення пропозиції потрібна група даних, щоб застосувати сукупну функцію та відфільтрувати результати.

Як працює пункт 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.

Приклад

Тепер давайте розглянемо приклад реального світу. Подумайте, у нас є наступна таблиця клієнтів та замовлення, які вони розмістили у нас.

CustomerIDІм'я клієнтаМістоКраїна
1Аня ДаміанБерлінНімеччина
2Денні КокеттMéxico DFМексика
3Елеонора КалнанMéxico DFМексика
4Альберта ОлберіЛондонВеликобританія
5Латиша НемхардLuleåШвеція
6Мадален БінгМангеймНімеччина
7Ребечка БіглСтрасбургФранція
8Рожевий ТіппіМадридІспанія
9Ауді ХанМарсельФранція
10Хільдегард БуроузTsawassenКанада
11Корделл ДатремблЛондонВеликобританія
12Нора РейнаБуенос-АйресАргентина
13Ursula LaforestMéxico DFМексика
14Клоді НілБернШвейцарія
15Порція ЄСан-ПаулуБразилія
16Ангіла СегарраЛондонВеликобританія
17Ліз ВекслерАахенНімеччина
18Нед МендівілНантФранція
19Сара ВідауріЛондонВеликобританія
20Тайна НавінГрацАвстрія
21Пура РейСан-ПаулуБразилія
22Еріка БярдМадридІспанія
23Джиммі ЛюкЛілльФранція
24Шейла БайтінгтонБреккеШвеція
25Крістіана БоденМюнхенНімеччина
26Ірина НіттаНантФранція
27Bryanna AllsТоріноІталія
28Нора ПікенЛісбоаПортугалія
29Морія СтюартБарселонаІспанія
30Іделла ГарріоттСевільяІспанія
OrderIDCustomerIDДата замовлення
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
104022001.01.1997
104032001.01.1997
104082301.01.1997
104101010-01-1997
104111010-01-1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
104342402.02.1997
104351602.02.1997
10436702.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

Висновок - пункт SAV HAVING

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

Рекомендовані статті

Це посібник до пункту SQL HAVING. Тут ми обговорюємо роботу пункту HAVING у SQL та прикладу із наступною таблицею клієнтів. Ви також можете ознайомитися з іншими запропонованими нами статтями -

  1. SQL Insert Query
  2. Іноземний ключ у SQL
  3. Виразне ключове слово в SQL
  4. Перегляди SQL
  5. Топ-6 прикладів запитів внутрішньої приєднання до Oracle