Функция за сумиране в SQL: SUM. SQL агрегатни функции - пример за SUM, MIN, MAX, AVG, COUNT DISTINCT

06.04.2023

Да се ​​научим да обобщаваме. Не, това не са резултатите от изучаването на SQL, а резултатите от стойностите на колоните на таблиците на базата данни. SQL агрегатните функции работят върху стойностите на колона, за да произведат една стойност на резултата. Най-често използваните SQL агрегатни функции са SUM, MIN, MAX, AVG и COUNT. Има два случая, в които трябва да се използват агрегатни функции. Първо, агрегатните функции се използват сами и връщат една стойност на резултата. Второ, агрегатните функции се използват с клаузата SQL GROUP BY, тоест с групиране по полета (колони), за да се получат получените стойности във всяка група. Разгледайте първо случаите на използване на агрегатни функции без групиране.

SQL SUM функция

Функцията 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

Функцията SQL MIN работи и с колони, чиито стойности са числа, и връща минималната от всички стойности в колоната. Тази функция има синтаксис, подобен на този на функцията SUM.

Пример 3Базата данни и таблицата са същите като в пример 1.

Необходимо е да разберете минималната заплата на служителите от отдел номер 42. За да направите това, ние пишем следната заявка (на MS SQL Server - с префикса USE company1;):

Заявката ще върне стойността 10505.90.

И отново упражнение за независимо решение . В това и някои други упражнения ще ви трябва не само таблицата Staff, но и таблицата Org, съдържаща данни за подразделенията на компанията:


Пример 4Таблицата Org се добавя към таблицата Staff, съдържаща данни за подразделенията на компанията. Изведете минималния брой години, през които един служител е работил в отдел, разположен в Бостън.

Функция SQL MAX

Функцията SQL MAX работи по подобен начин и има подобен синтаксис, който се използва, когато искате да определите максималната стойност сред всички стойности на колона.

Пример 5

Необходимо е да разберете максималната заплата на служителите от отдел номер 42. За да направите това, ние пишем следната заявка (на MS SQL Server - с префикса USE company1;):

Заявката ще върне стойността 18352.80

Време е упражнения за самоопределяне.

Пример 6Отново работим с две таблици - Staff и Org. Покажете името на отдела и максималния размер на комисионните, получавани от един служител в отдела, който принадлежи към групата отдели (Division) East. Използвайте JOIN (съединяване на таблици) .

SQL AVG функция

Казаното за синтаксиса за предишните описани функции е вярно и за функцията SQL AVG. Тази функция връща средната стойност на всички стойности в колона.

Пример 7Базата данни и таблицата са същите като в предишните примери.

Нека се изисква да разберете средната продължителност на службата на служителите от отдел номер 42. За да направите това, ние пишем следната заявка (на MS SQL Server - с префикса USE company1;):

Резултатът ще бъде 6,33

Пример 8Работим с една маса - Персонал. Покажете средната заплата на служители с опит от 4 до 6 години.

Функция SQL COUNT

Функцията 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. Клаузата SQL GROUP BY се използва за групиране на получените стойности по колони в таблица на база данни. Сайтът има урок, посветен на този оператор отделно .

Ще работим с база данни "Портал за обяви 1". Скриптът за създаване на тази база данни, нейната таблица и попълването на таблицата с данни е във файла на този линк .

Пример 12.И така, има база данни на рекламния портал. Има таблица с реклами, която съдържа данни за рекламите, които са изпратени за седмицата. Колоната „Категория“ съдържа данни за големи рекламни категории (например „Недвижими имоти“), а колоната „Части“ съдържа данни за по-малки части, включени в категориите (например частите от апартаменти и вили са части от категорията „Недвижими имоти“). Колоната Единици съдържа данни за броя на изпратените реклами, а колоната Пари съдържа сумата пари, спечелени за изпращане на реклами.

КатегориячастЕдинициПари
транспортмоторни превозни средства110 17600
Недвижим имотАпартаменти89 18690
Недвижим имотДачи57 11970
транспортМотоциклети131 20960
строителни материалиДъски68 7140
електроинженерствотелевизори127 8255
електроинженерствоХладилници137 8905
строителни материалиRegips112 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 (Expression) - определя броя на записите в изходния набор на SQL заявката;
  • Min / Max (Expression) - определя най-малката и най-голямата от набора от стойности в определено поле на заявката;
  • Avg (Expression) - тази функция ви позволява да изчислите средната стойност на набора от стойности, съхранени в конкретно поле от записите, избрани от заявката. Тя е средно аритметично, т.е. сумата от стойностите, разделена на техния брой.
  • Сума (израз) - изчислява сумата на набора от стойности, съдържащи се в конкретно поле от записите, избрани от заявката.

Най-често имената на колони действат като изрази. Изразът може също да бъде оценен на стойностите на няколко таблици.

Всички тези функции работят със стойности в една колона на таблица или с аритметичен израз и връщат една стойност. Функциите 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 :

  • HAVING изключва групи с резултати с обобщени стойности от набора от данни за резултатите;
  • WHERE изключва записи, които не отговарят на условието, от изчисляването на агрегирани стойности чрез групиране;
  • агрегатните функции не могат да бъдат посочени в условието за търсене 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.

SQL - Урок 11. Обобщаващи функции, изчисляеми колони и изгледи

Крайните функции се наричат ​​още статистически, агрегатни или сумиращи. Тези функции обработват набор от редове, за да преброят и върнат една стойност. Има пет такива функции:
  • AVG() Функцията връща средната стойност на колона.

  • COUNT() Функцията връща броя на редовете в колона.

  • MAX() Функцията връща най-голямата стойност в колона.

  • MIN() Функцията връща най-малката стойност в колона.

  • SUM() Функцията връща сумата от стойностите на колоните.

Един от тях - COUNT() - вече се запознахме в урок 8. Сега нека се запознаем с останалите. Да предположим, че искаме да знаем минималната, максималната и средната цена на книгите в нашия магазин. След това от таблицата Цени (цени) трябва да вземете минималните, максималните и средните стойности за ценовата колона. Заявката е проста:

ИЗБЕРЕТЕ МИН.(цена), МАКС.(цена), СР.(цена) ОТ цени;

Сега искаме да разберем за колко доставчикът "Печатница" (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, MIN, MAX, AVG и SUM). Ако тази клауза липсва и се използват агрегатни функции, тогава всички колони с имената, споменати в ИЗБЕРЕТЕ, трябва да бъдат включени в агрегатни функциии тези функции ще се прилагат към целия набор от редове, които отговарят на предиката на заявката. В противен случай всички колони от списъка SELECT, които не са включенив агрегатни функции, трябва да бъдат посочени V оферта ГРУПАОТ. В резултат на това всички изходни редове на заявката са разделени на групи, характеризиращи се със същите комбинации от стойности в тези колони. След това към всяка група ще бъдат приложени агрегатни функции. Имайте предвид, че за GROUP BY всички NULL стойности се третират като равни, т.е. при групиране по поле, съдържащо стойности NULL, всички такива редове ще попаднат в една група.
Ако ако има клауза GROUP BY, в клаузата SELECT няма агрегатни функции, тогава заявката просто ще върне по един ред от всяка група. Тази функция, заедно с ключовата дума DISTINCT, може да се използва за премахване на дублиращи се редове в набор от резултати.
Помислете за прост пример:
ИЗБЕРЕТЕ модел, COUNT(model) AS Qty_model, AVG(price) AS Avg_price
ОТ КОМПЮТЪР
ГРУПИРАНЕ ПО модел;

В тази заявка за всеки модел компютър се определя техният брой и средна цена. Всички редове с една и съща стойност на модела (номер на модела) образуват група и изходът SELECT изчислява броя на стойностите и средните ценови стойности за всяка група. Резултатът от заявката ще бъде следната таблица:
модел Кол_модел Средна_цена
1121 3 850.0
1232 4 425.0
1233 3 843.33333333333337
1260 1 350.0

Ако имаше колона с дата в SELECT, тогава щеше да е възможно да се изчислят тези показатели за всяка конкретна дата. За да направите това, трябва да добавите датата като колона за групиране и след това агрегатните функции ще бъдат изчислени за всяка комбинация от стойности (моделна дата).

Има няколко специфични правила за изпълнение на агрегатни функции:

  • Ако в резултат на искането няма получен ред(или повече от един ред за тази група), тогава няма начални данни за изчисляване на която и да е от агрегатните функции. В този случай резултатът от изпълнението на функциите COUNT ще бъде нула, а резултатът от всички останали функции ще бъде NULL.
  • Аргументагрегатна функция сам по себе си не може да съдържа агрегатни функции(функция от функция). Тези. в една заявка е невъзможно, да речем, да се получат максимум средни стойности.
  • Резултатът от изпълнението на функцията COUNT е цяло число(ЦЯЛО ЧИСЛО). Други агрегатни функции наследяват типовете данни на обработените стойности.
  • Ако при изпълнение на функцията SUM е получен резултат, който надвишава максималната стойност на използвания тип данни, грешка.

Така че, ако искането не съдържа ГРУПИРАНЕ ПО оферти, Че агрегатни функциивключен в Клауза SELECT, се изпълняват върху всички получени низове на заявки. Ако искането съдържа ГРУПИРАНЕ ПО оферта, всеки набор от редове, който има същите стойности на колоната или групата колони, посочени в оферта ГРУПИРАНЕ ПО, съставлява група и агрегатни функцииизвършва се за всяка група поотделно.

ИМА оферта

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