[МУЗЫКА] [МУЗЫКА] Рассмотрим использование функций агрегирования в селекции. Под функцией агрегирования мы понимаем некую функцию, которая обрабатывает множество строк и выдает в качестве результата одно значение в зависимости от выбранного алгоритма. Какие функции агрегирования положены стандартом SQL? Их всего пять: это среднее значение, это количество строк, максимум, минимум и сумма выбранных значений. Как функции агрегирования обрабатывают незаданные значения, если таковые появятся в нашей выборке? Некоторые СУБД игнорируют такие значения, а некоторые считают его равным нулю. Все функция агрегирования, кроме подсчета количества строк, должны выполняться над численными значениями. Рассмотрим простейший синтаксис для использования функции агрегирования, где их можно писать в запросе. В простейшем случае мы указываем имя функции агрегирования сразу после слова SELECT. Что может являться выражением функции агрегирования? Это могут быть любые поля, которые есть у нашей таблицы. Это могут быть константы, какие-то комбинации из наших полей, констант и других функций. Рассмотрим простейший пример использования функции агрегирования в запросе. Мы будем использовать функцию COUNT, которая подсчитывает общее количество строк. Для этого мы написали SELECT, дальше функция агрегирования, мы назвали ее словом COUNT. Дальше, когда мы используем звездочку, это означает, что нам нужно сосчитать все строки, которые есть в исходной выборке. Мы назвали это поле количеством студентов и берем выборку из таблицы STUDENT. Следующий пример, который мы рассмотрим, это функция агрегирования с использованием опции факторизации. Если мы перед именем полей указываем ключевое слово DISTINCT, это значит, что мы будем подсчитывать или агрегировать только уникальные значения строк нашей выборки. В этом примере мы хотим сосчитать количество групп. Надо обязательно добавить квантор факторизации, чтобы не сосчитать одну и ту же группу несколько раз. Для этого мы пишем SELECT COUNT, в круглых скобках DISTINCT, дальше имя группы из таблицы STUDENT. На следующем примере мы видим пример подсчета среднего балла сдачи всех экзаменов. Мы берем выборку из всех строк таблицы «Экзаменационная ведомость» и вычисляем средний балл, называем результирующее поле AVGMark, средний балл. Можно выполнять в одном запросе несколько функций агрегирования. Например, мы хотим выбрать из нашей таблицы STUDENT самого старшего и самого младшего. Для этого мы пишем функции агрегирования минимум по дате рождения и максимум по дате рождения из таблицы STUDENT. Заметим, что кроме агрегатной функции, если уж мы начали использовать их после функции SELECT, мы пока не использовали ни одного поля. Это говорит о том, что если мы не группировали никак поля нашей таблицы, то вместе с функциями агрегирования употреблять названия полей мы не можем. Как группировать значения наших строк по какому-то критерию? Для этого мы должны использовать ключевое слово GROUP BY и после этого указать критерии, по которым мы группируем строки в определенные множества. Посмотрим на запрос с использованием группировки. Например, выведем количество студентов, которые обучаются в каждой группе. Для этого мы указываем функции агрегирования, мы считаем количество, то есть используем функцию COUNT. В круглых скобочках, параметры, мы пишем звездочку, называем это количеством студентов в группе, группируем это по номеру группы. И вот если мы использовали группировку, то поля, по которым мы группировали наши строки, могут быть использованы вместе с функцией агрегирования после ключевого слова SELECT. Приведем пример группировки по двум полям. Например, мы сгруппируем нашу экзаменационную ведомость по номеру аудитории и по дате экзамена. Посмотрим, сколько экзаменов в день проводилось в каждой конкретной аудитории. Для этого после GROUP BY мы перечисляем все поля, по которым мы проводим группировку, и эти поля могут быть использованы вместе с функциями агрегирования после слова SELECT. Результатом данной выборки мы увидим список аудиторий, даты и количество экзаменов, которые в этот день проводились в данной аудитории. Следующий пример, чтобы еще полнее показать возможности функции агрегирования. Выполним запрос, как даты рождения студентов распределены по годам. Мы группируем уже не просто по значениям какого-то определенного поля, а выполняем над этими полями функцию. Мы извлекаем только год из даты рождения. Таким образом, наш запрос выглядит так: после слова GROUP BY мы пишем функцию, которая извлекает год из даты рождения, и после слова SELECT мы выводим этот год, называем это поле «год» и выводим количество студентов, которые в этот год родились. Если мы используем группировку, то мы можем ограничить исходную выборку, накладывая условие на группы, которые получатся в результате нашей выборки. Мы сгруппируем строки экзаменационной ведомости по идентификатору студентов и выберем только те группы, в которых минимальная оценка равна пяти. Таким образом мы сможем выбрать всех отличников.