
Вступ до пункту 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
| CustomerID | Ім'я клієнта | Місто | Країна |
| 1 | Аня Даміан | Берлін | Німеччина |
| 2 | Денні Кокетт | México DF | Мексика |
| 3 | Елеонора Калнан | México DF | Мексика |
| 4 | Альберта Олбері | Лондон | Великобританія |
| 5 | Латиша Немхард | Luleå | Швеція |
| 6 | Мадален Бінг | Мангейм | Німеччина |
| 7 | Ребечка Бігл | Страсбург | Франція |
| 8 | Рожевий Тіппі | Мадрид | Іспанія |
| 9 | Ауді Хан | Марсель | Франція |
| 10 | Хільдегард Буроуз | Tsawassen | Канада |
| 11 | Корделл Датрембл | Лондон | Великобританія |
| 12 | Нора Рейна | Буенос-Айрес | Аргентина |
| 13 | Ursula Laforest | México DF | Мексика |
| 14 | Клоді Ніл | Берн | Швейцарія |
| 15 | Порція Є | Сан-Паулу | Бразилія |
| 16 | Ангіла Сегарра | Лондон | Великобританія |
| 17 | Ліз Векслер | Аахен | Німеччина |
| 18 | Нед Мендівіл | Нант | Франція |
| 19 | Сара Відаурі | Лондон | Великобританія |
| 20 | Тайна Навін | Грац | Австрія |
| 21 | Пура Рей | Сан-Паулу | Бразилія |
| 22 | Еріка Бярд | Мадрид | Іспанія |
| 23 | Джиммі Люк | Лілль | Франція |
| 24 | Шейла Байтінгтон | Брекке | Швеція |
| 25 | Крістіана Боден | Мюнхен | Німеччина |
| 26 | Ірина Нітта | Нант | Франція |
| 27 | Bryanna Alls | Торіно | Італія |
| 28 | Нора Пікен | Лісбоа | Португалія |
| 29 | Морія Стюарт | Барселона | Іспанія |
| 30 | Іделла Гарріотт | Севілья | Іспанія |
| OrderID | CustomerID | Дата замовлення |
| 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 | 01.01.1997 |
| 10403 | 20 | 01.01.1997 |
| 10408 | 23 | 01.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 | 02.02.1997 |
| 10435 | 16 | 02.02.1997 |
| 10436 | 7 | 02.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 |
Висновок - пункт SAV HAVING
Таким чином, ми побачили, яка мета пункту HAVING і як це працює. Важливо розібратися в основній роботі, інакше ви можете заплутатися в тому, чому пункт HAVING не дає бажаних результатів. Продовжуйте грати з різними таблицями, приєднуйтесь та поєднуючись разом із пунктом HAVING.
Рекомендовані статті
Це посібник до пункту SQL HAVING. Тут ми обговорюємо роботу пункту HAVING у SQL та прикладу із наступною таблицею клієнтів. Ви також можете ознайомитися з іншими запропонованими нами статтями -
- SQL Insert Query
- Іноземний ключ у SQL
- Виразне ключове слово в SQL
- Перегляди SQL
- Топ-6 прикладів запитів внутрішньої приєднання до Oracle
