Да се научим да обобщаваме. Не, това не са резултатите от изучаването на SQL, а резултатите от стойностите на колоните на таблиците на базата данни. SQL агрегатните функции работят върху стойностите на колона, за да произведат една стойност на резултата. Най-често използваните SQL агрегатни функции са SUM, MIN, MAX, AVG и COUNT. Има два случая, в които трябва да се използват агрегатни функции. Първо, агрегатните функции се използват сами и връщат една стойност на резултата. Второ, агрегатните функции се използват с клаузата SQL GROUP BY, тоест с групиране по полета (колони), за да се получат получените стойности във всяка група. Разгледайте първо случаите на използване на агрегатни функции без групиране.
Функцията SQL SUM връща сумата от стойностите на колона в таблица на база данни. Може да се прилага само към колони, чиито стойности са числа. SQL заявкиза да получите получената сума, започнете така:
ИЗБЕРЕТЕ СУМА (ИМЕ НА КОЛОНА) ...
Този израз е последван от FROM (TABLE_NAME) и след това може да се посочи условие с помощта на клаузата WHERE. Освен това DISTINCT може да има префикс към име на колона, за да покаже, че ще бъдат взети предвид само уникални стойности. По подразбиране се вземат предвид всички стойности (за това можете конкретно да посочите не DISTINCT, а ALL, но думата ALL не е задължителна).
Ако искате да изпълнявате заявки за база данни от този урок на MS SQL Server, но тази СУБД не е инсталирана на вашия компютър, тогава можете да я инсталирате, като използвате инструкциите на тази връзка .
Първо, ще работим с базата данни на компанията - Company1. Скриптът за създаване на тази база данни, нейните таблици и попълване на таблиците с данни е във файла на този линк .
Пример 1Има база данни на компанията с данни за нейните отдели и служители. Таблицата с персонал също има колона с данни за заплатите на служителите. Изборът от таблицата има следния вид (за да увеличите снимката, кликнете върху нея с левия бутон на мишката):
За да получим сумата на всички заплати, използваме следната заявка (на MS SQL Server - с префикс USE company1;):
ИЗБЕРЕТЕ СУМА (Заплата) ОТ Персонал
Тази заявка ще върне стойността 287664.63.
И сега . В упражненията вече започваме да усложняваме задачите, доближавайки ги до тези, които се срещат в практиката.
Функцията SQL MIN работи и с колони, чиито стойности са числа, и връща минималната от всички стойности в колоната. Тази функция има синтаксис, подобен на този на функцията SUM.
Пример 3Базата данни и таблицата са същите като в пример 1.
Необходимо е да разберете минималната заплата на служителите от отдел номер 42. За да направите това, ние пишем следната заявка (на MS SQL Server - с префикса USE company1;):
Заявката ще върне стойността 10505.90.
И отново упражнение за независимо решение . В това и някои други упражнения ще ви трябва не само таблицата Staff, но и таблицата Org, съдържаща данни за подразделенията на компанията:
Пример 4Таблицата Org се добавя към таблицата Staff, съдържаща данни за подразделенията на компанията. Изведете минималния брой години, през които един служител е работил в отдел, разположен в Бостън.
Функцията SQL MAX работи по подобен начин и има подобен синтаксис, който се използва, когато искате да определите максималната стойност сред всички стойности на колона.
Пример 5
Необходимо е да разберете максималната заплата на служителите от отдел номер 42. За да направите това, ние пишем следната заявка (на MS SQL Server - с префикса USE company1;):
Заявката ще върне стойността 18352.80
Време е упражнения за самоопределяне.
Пример 6Отново работим с две таблици - Staff и Org. Покажете името на отдела и максималния размер на комисионните, получавани от един служител в отдела, който принадлежи към групата отдели (Division) East. Използвайте JOIN (съединяване на таблици) .
Казаното за синтаксиса за предишните описани функции е вярно и за функцията SQL AVG. Тази функция връща средната стойност на всички стойности в колона.
Пример 7Базата данни и таблицата са същите като в предишните примери.
Нека се изисква да разберете средната продължителност на службата на служителите от отдел номер 42. За да направите това, ние пишем следната заявка (на MS SQL Server - с префикса USE company1;):
Резултатът ще бъде 6,33
Пример 8Работим с една маса - Персонал. Покажете средната заплата на служители с опит от 4 до 6 години.
Функцията SQL COUNT връща броя на записите в таблица на база данни. Ако укажете SELECT COUNT(COLUMNAME) ... в заявката, тогава резултатът ще бъде броят на записите, без да се вземат предвид тези записи, в които стойността на колоната е NULL (недефинирана). Ако използвате звездичка като аргумент и започнете SELECT заявка COUNT(*) ..., тогава резултатът ще бъде броят на всички записи (редове) на таблицата.
Пример 9Базата данни и таблицата са същите като в предишните примери.
Искате да знаете броя на всички служители, които получават комисионни. Броят служители, чиито стойности на колона Comm не са NULL, ще върне следната заявка (на MS SQL Server - с USE company1; предстояща конструкция):
ИЗБЕРЕТЕ БРОЯ (Comm) FROM Staff
Резултатът ще бъде стойността 11.
Пример 10Базата данни и таблицата са същите като в предишните примери.
Ако трябва да разберете общия брой записи в таблицата, тогава използваме заявката със звездичка като аргумент на функцията COUNT (на MS SQL Server - с префикс USE company1;):
ИЗБЕРЕТЕ БРОЯ (*) ОТ персонала
Резултатът ще бъде стойността 17.
Следващия упражнение за самоопределянетрябва да използвате подзаявка.
Пример 11.Работим с една маса - Персонал. Покажете броя на служителите в отдел Plains.
Сега нека разгледаме използването на агрегатни функции заедно с клаузата SQL GROUP BY. Клаузата SQL GROUP BY се използва за групиране на получените стойности по колони в таблица на база данни. Сайтът има урок, посветен на този оператор отделно .
Ще работим с база данни "Портал за обяви 1". Скриптът за създаване на тази база данни, нейната таблица и попълването на таблицата с данни е във файла на този линк .
Пример 12.И така, има база данни на рекламния портал. Има таблица с реклами, която съдържа данни за рекламите, които са изпратени за седмицата. Колоната „Категория“ съдържа данни за големи рекламни категории (например „Недвижими имоти“), а колоната „Части“ съдържа данни за по-малки части, включени в категориите (например частите от апартаменти и вили са части от категорията „Недвижими имоти“). Колоната Единици съдържа данни за броя на изпратените реклами, а колоната Пари съдържа сумата пари, спечелени за изпращане на реклами.
Категория | част | Единици | Пари |
транспорт | моторни превозни средства | 110 | 17600 |
Недвижим имот | Апартаменти | 89 | 18690 |
Недвижим имот | Дачи | 57 | 11970 |
транспорт | Мотоциклети | 131 | 20960 |
строителни материали | Дъски | 68 | 7140 |
електроинженерство | телевизори | 127 | 8255 |
електроинженерство | Хладилници | 137 | 8905 |
строителни материали | Regips | 112 | 11760 |
свободно време | Книги | 96 | 6240 |
Недвижим имот | Вкъщи | 47 | 9870 |
свободно време | Музика | 117 | 7605 |
свободно време | игри | 41 | 2665 |
Използвайки клаузата SQL GROUP BY, намерете сумата пари, генерирана от изпращане на реклами във всяка категория. Пишем следната заявка (на MS SQL Server - с префикс USE adportal1;):
ИЗБЕРЕТЕ категория, СУМА (пари) КАТО пари ОТ РЕКЛАМИ, ГРУПИРАНИ ПО категория
Пример 13Базата данни и таблицата са същите като в предишния пример.
Използвайки клаузата SQL GROUP BY, разберете коя част от всяка категория има най-много реклами. Пишем следната заявка (на MS SQL Server - с префикс USE adportal1;):
ИЗБЕРЕТЕ категория, част, МАКС (Единици) КАТО максимум ОТ РЕКЛАМИ, ГРУПИРАНИ ПО категория
Резултатът ще бъде следната таблица:
Могат да се получат общи и индивидуални стойности в една таблица комбиниране на резултатите от заявката с помощта на оператора UNION .
Релационни бази данни и SQL език
Описва използването на аритметични оператори и конструирането на изчисляеми колони. Разгледани са сумарните (агрегирани) функции COUNT, SUM, AVG, MAX, MIN. Даден е пример за използване на оператора GROUP BY за групиране в заявки за избор на данни. Описва използването на клаузата HAVING.Като цяло, за създаване изчислено (изведено) полев списъка SELECT трябва да посочите някакъв израз на SQL езика. Тези изрази използват аритметичните операции събиране, изваждане, умножение и деление, както и вградените функции на езика SQL. Можете да посочите името на всяка колона (поле) на таблица или заявка, но използвайте само името на колоната на таблицата или заявката, което е посочено в клаузата FROM на съответния оператор. Скобите може да са необходими при конструиране на сложни изрази.
SQL стандартите ви позволяват изрично да посочите имената на колоните на получената таблица, за която се използва фразата AS.
ИЗБЕРЕТЕ Item.Name, Item.Price, Deal.Quantity, Item.Price*Trade.Quantity AS Cost FROM Item INNER JOIN Trade ON Item.ItemCode=Trade.ItemID Пример 6.1. Изчисляване на общата цена за всяка сделка.
Пример 6.2.Вземете списък с компании с имената и инициалите на клиентите.
ИЗБЕРЕТЕ Фирма, Фамилия+""+ Вляво(Име,1)+"."+Вляво(Бащино,1)+"."КАТО пълно име ОТ Клиент Пример 6.2. Получаване на списък с фирми с посочване на имената и инициалите на клиентите.
Заявката използва вградената функция Left, която ви позволява да изрежете един знак отляво в текстова променлива в този случай.
Пример 6.3.Получете списък с продукти с годината и месеца на продажба.
ИЗБЕРЕТЕ Item.Name, Year(Trade.Date) AS Year, Month(Trade.Date) AS Month FROM Item INNER JOIN Trade ON Item.ItemID=Trade.ItemID Пример 6.3. Получаване на списък с продукти с година и месец на продажба.
Заявката използва вградените функции за година и месец, за да извлече годината и месеца от дата.
Като се използва сумарни (агрегирани) функциив рамките на SQL заявката можете да получите редица обобщаващи статистическа информация за набора от избрани стойности на изходния набор.
Потребителят има достъп до следното обобщаващи функции:
Най-често имената на колони действат като изрази. Изразът може също да бъде оценен на стойностите на няколко таблици.
Всички тези функции работят със стойности в една колона на таблица или с аритметичен израз и връщат една стойност. Функциите COUNT, MIN и MAX се прилагат както за числови, така и за нечислови полета, докато функциите SUM и AVG могат да се използват само в случай на числови полета, с изключение на COUNT(*). При изчисляване на резултатите от всякакви функции първо се изключват всички нулеви стойности, след което необходимата операция се прилага само към останалите специфични стойности на колоната. Вариантът COUNT(*) е специален случай на използване на функцията COUNT, чиято цел е да преброи всички редове в получената таблица, независимо дали съдържат нули, дубликати или други стойности.
Ако искате да елиминирате дублиращи се стойности, преди да използвате обща функция, трябва да предхождате името на колоната в дефиницията на функцията с ключовата дума DISTINCT. Няма смисъл за функциите MIN и MAX, но използването му може да повлияе на резултатите от функциите SUM и AVG, така че трябва да прецените предварително дали трябва да присъства във всеки конкретен случай. Освен това ключовата дума DISTINCT може да бъде зададена най-много веднъж във всяка заявка.
Много е важно да се отбележи, че обобщаващи функцииможе да се използва само в списък с клауза SELECT и като част от клауза HAVING. Във всички останали случаи това не е позволено. Ако списъкът в клаузата SELECT съдържа обобщаващи функциии няма клауза GROUP BY в текста на заявката, която осигурява групиране на данни, тогава нито един от елементите на списъка на клаузата SELECT не може да включва препратки към полета, с изключение на ситуацията, когато полетата действат като аргументи крайни функции.
Пример 6.4.Определете името на първия елемент по азбучен ред.
ИЗБЕРЕТЕ Min(Item.Name) КАТО Min_Name FROM Product Пример 6.4. Определяне на името на първия елемент по азбучен ред.
Пример 6.5.Определете броя на транзакциите.
ИЗБЕРЕТЕ Count(*) AS Брой_сделки ОТ Търговия Пример 6.5. Определете броя на транзакциите.
Пример 6.6.Определете общото количество продадени стоки.
ИЗБЕРЕТЕ Sum(Trade.Quantity) КАТО Product_Quantity FROM Trade Пример 6.6. Определяне на общото количество продадени стоки.
Пример 6.7.Определете средната цена на продадения артикул.
SELECT Avg(Item.Price) AS Avg_Price FROM Item INNER JOIN Trade ON Item.ItemID=Trade.ItemID; Пример 6.7. Определяне на средната цена на продадените стоки.
SELECT Sum(Item.Price*Trade.Quantity) AS Cost FROM Item INNER JOIN Trade ON Item.ItemID=Trade.ItemID Пример 6.8. Изчисляване на общата себестойност на продадените стоки.
Заявките често изискват генериране на междинни суми, което обикновено се обозначава с фразата „за всеки...“ в заявката. Операторът SELECT използва клаузата GROUP BY за тази цел. Заявка, която има GROUP BY, се нарича заявка за групиране, защото групира данните от операцията SELECT и след това създава един обобщен ред за всяка отделна група. Стандартът SQL изисква клаузата SELECT и клаузата GROUP BY да бъдат тясно свързани. Когато има клауза GROUP BY в оператора SELECT, всеки елемент от списъка в клаузата SELECT трябва да има една стойност за цялата група. Освен това клаузата SELECT може да включва само следните типове елементи: имена на полета, обобщаващи функции, константи и изрази, които включват комбинации от горните елементи.
Всички имена на полета, изброени в клаузата SELECT, трябва също да се показват в клаузата GROUP BY - освен когато името на колоната се използва в крайна функция. Обратното правило не е вярно - може да има имена на колони в клаузата GROUP BY, които не са в списъка на клаузата SELECT.
Ако клауза WHERE се използва с GROUP BY, тогава тя се обработва първо и само тези редове, които отговарят на условието за търсене, се групират.
Стандартът SQL уточнява, че всички липсващи стойности се считат за равни при групиране. Ако два реда на таблица в една и съща колона за групиране съдържат нулеви и идентични стойности във всички други непразни колони за групиране, те се поставят в една и съща група.
Пример 6.9.Изчислете средния обем покупки, направени от всеки клиент.
SELECT Client.LastName, Avg(Deal.Quantity) AS Average_Quantity FROM Client INNER JOIN Transaction ON Client.ClientID=Transaction.ClientID GROUP BY Client.LastName Пример 6.9. Изчисляване на средния обем покупки, направени от всеки клиент.
Фразата "от всеки клиент" се отразява в SQL заявката като изречение ГРУПИРАНЕ ПО Клиент. Фамилия.
Пример 6.10.Определете сумата, за която е продаден продуктът на всеки артикул.
ИЗБЕРЕТЕ Item.Name, Sum(Item.Price*Trade.Quantity) AS Cost FROM Item INNER JOIN Trade ON Item.ItemID=Trade.ItemID ГРУПИРАНЕ ПО Име на артикул Пример 6.10. Определяне на сумата, за която е продаден продуктът на всеки артикул.
SELECT Client.Company, Count(Deal.DealCode) AS Number_of_deals FROM Client INNER JOIN Deal ON Client.ClientId=Trade.ClientID ГРУПИРАНЕ ПО Client.Company Пример 6.11. Преброяване на броя транзакции, извършени от всяка фирма.
ИЗБЕРЕТЕ Customer.Company, Sum(Trade.Quantity) AS Total_Quantity, Sum(Item.Price*Trade.Quantity) AS Cost FROM Commodity INNER JOIN (Customer INNER JOIN Trade ON Customer.CustomerId=Trade.CustomerId) ON Commodity.ItemId=Trade .ProductCode ГРУПИРАНЕ ПО Client.Company Пример 6.12. Изчисляване на общия брой закупени стоки за всяка компания и тяхната цена.
Пример 6.13.Определете общата цена на всеки продукт за всеки месец.
ИЗБЕРЕТЕ Item.Name, Month(Trade.Date) AS Month, Sum(Item.Price*Trade.Quantity) AS Cost FROM Item INNER JOIN Trade ON Item.ItemID=Trade.ItemID ГРУПИРАНЕ ПО Име на артикул, Month(Trade.Date ) Пример 6.13. Определяне на общата себестойност на всеки продукт за всеки месец.
Пример 6.14.Определете общата цена на всеки елемент от първи клас за всеки месец.
ИЗБЕРЕТЕ Item.Name, Month(Trade.Date) AS Month, Sum(Item.Price*Trade.Quantity) AS Cost FROM Item INNER JOIN Trade ON Item.ItemID=Trade.ItemID WHERE Item.Sort="First" GROUP BY Item .Заглавие, месец (Дата на сделка) Пример 6.14. Определяне на общата себестойност на всеки продукт от първи клас за всеки месец.
HAVING отразява всички блокове данни, предварително групирани по GROUP BY, които отговарят на условията, посочени в HAVING. Това е допълнителна опция за "филтриране" на изходния набор.
Условията в HAVING са различни от условията в WHERE :
Пример 6.15.Определете фирмите, чийто общ брой транзакции надвишава три.
ИЗБЕРЕТЕ Client.Company, Count(Trade.Count) AS Number of_trades FROM Client INNER JOIN Trade ON Client.ClientCode=Trade.ClientID GROUP BY Client.Company HAVING Count(Trade.Count)>3 Пример 6.15. Идентифициране на фирми, чийто общ брой сделки надвишава три.
Пример 6.16.Покажете списък с продадени стоки за повече от 10 000 рубли.
ИЗБЕРЕТЕ Item.Name, Sum(Item.Price*Trade.Quantity) AS Cost FROM Item INNER JOIN Trade ON Item.Item.ItemID=Trade.ItemID ГРУПИРАНЕ ПО Име.на артикул HAVING Sum(Item.Price*Trade.Quantity)>10000 Пример 6.16. Показване на списък с продадени стоки за повече от 10 000 рубли.
Пример 6.17.Показване на списък с продадени продукти за повече от 10 000, без да се посочва сумата.
ИЗБЕРЕТЕ Item.Name FROM Item INNER JOIN Trade ON Item.ItemCode=Trade.ItemID GROUP BY Item.Name HAVING Sum(Item.Price*Trade.Quantity)>10000 Пример 6.17. Показване на списък с продадени продукти за повече от 10 000, без да се посочва сумата.
В този урок ще научите как да използвате Функция SUMв SQL Server (Transact-SQL) със синтаксис и примери.
В SQL Server (Transact-SQL) Функция SUMвръща общата стойност на израза.
Синтаксисът за функцията SUM в SQL Server (Transact-SQL) е:
ИЛИ синтаксиса на функцията SUM при групиране на резултати по една или повече колони:
израз1, израз2, ... израз_n са изрази, които не са включени във функцията SUM и трябва да бъдат включени в клаузата GROUP BY в края на SQL оператора.
aggregate_expression е колоната или изразът, който ще бъде сумиран.
таблици - таблици, от които искате да получите записи. Трябва да има поне една таблица, посочена в клаузата FROM.
WHERE условия - по желание. Това са условията, които трябва да бъдат изпълнени за избраните записи.
Функцията SUM може да се използва в следните версии на SQL Server (Transact-SQL):
SQL Server vNext, SQL Server 2016, SQL Server 2015, SQL Server 2014, SQL Server 2012, SQL Server 2008 R2, SQL Server 2008, SQL Server 2005
Помислете за някои SQL примериФункция SUM на сървъра, за да разберете как да използвате функцията SUM в SQL Server (Transact-SQL).
Например, можете да разберете как общият брой на всички продукти, чийто брой е по-голям от 10.
В този пример за функцията SUM сме сложили псевдоним на израза SUM(quantity) „Общо количество“. При връщане на набор от резултати - "Общо количество" ще се покаже като име на полето.
Можете да използвате израза DISTINCT във функцията SUM. Например SQL изразът по-долу връща общата сума на заплатата с уникални ценностизаплата , където заплатата е под $29 000 на година.
Ако две заплати бяха $24 000 на година, само една от тези стойности щеше да се използва във функцията SUM.
Изразът, съдържащ се във функцията SUM, не трябва да бъде едно поле. Можете също да използвате формула. Например можете да изчислите общата комисионна.
Transact SQL
ИЗБЕРЕТЕ СУМА (продажби * 0,03) КАТО „Обща комисионна“ ОТ поръчки;
ИЗБЕРЕТЕ СУМА (продажби * 0,03) КАТО „Обща комисионна“ ОТ поръчки ; |
В някои случаи ще трябва да използвате клаузата GROUP BY с функцията SUM.
ИЗБЕРЕТЕ МИН.(цена), МАКС.(цена), СР.(цена) ОТ цени;
Сега искаме да разберем за колко доставчикът "Печатница" (id=2) ни е донесъл стоките. Отправянето на такова искане не е лесно. Нека помислим как да го направим:
1. Първо трябва да изберете идентификаторите (id_incoming) на тези доставки, които са извършени от доставчика на "Печатница" (id=2) от таблицата Deliveries (incoming):
2. Сега от таблицата на дневника за доставки (magazine_incoming) трябва да изберете стоките (id_product) и техните количества (количество), които са извършени в доставките, намерени в параграф 1. Тоест заявката от точка 1 става вложена:
3. Сега към получената таблица трябва да добавим цените за намерените стоки, които се съхраняват в таблицата Цени. Тоест, трябва да обединим таблиците Supply journal (magazine_incoming) и Prices (prices) по колоната id_product:
4. В получената таблица колоната Sum явно липсва, т.е изчислена колона. Възможността за създаване на такива колони е предоставена в MySQL. За да направите това, просто трябва да посочите в заявката името на изчисляемата колона и какво трябва да изчисли. В нашия пример такава колона ще се нарича summa и ще изчислява произведението на колоните за количество и цена. Името на новата колона е разделено с думата AS:
ИЗБЕРЕТЕ magazine_incoming.id_product, magazine_incoming.quantity, prices.price, magazine_incoming.quantity*prices.price КАТО сума ОТ magazine_incoming, цени WHERE magazine_incoming.id_product= prices.id_product И id_incoming= (SELECT id_incoming FROM incoming WHERE id_vendor=2);
5. Чудесно, остава ни само да сумираме сумарната колона и накрая да разберем за колко доставчикът "Печатница" ни е донесъл стоките. Синтаксисът за използване на функцията SUM() е както следва:
SELECT SUM(име_на_колона) FROM име_на_таблица;
Знаем името на колоната - summa, но нямаме името на таблицата, тъй като е резултат от заявката. Какво да правя? За такива случаи MySQL има Views. Изгледът е заявка за избор, на която е дадено уникално име и може да се съхранява в база данни за по-късна употреба.
Синтаксисът за създаване на изглед е както следва:
CREATE VIEW view_name AS заявка;
Нека запазим нашата заявка като изглед с име report_vendor:
Създайте View Report_vendor като Select Magazine_incoming.id_product, Magazine_incoming.quantity, Price.price, Magazine_incoming.quantity*Цени.Price като summa от magazine_incoming, цени, където magazine_incoming.id_product = prices.id_product и id_incoming = (select id_incoming );
6. Сега можете да използвате крайната функция SUM():
SELECT SUM(сума) ОТ report_vendor;
Тук постигнахме резултата, въпреки че за това трябваше да използваме вложени заявки, съединения, изчислени колони и изгледи. Да, понякога трябва да мислите, за да получите резултата, без него не можете да отидете никъде. Но засегнахме две много важни теми - изчислени колони и изгледи. Нека поговорим за тях по-подробно.
ИЗБЕРЕТЕ име_на_колона_1, име_на_кола_2, име_на_кола_1*име_на_кола_2 КАТО име на_изчислена_колона_ОТ име на_таблица;
Вторият нюанс е ключовата дума AS, използвахме я, за да зададем името на изчислената колона. Всъщност тази ключова дума задава псевдоними за всякакви колони. Защо е необходимо това? За намаляване на кода и четливост. Например нашият изглед може да изглежда така:
CREATE VIEW report_vendor AS SELECT A.id_product, A.quantity, B.price, A.quantity*B.price AS summa FROM magazine_incoming AS A, prices AS B WHERE A.id_product= B.id_product AND id_incoming= (SELECT id_incoming FROM incoming WHERE id_vendor=2);
Съгласете се, че това е много по-кратко и по-ясно.
Но трябва да се помни, че изгледите не са таблици, тоест те не съхраняват данни, а само ги извличат от други таблици. Следователно, първо, когато промените данните в таблиците, резултатите от представянето също ще се променят. И второ, когато се иска изглед, се търсят необходимите данни, тоест производителността на СУБД намалява. Затова не трябва да се злоупотребява с тях.
Как мога да разбера броя на моделите компютри, произведени от определен доставчик? Как да определим средната цена на компютри, които имат еднакви спецификации? На тези и много други въпроси, свързани с някаква статистическа информация, може да се отговори с помощта на сумарни (агрегирани) функции. Стандартът предоставя следните агрегатни функции:
Всички тези функции връщат една стойност. В същото време функциите БРОЯ, МИНИ МАКСсе прилага за всеки тип данни, докато SUMИ СРизползва се само за цифрови полета. Разлика между функция БРОЯ(*)И БРОЯ(<имя поля>) е, че вторият не взема предвид NULL стойностите при изчисляване.
Пример. Намерете минималната и максималната цена за персонални компютри:
Пример. Намерете наличния брой компютри, произведени от производител A:
Пример. Ако се интересуваме от броя на различните модели, произведени от производител A, тогава заявката може да бъде формулирана по следния начин (използвайки факта, че всеки модел се записва веднъж в таблицата с продукти):
Пример. Намерете броя на наличните различни модели, произведени от производител A. Заявката е подобна на предишната, в която се изискваше да се определи общият брой модели, произведени от производител A. Тук се изисква да се намери броят на различните модели в компютърната таблица (т.е. налични за продажба).
За да се гарантира, че се използват само уникални стойности при получаване на статистически показатели, когато аргумент на агрегатната функцияможе да се използва DISTINCT параметър. Друг параметър ВСИЧКИе по подразбиране и очаква да преброи всички върнати стойности в колоната. Оператор,
Ако трябва да получим броя на моделите компютри, произведени от всекипроизводител, ще трябва да използвате ГРУПИРАНЕ ПО оферта, синтактично следващ след WHERE клаузи.
ИЗБЕРЕТЕ модел, COUNT(model) AS Qty_model, AVG(price) AS Avg_price ОТ КОМПЮТЪР ГРУПИРАНЕ ПО модел; |
модел | Кол_модел | Средна_цена |
1121 | 3 | 850.0 |
1232 | 4 | 425.0 |
1233 | 3 | 843.33333333333337 |
1260 | 1 | 350.0 |
Ако имаше колона с дата в SELECT, тогава щеше да е възможно да се изчислят тези показатели за всяка конкретна дата. За да направите това, трябва да добавите датата като колона за групиране и след това агрегатните функции ще бъдат изчислени за всяка комбинация от стойности (моделна дата).
Има няколко специфични правила за изпълнение на агрегатни функции:
Така че, ако искането не съдържа ГРУПИРАНЕ ПО оферти, Че агрегатни функциивключен в Клауза SELECT, се изпълняват върху всички получени низове на заявки. Ако искането съдържа ГРУПИРАНЕ ПО оферта, всеки набор от редове, който има същите стойности на колоната или групата колони, посочени в оферта ГРУПИРАНЕ ПО, съставлява група и агрегатни функцииизвършва се за всяка група поотделно.
Ако WHERE клаузаслед това дефинира предикат за филтриране на низове клауза HAVINGприложено след групиранеза дефиниране на подобен предикат, филтриращи групи по стойности агрегатни функции. Тази клауза е необходима за валидиране на стойностите, които са получени с агрегатна функцияне от отделни редове на източника на запис, дефиниран в клауза FROM, и от групи от такива линии. Следователно такава проверка не може да се съдържа в WHERE клауза.