Языки манипулирования данными. Карепова Е.Д. - 14 стр.

UptoLike

Составители: 

27
ГРУППИРОВКА ДАННЫХ
При анализе данных часто возникает потребность подведения итогов,
т.е. необходим отбор данных и выполнение арифметических и статистиче-
ских операций для группы записей. Следует сразу подчеркнуть, что такая об-
работка информации, хотя и является привычной при экономических расче-
тах, формировании отчетов, получении статистической информации, в то же
время не является естественной для операций над отношениями и выходит за
рамки РА и РИ. SQL поддерживает следующие агрегатные (их также назы-
вают суммирующими или групповыми) функции:
SUM([ALL | DISTINCT] expression) вычисляет сумму поля в наборе
записей;
AVG([ALL | DISTINCT] expression) вычисляет среднее значение по-
ля в наборе записей;
MIN(expression) вычисляет минимальное значение поля в наборе за-
писей;
MAX(expression) вычисляет максимальное значение поля в наборе
записей;
COUNT(*) возвращает количество записей в наборе.
COUNT([ALL | DISTINCT] expression) возвращает количество зна-
чений expression в наборе. Ключ DISTINCT указывает на то, что учитывают-
ся только различные значения expression. Ключ ALL в отличие от (*) не под-
считывает записи со значением expression NULL.
Запрос: Подсчитать количество студентов, зарегистрированных в БД.
Решение: SELECT COUNT(*) FROM СТУДЕНТ.
Запрос: Подсчитать количество студентов, сдававших экзамены.
Решение:
SELECT COUNT(DISTINCT ID_Stud) FROM УСПЕВАЕМОСТЬ.
Запрос: Подсчитать количество студентов, сдававших курс K2 хотя бы
один раз.
Решение:
SELECT COUNT(DISTINCT ID_Stud) FROM УСПЕВАЕМОСТЬ
WHERE ID_Subj= ’К2’.
Запрос: Подсчитать количество студентов, сдававших курс K2.
Решение:
SELECT COUNT(ALL ID_Stud) FROM УСПЕВАЕМОСТЬ WHERE
ID_Subj=’К2’.
Запрос: Подсчитать количество студентов, имеющих консультантов.
Решение: SELECT COUNT(ALL Консультант) FROM СТУДЕНТ.
Приведенные выше запросы содержат итоги по всем данным, удовле-
творяющим условию в WHERE. Однако часто агрегатные функции следует
использовать для подведения итогов для каждой группы записей, предвари-
тельно разбитых некоторым образом.
28
В группу собираются записи по одинаковому значению некоторого по-
ля (нескольких полей). Для этих целей существует инструкция SQL
группировать” – GROUP BY. При этом можно пользоваться и инструкцией
WHERE.
Запрос: Подсчитать средний балл каждого студента за первые три се-
местра.
Решение:
SELECT ID_Stud, AVG(Оценка) FROM УСПЕВАЕМОСТЬ
WHERE Семестр >= 1 AND Семестр <= 3
GROUP BY ID_Stud.
Дополнительно SQL допускает отбор значений (выборку) в уже полу-
ченных группах. Для этого используется конструкция HAVING, которая ана-
логична WHERE для отбора по значениям агрегатных функций.
Запрос: Вывести идентификационные номера и средний балл студен-
тов, средний балл которых больше 4,5.
Решение:
SELECT ID_Stud, AVG(Оценка) FROM УСПЕВАЕМОСТЬ
GROUP BY ID_Stud
HAVING AVG(Оценка)>4,5.
Запрос: Отобрать предметы, по которым количество неуспевающих
студентов больше десяти.
Решение:
SELECT ID_Subj, COUNT(ID_Stud) FROM УСПЕВАЕМОСТЬ
WHERE Оценка =2
GROUP BY ID_Subj
HAVING COUNT(ID_Stud)>10.
Общий синтаксис оператора SELECT с группировкой выглядит сле-
дующим образом.
SELECT {column_name | aggregate_expression
[, column_name | aggregate_expression]…}
FROM table_name
[WHERE seach_conditions1 ]
GROUP BY [ALL] {aggregate_free_expression
[, aggregate_free_expression]…}
HAVING seach_conditions2
Существует ряд правил, которые следует соблюдать при использова-
нии группировок и агрегатных функций.
если вцелевом спискесодержатся неагрегатные выражения (име-
на полей, неагрегатные вычисляемые поля и т.д.), то по ним должна прово-
диться группировка, т.е. они должны быть в обязательном порядке быть упо-
мянуты в GROUP BY.