HAVING SQL: описание, синтаксис, примери. Оператор SQL HAVING - интересни стойности за агрегатни функции Sql описание, имащи

Клаузата HAVING се използва в комбинация с клаузата GROUP BY. Може да се използва в оператор SELECT за филтриране на записите, върнати от клаузата GROUP BY.

Синтаксис на клаузата HAVING

агрегатна_функцияможе да бъде функция като SUM, COUNT, MIN или MAX.

Пример за използване на функцията SUM
Например, можете да използвате функцията SUM, за да търсите името на отдела и сумата на продажбите (за съответните отдели). Офертата HAVING може да избере само онези отдели, чиито продажби са над $1000.

ИЗБЕРЕТЕ отдел, SUM(продажби) КАТО „Общи продажби“ ОТ order_details ГРУПИРАНЕ ПО отдел HAVING SUM(sales) > 1000;

Пример за използване на функцията COUNT
Например, можете да използвате функцията COUNT, за да извлечете името на отдела и броя на служителите (в съответния отдел), които са спечелили повече от $25 000 на година. Предложението HAVING ще избере само онези отдели, в които има повече от 10 такива служители.

Пример за използване на функцията MIN
Например, можете да използвате функцията MIN, за да върнете името на отдела и минималния приход за този отдел. Предложението HAVING ще върне само онези отдели, чиито приходи започват от $35 000.

ИЗБЕРЕТЕ отдел, MIN(заплата) КАТО „Най-ниска заплата“ ОТ служители, ГРУПИРАНИ ПО отдел, ИМАЩИ MIN(заплата) = 35000;

Пример за използване на функцията MAX
Например, можете също да използвате функцията, за да извлечете името на отдела и максималните приходи на отдела. Предложението HAVING ще върне само онези отдели, чийто максимален приход е по-малък от $50 000.

ИЗБЕРЕТЕ отдел, MAX(заплата) КАТО „Най-висока заплата“ ОТ служители, ГРУПИРАНИ ПО отдел, ИМАЩ MAX(заплата)< 50000 ;

Той има в своя арсенал много мощни инструменти за манипулиране на данни, съхранявани под формата на таблици.

Несъмнено възможността за групиране на данни при извадката им по определен критерий е един от тези инструменти. HAVING, заедно с оператора WHERE, ви позволява да дефинирате условия за избор на данни, които вече са групирани по някакъв начин.

HAVING SQL параметър: описание

Преди всичко си струва да се отбележи, че този параметър не е задължителен и се използва изключително във връзка с параметъра GROUP BY. Както си спомняте, GROUP BY се използва, когато в SELECT се използват агрегатни функции и резултатите от техните изчисления трябва да бъдат получени за определени групи. Ако WHERE ви позволява да зададете условия за избор, преди данните да бъдат групирани, тогава HAVING съдържа условия, свързани с данните директно в самите групи. За по-добро разбиране, нека разгледаме примера с веригата, представена на фигурата по-долу.

Това е отличен пример, който дава описание на HAVING SQL. Дадена е таблица със списък с имена на продукти, компании, които ги произвеждат и някои други полета. В заявката в горния десен ъгъл се опитваме да получим информация колко артикула произвежда всяка компания, а в резултата искаме да изведем само онези компании, които произвеждат повече от 2 артикула. Параметърът GROUP BY формира три групи, съответстващи на имената на фирмите, за всяка от които се изчислява броят на продуктите (редове). Но параметърът HAVING със своето условие отряза една група от получената извадка, тъй като тя не отговаряше на условието. В резултат на това получаваме две групи, съответстващи на фирми с 5 и 3 производствени количества.

Човек може да се чуди защо да използва HAVING, когато SQL има WHERE. Ако използвахме WHERE, той ще разглежда общия брой редове в таблицата, а не по групи, и условието няма да има смисъл в този случай. Въпреки това, доста често те съжителстват перфектно в едно искане.

В примера по-горе можем да видим как данните първо се избират по имената на служителите, посочени в параметъра WHERE, а след това резултатът, групиран в GROUP BY, преминава допълнителна проверка на размера на заплатата за всеки служител.

Параметър SQL HAVING: примери, синтаксис

Нека да разгледаме някои характеристики на синтаксиса HAVING SQL. Описанието на този параметър е доста просто. Първо, както вече беше отбелязано, той се използва изключително във връзка с параметъра GROUP BY и се посочва непосредствено след него и преди ORDER BY, ако има такъв в заявката. Това е разбираемо, тъй като HAVING дефинира условия за вече групирани данни. Второ, само агрегатните функции и полета, посочени в параметъра GROUP BY, могат да се използват в условието на този параметър. Всички условия в този параметър са посочени точно по същия начин, както в случая на WHERE.

Заключение

Както можете да видите, в този оператор няма нищо сложно. Семантично се използва по същия начин като WHERE. Важно е да се разбере, че WHERE се използва по отношение на всички избрани данни, а HAVING се използва само по отношение на групите, дефинирани в параметъра GROUP BY. Представихме изчерпателно описание на HAVING SQL, което е достатъчно, за да можете уверено да работите с него.

И накрая, последният раздел, използван за оценка на табличен израз, е ИМАЩ(ако има).

Глава ИМАЩможе да се появи смислено в табличен израз само ако съдържа раздел ГРУПИРАЙ ПО. Условието за търсене в този раздел определя условие за група редове в групирана таблица. Формално раздел ИМАЩможе да присъства и в табличен израз, който не съдържа ГРУПИРАЙ ПО.В този случай се приема, че резултатът от изчислението на предишните дялове е групирана таблица, състояща се от една група без специални колони за групиране.

Условие за търсене на раздел ИМАЩсе изгражда според същите синтактични правила като условието за търсене на раздел КЪДЕТОи може да включва същите предикати. Съществуват обаче специални синтактични ограничения по отношение на използването в условието за търсене на спецификациите на колоната на таблицата от раздела ОТдаден табличен израз. Тези ограничения следват от факта, че условието за търсене на раздел ИМАЩзадава условието за цялата група, а не за отделни редове.

Следователно, в аритметичните изрази на предикатите, включени в условието за избор на раздела ИМАЩ, можете директно да използвате само спецификациите на колоните, посочени като групиращи колони в раздела ГРУПИРАЙ ПО. Останалите колони могат да бъдат посочени само в спецификациите на агрегатната функция БРОЯТ, СУМА, СР., МИНИ МАКС, които в този случай изчисляват някаква агрегирана стойност за цялата група редове. Подобна е ситуацията с подзаявките, включени в предикатите на условието за избор на раздела ИМАЩ: Ако характеристиката на текущата група се използва в подзаявката, тя може да бъде указана само чрез препратка към колоните за групиране.

Резултатът от изпълнението на секцията ИМАЩе групирана таблица, съдържаща само онези групи от редове, за които резултатът от изчисляването на условието за търсене е ВЯРНО.По-специално, ако секцията ИМАЩприсъства в табличен израз, който не съдържа ГРУПИРАЙ ПО, тогава резултатът от неговото изпълнение ще бъде или празна таблица, или резултат от изпълнението на предишните секции на табличния израз, третиран като една група без групиране на колони.

КАТО БРОИМ

Изберете кодове за продукти, закупени от повече от един купувач:

ИЗБЕРЕТЕналичност ОТпродажба по поръчка ГРУПИРАЙ ПОналичност ИМАЩ БРОЯ(*) > 1;

КАТО МИН

Вземете минималните и максималните заплати за чиновници във всеки отдел, където най-ниската заплата е под $1000:

ИЗБЕРЕТЕдълбоко, МИН(сал) МАКС(сал) ОТимп КЪДЕТОработа = 'ЧИНОВНИК' ГРУПИРАЙ ПОзадълбочено КАТО МИН(сал)

Последна актуализация: 19.07.2017

T-SQL използва изразите GROUP BY и HAVING за групиране на данни, използвайки следния формален синтаксис:

ИЗБЕРЕТЕ колони ОТ таблицата

ГРУПИРАЙ ПО

Клаузата GROUP BY определя как ще бъдат групирани редовете.

Например, нека групираме продуктите по производител

ИЗБЕРЕТЕ Производител, БРОЙ(*) КАТО МоделиБрой ОТ Продукти, ГРУПИРАНИ ПО Производител

Първата колона в оператора SELECT - Manufacturer представлява името на групата, а втората колона - ModelsCount представя резултата от функцията Count, която изчислява броя на редовете в групата.

Струва си да се има предвид, че всяка колона, която се използва в оператор SELECT (без да се броят колоните, които съхраняват резултата от агрегатни функции), трябва да бъде указана след клаузата GROUP BY. Така например в случая по-горе колоната Производител е посочена и в клаузите SELECT и GROUP BY.

И ако операторът SELECT избира една или повече колони и също така използва агрегатни функции, тогава трябва да използвате клаузата GROUP BY. По този начин следният пример няма да работи, защото не съдържа израз за групиране:

ИЗБЕРЕТЕ Производител, БРОЙ(*) КАТО МоделиБрой ОТ Продукти

Друг пример, нека добавим групиране по брой продукти:

ИЗБЕРЕТЕ Manufacturer, ProductCount, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer, ProductCount

Клаузата GROUP BY може да групира по множество колони.

Ако колоната, в която групирате, съдържа NULL стойност, тогава редовете с NULL стойност ще образуват отделна група.

Имайте предвид, че клаузата GROUP BY трябва да идва след клаузата WHERE, но преди клаузата ORDER BY:

ИЗБЕРЕТЕ Производител, БРОЙ (*) КАТО Модели Брой ОТ Продукти WHERE Цена > 30000 ГРУПИРАНЕ ПО Производител ORDER BY Модели Брой DESC

Групово филтриране. ИМАЩ

Оператор ИМАЩ определя кои групи ще бъдат включени в изходния резултат, тоест филтрира групите.

Използването на HAVING е в много отношения подобно на използването на WHERE. Само WHERE се използва за филтриране на редове, HAVING се използва за филтриране на групи.

Например, нека намерим всички продуктови групи по производител, за които е дефиниран повече от 1 модел:

ИЗБЕРЕТЕ Производител, БРОЯ (*) КАТО Брой модели ОТ ГРУПИРАНЕ НА ПРОДУКТИ ПО Производител ИМАЩ БРОЯ (*) > 1

В този случай в една команда можем да използваме WHERE и HAVING изрази:

ИЗБЕРЕТЕ производител, БРОЙ(*) КАТО ModelsCount FROM Продукти WHERE Цена * Продуктов брой > 80000 ГРУПИРАНЕ ПО производител HAVING COUNT(*) > 1

Тоест в този случай първо се филтрират редовете: избират се продуктите, чиято обща цена е повече от 80 000, след което избраните продукти се групират по производител. След това се филтрират самите групи - избират се тези групи, които съдържат повече от 1 модел.

Ако е необходимо сортиране, тогава изразът ORDER BY идва след израза HAVING:

ИЗБЕРЕТЕ Производител, БРОЙ(*) AS модели, SUM(ProductCount) AS Units FROM Products WHERE Price * ProductCount > 80000 GROUP BY Manufacturer HAVING SUM(ProductCount) > 2 ORDER BY Units DESC

В този случай групирането е по производител, като също така се избира броя на моделите за всеки производител (Models) и общия брой на всички продукти за всички тези модели (Units). Накрая групите се сортират по брой продукти в низходящ ред.