Клаузите WHERE и HAVING се обсъждат подробно в тази статия. Те се използват и за филтриране на записи в SQL заявки. Разликата между клаузата WHERE и HAVING е най-често задаваният въпрос по време на интервю. Основната разлика между тях е, че клаузата WHERE се използва за указване на условие за филтриране на записи, преди да бъдат направени групирания, докато клаузата HAVING се използва за указване на условие за филтриране на стойности от група. Преди да направим сравнението, първо ще знаем тези SQL клаузи.
Клауза WHERE
Клаузата WHERE в MySQL се използва с SELECT, ВМЪКНЕТЕ , АКТУАЛИЗИРАНЕ , и ИЗТРИЙ заявки за филтриране на данни от таблицата или релацията. Той описва конкретно условие при извличане на записи от една таблица или множество таблици с помощта на клаузата JOIN. Ако зададеното условие е изпълнено, той връща конкретната стойност от таблицата. Клаузата WHERE поставя условия върху избраните колони.
Клаузата WHERE в MySQL също може реализират логическите връзки И , ИЛИ , и НЕ. Те са известни като булево условие, което трябва да бъде вярно за извличане на данните. Логическите свързващи изрази използват операторите за сравнение като техни операнди<, ,>=, = и . Операторите за сравнение обикновено се използват за сравняване на низове и аритметични изрази.,>
Следният синтаксис илюстрира използването на клаузата WHERE:
SELECT column_lists, FROM table_name WHERE conditions GROUP BY column_lists;
Нека вземем пример, за да разберем тази клауза. Да предположим, че имаме таблица с име служители които съдържат следните данни:
Ако искаме за да получите подробности за служителя, чието работно време е повече от 9 , тогава можем да използваме израза както следва:
mysql> SELECT * FROM employees WHERE working_hour > 9;
Ще получим резултата по-долу, където можем да видим подробности за служителите, чиито работни часове са по-големи от 9:
Ако използваме горната заявка с ГРУПИРАЙ ПО клауза, ще получим различен резултат:
mysql> SELECT * FROM employees WHERE working_hour > 9 GROUP BY name;
Ето резултата:
Клауза за ПРИТЕЖАВАНЕ
Клауза HAVING в MySQL използва се във връзка с GROUP BY клауза ни позволява да посочим условия, които филтрират кои групови резултати се показват в резултата. Връща само онези стойности от групите в крайния резултат, които отговарят на определени условия. Можем също да използваме клаузата WHERE и HAVING заедно по време на избора. В този случай клаузата WHERE първо филтрира отделните редове, след това редовете се групират, извършва обобщени изчисления и накрая клаузата HAVING филтрира групите.
Тази клауза поставя условия на групи, създадени от клаузата GROUP BY. Той се държи като клаузата WHERE, когато SQL операторът не използва ключовата дума GROUP BY. Можем да използваме агрегатните (групови) функции като SUM, MIN, MAX, AVG и БРОЯ само с две клаузи: SELECT и HAVING.
Следният синтаксис илюстрира използването на клаузата HAVING:
SELECT column_lists, aggregate_function (expression) FROM table_name WHERE conditions GROUP BY column_lists HAVING condition;
Нека вземем пример, за да разберем тази клауза. Тук разглеждаме същата таблица служители за демонстрация.
Ако искаме за да получите общото работно време за всеки служител, чието работно време е повече от 6 часа , тогава можем да използваме израза както следва:
mysql> SELECT name, SUM(working_hour) AS 'Total working hours' FROM employees GROUP BY name HAVING SUM(working_hour) > 6;
Ще получим резултата по-долу, където можем да видим общото работно време на всеки служител:
Основни разлики между клауза WHERE и HAVING
Следните точки обясняват основните разлики между база данни и схема:
- Клаузата WHERE филтрира отделни редове, докато клаузата HAVING филтрира групи вместо един ред наведнъж.
- Не можем да използваме клаузата WHERE с агрегатни функции, защото тя работи за филтриране на отделни редове. За разлика от това, HAVING може да работи с агрегатни функции, защото се използва за филтриране на групи.
- Операциите с редове се обработват от клаузата WHERE, докато клаузата HAVING обработва операциите с колони към обобщени редове или групи.
- WHERE идва преди GROUP BY, което означава, че клаузата WHERE филтрира редове преди извършване на обобщени изчисления. HAVING идва след GROUP BY, което означава, че клаузата HAVING филтрира редове след извършване на обобщени изчисления. Следователно HAVING е по-бавен от WHERE по отношение на ефективността и трябва да се избягва, когато е възможно.
- Можем да комбинираме клаузата WHERE и HAVING заедно в заявка SELECT. В този случай клаузата WHERE се използва първо за филтриране на отделни редове. След това редовете се групират, извършват се обобщени изчисления и накрая клаузата HAVING се използва за филтриране на групите.
- Клаузата WHERE извлича желаните данни въз основа на определеното условие. От друга страна, клаузата HAVING първо извлича цели данни и след това се извършва разделяне въз основа на определеното условие.
- Без оператор SELECT не можем да използваме клаузата HAVING. Обратно, можем да използваме WHERE с изрази SELECT, UPDATE и DELETE.
- Клаузата WHERE е предварителен филтър, докато клаузата HAVING е последващ филтър.
Сравнителна таблица WHERE срещу HAVING
Следващата сравнителна таблица обяснява основните им разлики по бърз начин:
База за сравнение | Клауза WHERE | Клауза за ПРИТЕЖАВАНЕ |
---|---|---|
Определение | Използва се за извършване на филтриране на отделни редове. | Използва се за извършване на филтриране на групи. |
Основен | Реализира се в операции с редове. | Реализира се в колонни операции. |
Извличане на данни | Клаузата WHERE извлича специфичните данни от определени редове въз основа на определеното условие | Клаузата HAVING първо извлича пълните данни. След това ги разделя според даденото състояние. |
Агрегатни функции | Клаузата WHERE не позволява работа с агрегатни функции. | Клаузата HAVING може да работи с агрегатни функции. |
Дръж се като | Клаузата WHERE действа като предварителен филтър. | Клаузата HAVING действа като постфилтър. |
Използва се с | Можем да използваме клаузата WHERE с операторите SELECT, UPDATE и DELETE. | Клаузата HAVING може да се използва само с израза SELECT. |
ГРУПИРАЙ ПО | Клаузата GROUP BY идва след клаузата WHERE. | Клаузата GROUP BY идва преди клаузата HAVING. |
Заключение
В тази статия направихме сравнение между клаузата WHERE и HAVING. Тук заключаваме, че и двете клаузи работят по един и същи начин при филтриране на данните, с изключение на това, че някои допълнителни функции правят клаузата HAVING по-популярна. Можем ефективно да работим с агрегатни функции в клаузата HAVING, докато WHERE не позволява агрегатни функции.