* Клауза HAVING
Публикувано на 17 март 2009 от Филип Петров. Записано в DB.
Понякога се налага да филтрираме данните след като вече сме направили дадена калкулация. Фразата HAVING се използва за прилагане на условия върху групи (обикновено оформени чрез GROUP BY).
Ще демонстрираме това с пример. Вече знаем как можем да изкараме списък на клиентите и средните суми на техните сметки:
SELECT customers.name, AVG(accounts.amount) FROM customers JOIN accounts ON customers.id = accounts.customer_id GROUP BY customers.name;
Нека обаче да направим следното – искаме да изкараме списъка само на клиентите, чийто сметки имат средна сума по-голяма от 500. Това не би могло да стане в клауза WHERE, защото при нея все още не е пресметнато AVG(accounts.amount). Затова можем да използваме допълнително филтриране чрез клауза HAVING:
SELECT customers.name, AVG(accounts.amount) FROM customers JOIN accounts ON customers.id = accounts.customer_id GROUP BY customers.name HAVING AVG(accounts.amount) > 500;
Ето как бихме могли да използваме WHERE и HAVING в комбинация – следната заявка изкарва списък на клиентите, чийто сметки имат средна сума на акаунта по-голяма от 500 и името им започва с „M“:
SELECT customers.name, AVG(accounts.amount) FROM customers JOIN accounts ON customers.id = accounts.customer_id WHERE customers.name LIKE 'M%' GROUP BY customers.name HAVING AVG(accounts.amount) > 500;
Избягвайте да използвате HAVING, когато можете. В повечето случаи крайния резултат от прехвърляне на клаузата WHERE в HAVING ще даде идентичен резултат, но това ще даде резултат на по-бавна заявка, защото много повече информация ще бъде обработвана (няма пропускане на редове). Също така индексите не работят с клаузи HAVING.
В общи линии винаги прилагайте теоремата: „ако в условието HAVING не участват агрегатни функции, то условието може да бъде пренесено в WHERE“.
Възможно е да използвате вложен SELECT оператор в клауза HAVING. Опитайте се да изкарате списък на клиентите, чийто сметки имат средна сума на акаунта си по-голяма от средната.
Trackback URI | RSS за коментарите
Пусни коментар
Страници
Категории
- C/C++ (45)
- DB (36)
- Dogs (49)
- Food (7)
- History (8)
- Java (33)
- Lada (41)
- Math (104)
- Metodos (23)
- NetSec (36)
- Other (76)
- Politics (32)
- Probability (13)
- VC++.Net (1)
- XHTML/JS (25)
Нови
- Един виц за капитализма
- Как да получиш целувка?
- Лека разходка на Витоша
- Роко и Берра на училище
- Газова бутилка под багажника на Лада Нива