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. Етап 1 - извличане на редове
    • Първо се избират всички редове от посочената table.
    • След това към тях се добавят изчислени полета.
    • И тогава от всички редове остават само тези, които отговарят на conditionтоWHERE
  2. Етап 2 - групиране
    • След това групирането се прилага към резултатите.
    • По време на групирането полета като COUNT(*).
    • Накрая към резултата от групирането се прилага филтър HAVING.
  3. Етап 3 - сортиране
    • Редовете, получени в предишните стъпки, се сортират с помощта на ORDER BY.

Накрая резултатът може да бъде подрязан с LIMITи OFFSET.