Използване на обобщени функции и подзаявки в Select Statement
Към SQL са добавени допълнителни функции, които ви позволяват да изчислявате общи стойности на групата. За да се използват агрегирани функции, се приема предварителна операция за групиране. Каква е същността на операцията по групиране? При групирането целият набор от кортежи на релация се разделя на групи, в които се събират кортежи, които имат еднакви стойности на атрибутите, посочени в списъка за групиране.
Например, нека групираме R1 по стойността в колоната Discipline. Ще получим 4 групи, за които можем да изчислим някои групови стойности, например броя на кортежите в група, максималната или минималната стойност на колоната Резултат.
Това се прави с помощта на агрегирани функции. Обобщените функции изчисляват единична стойност за цялата група таблици. Списъкът на тези функции е представен в таблица 5.7.
Броят на редовете или стойностите на непразни полета, които е избрала заявката
Сумата от всички избрани стойности за това поле
Средната аритметична стойност на всички избрани стойности в това поле
Най-малката от всички избрани стойности за това поле
Най-голямата от всички избрани стойности за това поле
Мрежи и телекомуникации
Мрежи и телекомуникации
Мрежи и телекомуникации
Обобщените функции се използват като имена на полета в оператор SELECT, с едно изключение: те вземат името на полето като аргумент. Само цифровите полета могат да се използват с функциите SUM и AVG. И двете цифрови и символни полета могат да се използват с функциите COUNT, MAX и MIN. Когато се използват с полета за символи, MAX и MIN ще ги преведат в еквивалента на ASCII и ще ги обработят по азбучен ред. Някои СУБД позволяват използването на вложени агрегати, но това е отклонение от стандарта ANSI с всички последващи последствия.
Например можете да изчислите броя на студентите, издържали изпити по всяка дисциплина. За да направите това, трябва да изпълните заявка, групирана от полето "Дисциплина" и да покажете в резултат името на дисциплината и броя на редовете в групата за тази дисциплина. Използването на * като аргумент на функцията COUNT означава преброяване на всички редове в групата.
SELECT R1 дисциплина. СОНТА (*)
ГРУПИРАНЕ ПО R1 Дисциплина
Мрежи и телекомуникации
Ако искаме да преброим броя на онези, които са издържали изпита по която и да е дисциплина, тогава трябва да изключим недефинирани стойности от първоначалното съотношение преди групирането. В този случай заявката ще изглежда така:
SELECT R1 дисциплина. БРОЯ (*)
ОТ R1 КЪДЕ R1.
НЕ Е НУЛЕН резултат
ГРУПИРАНЕ ПО Р. Дисциплина
Мрежи и телекомуникации
В този случай линията с ученика
няма да бъдат включени в набора от кортежи преди групирането, така че броят на кортежите в групата за дисциплината „Теория на информацията“ ще бъде с 1 по-малко.
Обобщените функции могат да се използват и без предварителната операция за групиране, в този случай цялата връзка се счита за една група и за тази група може да се изчисли една стойност на група.
Позовавайки се отново на базата данни на сесията (таблици Rl, R2, R3), намираме броя на успешно издържаните изпити:
WHERE Резултат> 2:
Това, разбира се, е различно от избора на поле, тъй като винаги се връща една стойност, независимо колко реда са в таблицата. Аргументът на агрегираните функции може да бъде отделни колони от таблици. Но за да се изчисли например броят на различните стойности на определена колона в група, е необходимо да се използва ключовата дума DISTINCT заедно с името на колоната. Нека изчислим броя на получените различни оценки за всяка дисциплина:
КЪДЕ R1 НЕ Е НУЛНО
ГРУПИРАНЕ ПО Rl. Дисциплина
БРОЙ (РАЗЛИЧЕН R1. Оценка)
Мрежи и телекомуникации
Резултатът може да включва стойност на поле за групиране и множество обобщени функции, а множество условия могат да се използват в условия на групиране. В този случай групите се формират от набор от определени полета за групиране. Обобщените операции могат да бъдат приложени към обединяването на множество изходни таблици. Например, нека зададем въпроса: определете за всяка група и всяка дисциплина броя на успешно издържалите изпита и средния резултат за дисциплината.