Оператор SELECT – группировка, использование функций СУБД и агрегатных функций
В отношении выбираемых оператором SELECT кортежей язык SQL позволяет применять группировку.
В разделе GROUP BY задается список полей группировки. GROUP BY группирует записи данных и объединяет в одну запись все записи данных, которые содержат идентичные значения в указанном поле (или полях). WHERE определяет, какие записи должны участвовать в группировании, т.е. фильтрует до группирования.
Обратите внимание, что использование GROUP BY отличается от использования DISTINCT. Во втором случае будут отброшены кортежи, которые в текущем представлении совпадают по всем полям (из совпадающих записей остается только один кортеж). Операция группировки приводит исходное отношение к виду, когда ко всем полям, запрошенным на отображение и не указанным в выражении группировки, применяются агрегатные функции. Однако если агрегатные функции не определены, то внешне результаты запросов c GROUP BY и DISTINCT будут идентичны, но в первом случае запрос будет выполняться всегда за большее время.
В разделе HAVING задаются предикаты-условия, накладываемые на каждую группу. HAVING используется для фильтрации записей, полученных в результате группировки. WHERE определяет, какие записи должны участвовать в группировании, т.е. фильтрует до группирования. HAVING определяет, какие из получившихся в результате группировки записей будут включены в результирующую выборку, т.е. фильтрует записи после группирования.
Агрегатные функции SQL – функции, которые позволяют вычислять обобщенные групповые значения. При группировке все множество кортежей отношения разбивается на группы, в которых объединяются кортежи, имеющие одинаковые значения атрибутов, которые заданы в списке группировки.
Таблица 1 – Агрегатные функции SQL
Функция | Результат |
COUNT | Количество строк или непустых значений
полей, которые выбрал запрос |
SUM | Сумма всех выбранных значений данного поля |
AVG | Среднеарифметическое значение всех выбранных значений данного поля |
MIN | Наименьшее из всех выбранных значений данного поля |
MAX | Наибольшее из всех выбранных значений данного поля |
После применения агрегатной функции принято давать имя возвращаемому значению. Для этого применяется оператор AS – задание псевдонима. Рассмотрим применение группировки и агрегатных функций на примере.
Пример 4.
Надо: Вывести количество оценок студентов (отношение R3 и R5 из примера 2) по группам для дисциплины «Моделирование». Выводить только те группы, где количество оценок больше 1.
Решение:SELECT COUNT(*) AS count_mark, r5.Группа FROM r3,r5 WHERE r3.Дисциплина = r5.Дисциплина AND r3.Дисциплина = “Моделирование”GROUP BY r5.ГруппаHAVING COUNT(*) > 1;
Кроме агрегатных функций допустимо включать в текст запроса SQL и функции, определенные в самой СУБД. В табл.2 приведены несколько функций допустимых к применению в среде MS Access 2003, однако в каждой СУБД существует свой набор таких функций, о которых можно узнать из страниц документации конкретного программного средства.
Таблица 2 – Встроенные функции СУБД MS Access
Функция | Результат |
Ucase(выражение) | переводит значения поля «выражение» в верхний регистр; |
Mid(строка, начало_поиска[, длина]) | возвращает строку из поля «строка», начиная с позиции «начало_поиска» длинной – «длина». Если длина не указана, то до конца строки. |
Round(выражение [,количество_десятичных _знаков]) | округляет «выражение» с точностью «количество_десятичных_знаков». Если второй аргумент не указан, то округляет до целого. |
IIF(выражение, truepart, falsepart) | возвращает одно из значений: truepart, если выражение истинно и falsepart – если ложно |
|