Използване на обобщени функции и подзаявки в 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. Оценка)

Мрежи и телекомуникации

Резултатът може да включва стойност на поле за групиране и множество обобщени функции, а множество условия могат да се използват в условия на групиране. В този случай групите се формират от набор от определени полета за групиране. Обобщените операции могат да бъдат приложени към обединяването на множество изходни таблици. Например, нека зададем въпроса: определете за всяка група и всяка дисциплина броя на успешно издържалите изпита и средния резултат за дисциплината.