logo

Разлика между WHERE и HAVING

Клаузите WHERE и HAVING се обсъждат подробно в тази статия. Те се използват и за филтриране на записи в SQL заявки. Разликата между клаузата WHERE и HAVING е най-често задаваният въпрос по време на интервю. Основната разлика между тях е, че клаузата WHERE се използва за указване на условие за филтриране на записи, преди да бъдат направени групирания, докато клаузата HAVING се използва за указване на условие за филтриране на стойности от група. Преди да направим сравнението, първо ще знаем тези SQL клаузи.

WHERE срещу HAVING

Клауза WHERE

Клаузата WHERE в MySQL се използва с SELECT, ВМЪКНЕТЕ , АКТУАЛИЗИРАНЕ , и ИЗТРИЙ заявки за филтриране на данни от таблицата или релацията. Той описва конкретно условие при извличане на записи от една таблица или множество таблици с помощта на клаузата JOIN. Ако зададеното условие е изпълнено, той връща конкретната стойност от таблицата. Клаузата WHERE поставя условия върху избраните колони.

Клаузата WHERE в MySQL също може реализират логическите връзки И , ИЛИ , и НЕ. Те са известни като булево условие, което трябва да бъде вярно за извличане на данните. Логическите свързващи изрази използват операторите за сравнение като техни операнди<, ,>=, = и . Операторите за сравнение обикновено се използват за сравняване на низове и аритметични изрази.

Следният синтаксис илюстрира използването на клаузата WHERE:

 SELECT column_lists, FROM table_name WHERE conditions GROUP BY column_lists; 

Нека вземем пример, за да разберем тази клауза. Да предположим, че имаме таблица с име служители които съдържат следните данни:

WHERE срещу HAVING

Ако искаме за да получите подробности за служителя, чието работно време е повече от 9 , тогава можем да използваме израза както следва:

 mysql&gt; SELECT * FROM employees WHERE working_hour &gt; 9; 

Ще получим резултата по-долу, където можем да видим подробности за служителите, чиито работни часове са по-големи от 9:

WHERE срещу HAVING

Ако използваме горната заявка с ГРУПИРАЙ ПО клауза, ще получим различен резултат:

 mysql&gt; SELECT * FROM employees WHERE working_hour &gt; 9 GROUP BY name; 

Ето резултата:

WHERE срещу HAVING

Клауза за ПРИТЕЖАВАНЕ

Клауза 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&gt; SELECT name, SUM(working_hour) AS &apos;Total working hours&apos; FROM employees GROUP BY name HAVING SUM(working_hour) &gt; 6; 

Ще получим резултата по-долу, където можем да видим общото работно време на всеки служител:

WHERE срещу HAVING

Основни разлики между клауза 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 не позволява агрегатни функции.