Базы данных - модели, разработка, реализация



         

Применение агрегатных функций и вложенных запросов в операторе выбора - часть 2


С функциями SUM и AVG могут использоваться только числовые поля. С функциями COUNT, MAX и MIN могут использоваться как числовые, так и символьные поля. При использовании с символьными полями МАХ и MIN будут транслировать их в эквивалент ASCII кода и обрабатывать в алфавитном порядке. Некоторые СУБД позволяют использовать вложенные агрегаты, но это является отклонением от стандарта ANSI со всеми вытекающими отсюда последствиями.

Например, можно вычислить количество студентов, сдававших экзамены по каждой дисциплине. Для этого надо выполнить запрос с группировкой по полю "Дисциплина" и вывести в качестве результата название дисциплины и количество строк в группе по данной дисциплине. Применение символа * в качестве аргумента функции COUNT означает подсчет всех строк в группе.

  • SELECT R1.Дисциплина. COUNTC*)
  • FROM R1
  • GROUP BY R1 Дисциплина
  • Результат:

    82

    Дисциплина COUNT(*)
    Базы данных 6
    Теория информации 4
    Сети и телекоммуникации 3
    Английский язык 4

    Если же мы хотим сосчитать количество сдавших экзамен по какой-либо дисциплине, то нам необходимо исключить неопределенные значения из исходного отношения перед группировкой. В этом случае запрос будет выглядеть следующим образом:

  • SELECT R1.Дисциплина. COUNT(*). FROM R1
  • WHERE R1.Оценка IS NOT NULL GROUP BY R1.Дисциплина
  • Получим результат:

    Дисциплина COUNT(*)
    Базы данных 6
    Теория информации 3
    Сети и телекоммуникаций 3
    Английский язык 4

    В этом случае строка со студентом

    Миронов А. В. Теория информации Null

    не попадет в набор кортежей перед группировкой, поэтому количество кортежей в группе для дисциплины "Теория информации" будет на 1 меньше.

    Можно применять агрегатные функции также и без операции предварительной группировки, в этом случае все отношение рассматривается как одна группа и для этой группы можно вычислить одно значение на группу.

    Обратившись снова к базе данных "Сессия" (таблицы R1, R2, R3), найдем количество успешно сданных экзаменов:




    Содержание  Назад  Вперед