- •Введение
- •Лабораторное занятие № 1
- •Описание учебного примера.
- •Удаление таблиц
- •Создание таблиц
- •Имена ограничений
- •Ограничения null и not null
- •Ограничение primary key
- •IdSubject, idReport, nTerm));
- •Ограничение unique
- •Ограничение Foreign key
- •Ограничение check
- •Вопросы для самоконтроля к лабораторной работе № 1
- •Лабораторная работа № 2
- •Команда вставки - insert
- •Команда обновления - update
- •Команда удаления - delete
- •Вопросы для самоконтроля к лабораторной работе № 2
- •Лабораторная работа №3
- •Команда alter table
- •Модификация ограничений
- •Добавление ограничений с ограниченной областью проверки
- •Отключение и подключение ограничений
- •Правила для изменения и модификации описания столбцов
- •Добавление столбца
- •Модификация столбца
- •Удаление столбца
- •Удаление таблицы
- •Переименование таблицы
- •Вопросы для самоконтроля к лабораторной работе № 3
- •Лабораторная работа № 4
- •Выборка данных из нескольких таблиц
- •Определение условий выборки в предложении where.
- •Групповые функции и предложение group by
- •Наиболее часто встречающиеся ошибки при выполнении group by
- •Предложение order by
- •Вопросы для самоконтроля к лабораторной работе № 4
- •Лабораторная работа № 5
- •Подзапросы
- •Inner join Student s
- •Inner join Student s
- •Inner join
- •Inner join Student s
- •Вопросы для самоконтроля к лабораторной работе № 5
- •Лабораторная работа №6
- •Представления
- •Вопросы для самоконтроля к лабораторной работе № 6
- •Лабораторная работа №7
- •Хранимые процедуры
- •Оператор use
- •Оператор declare
- •Операторы set и select
- •Функция @@identity
- •Функция @@error
- •Объявление параметров
- •Изменение хранимых процедур
- •Удаление хранимой процедуры
- •Лабораторная работа №8
- •If exists
- •Вопросы для самоконтроля к лабораторной работе № 8
- •Задания в тестовой форме
- •Литература Оглавление
Групповые функции и предложение group by
Групповые функции (см. Приложение 3. Агрегатные функции) обрабатывают множество строк и возвращают, как правило, один результат на группу. По умолчанию все строки таблицы рассматриваются как одна группа. Для более детальной группировки строк используется предложение GROUP BY, которое делит строки на группы. В случае применения предложение GROUP BY предложение SELECT содержать столбцы, идентифицирующие группы остальные столбцы могут быть использованы в предложении Select только как аргументы агрегатных функций.
Пример 62
Задача.
Вывести наибольшую, наименьшую и среднюю оценку для каждого студента.
Решение.
SELECT P.NRecordBook [№ зачетки],
STname [Имя студента],
MAX(Mark) [Максимальная оценка],
MIN(Mark) [Минимальная оценка],
AVG(Mark)[Средняя оценка]
FROM Progress P INNER JOIN Student S
ON P.NRecordBook=S.NRecordBook
GROUP BY P.NRecordBook, StName
Результат реализации запроса:
Для каждой группы будет выведена только одна строка.
С предложением GROUPBYмогут быть использованы все остальные командыSELECT, например, с помощью предложения WHERE можно исключить строки, которые не должны участвовать в запросе, допустим строки с признаком NULL. Рассмотрим это на примере применения агрегированной функции COUNT(). Функция COUNT() с аргументом отличным от *, игнорирует строки с признаком NULL, в то время как функция вида COUNT(*) посчитает все строки, в том числе и строки, в которых есть атрибуты с признакомNULL.
SELECT COUNT(*),
SUM(Mark),
AVG(Mark)
FROM Progress
Результат реализации запроса:
В следующем случае функция COUNT() посчитает строки, в которых оценка NOT NULL, и функции SUM() и AVG() будут учитывать только те строки, в которых оценка NOT NULL.
SELECT COUNT(Mark),
SUM(Mark),
AVG(Mark)
FROM Progress
Результат реализации запроса:
Здесь функция COUNT() будет работать с теми же строками, что и функции SUM() и AVG(). Исключить возможные неоднозначности можно, включив в запрос условие отбора строк: предложение WHERE mark IS Not NULL.
SELECT COUNT(*),
SUM(Mark),
AVG(Mark)
FROM Progress
WHERE Mark IS NOT NULL
Результат реализации запроса:
Однако использование в предложении WHERE агрегированной функции приводит к ошибке.
Пример 63
Задача.
Вывести среднюю оценку по каждой студенческой группе, если средняя оценка выше 3.
Решение.
SELECT NameGroup, AVG(Mark)[Средняя оценка]
FROM Progress P INNER JOIN Student S
ON P.NRecordBook=S.NRecordBook
INNER JOIN SGroup SG
ON S.IDGroup=SG.IDGroup
WHERE AVG(Mark)>3
GROUP BY NameGroup
Результат реализации запроса:
Server: Msg 147
An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.
Пример 64
Задача.
Вывести среднюю оценку по каждой студенческой группе, если средняя оценка выше 3. Значение оценки округлить до одной десятой.
Решение.
SELECT NameGroup, Round(AVG(Mark),1)[Средняя оценка]
FROM Progress P INNER JOIN Student S
ON P.NRecordBook=S.NRecordBook
INNER JOIN SGroup SG
ON S.IDGroup=SG.IDGroup
GROUP BY NameGroup
HAVING AVG(Mark)>3
Результат реализации запроса: