5.1 Изявление HAVING
Има друг полезен оператор в SQL, който се използва с GROUP BY
, той се нарича HAVING
.
По смисъла си той е напълно аналогичен на оператора WHERE
. Той ви позволява само WHERE
да зададете филтър за ред преди групиране и с помощта HAVING
можете да зададете филтър, който да се прилага към записите след групирането.
Общият изглед на заявката при използване на групиране и филтриране на резултатите от групирането е Howто следва:
SELECT columns
FROM table
WHERE condition
GROUP BY columns
HAVING condition
HAVING
може да се използва само ако заявката съдържа GROUP BY
.
Нека напишем заявка, в която показваме броя на наетите служители по години.
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
И резултатът от тази заявка:
година на наем | обща сума |
---|---|
2012 г | 1 |
2013 | 1 |
2014 г | 1 |
2015 г | 2 |
2018 г | 1 |
И сега от него изключваме годините, в които са наети един or по-малко служители. Пример:
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
HAVING total > 1
И резултатът от тази заявка:
година на наем | обща сума |
---|---|
2015 г | 2 |
5.3 Ред за изпълнение на извлечения
За да пишете правилни и ефективни SQL заявки, трябва да разберете How се изпълняват от SQL сървъра.
Процедурата за извършване на действия е строго регламентирана и не зависи от вашето желание. Не можете да пренаредите операторите и да получите различен ред.
SQL заявката се изпълнява на няколко етапа в този ред.
- Етап 1 - извличане на редове
- Първо се избират всички редове от посочената table.
- След това към тях се добавят изчислени полета.
- И тогава от всички редове остават само тези, които отговарят на conditionто
WHERE
- Етап 2 - групиране
- След това групирането се прилага към резултатите.
- По време на групирането полета като
COUNT(*)
. - Накрая към резултата от групирането се прилага филтър
HAVING
. - Етап 3 - сортиране
- Редовете, получени в предишните стъпки, се сортират с помощта на
ORDER BY
.
Накрая резултатът може да бъде подрязан с LIMIT
и OFFSET
.
GO TO FULL VERSION