Вступ до пункту 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