- •Базы данных
- •Лекция 1 Хранение данных Данные, информация
- •Системы хранения данных на основе файлов
- •База данных
- •Требования к субд
- •Администратор бд (абд)
- •Лекция 2 Модели данных Независимость данных
- •Модель, схема
- •Сетевая модель
- •Лекция 3 Ранние модели Иерархическая модель
- •Лекция 4 Пример базы данных, построенной на сетевой модели Постановка задачи
- •Диаграмма
- •Описание на яод
- •Лекция 5 Реляционная модель Принципы
- •Уточнения
- •Лекция 6 Методы хранения данных и доступа к ним
- •Последовательный метод
- •Прямой метод
- •Индексные методы
- •Индексно-последовательный метод
- •Индексно-произвольный метод
- •Инвертированные списки
- •Хеширование
- •Лекция 7 Реляционная алгебра: определения, изменение отношений
- •Изменение отношений во времени.
- •Лекция 8 Операции реляционной алгебры
- •Булевы операции
- •Выбор; свойства выбора
- •Проекция; свойства проекции
- •Лекция 9 Операции реляционной алгебры (продолжение) Соединение
- •Свойства соединения
- •Лекция 10 Операции реляционной алгебры (продолжение)
- •Деление
- •Постоянные отношения. Переименование атрибутов
- •Эквисоединение, естественное и -соединение
- •Реляционная алгебра. Полнота ограниченного множества операторов
- •Операторы расщепления и фактора
- •Лекция 11 Язык структурных запросов sql
- •Начальные понятия
- •Стандарт ansi
- •Типы данных
- •Интерактивный и встроенный sql
- •Синтаксис
- •Подразделы sql
- •Простейшие действия
- •Функции агрегирования
- •Группировка
- •Возможности форматирования
- •Лекция 12 Язык структурных запросов sql (продолжение) Соединение
- •Вложенные запросы
- •Связанные запросы
- •Предикаты, определенные на подзапросах
- •Объединение
- •Изменение базы данных
- •Лекция 13 Понятие о нормальных формах
- •1 Нормальная форма (1нф)
- •2 Нормальная форма (2нф)
- •3 Нормальная форма (3нф)
- •Нормальная форма Бойса-Кодда (нфбк)
- •4 Нормальная форма (4нф)
- •5 Нормальная форма (5нф) – проекция/соединение
- •Лекция 13 Проектирование данных Процессы проектирования
- •Концептуальное проектирование
- •Логическое проектирование
- •Средства создания модели
- •Лекция 14 Функциональные зависимости
- •Аксиомы вывода
- •Ориентированный ациклический граф вывода
- •Определение реляционной базы данных
- •Представление множества функциональных зависимостей
- •Лекция 15 Покрытия функциональных зависимостей
- •Лемма об эквивалентности фз
- •Неизбыточные покрытия
- •Посторонние атрибуты
- •Канонические покрытия
- •Структура неизбыточных покрытий
- •Оптимальные покрытия
- •3 Нормальная форма
- •Нормализация через декомпозицию и посредством синтеза
- •Нормальная форма Бойса-Кодда
- •Литература
Функции агрегирования
Функции агрегирования возвращают единственное (скалярное) значение для группы кортежей. Всего различают пять таких функций:
COUNT – количество непустых строк или значений атрибутов, отличных от null, удовлетворяющих заданному условию;
SUM – сумма значений атрибута;
AVG – среднее значение атрибута;
MAX – максимальное значение атрибута;
MIN – минимальное значение атрибута.
В команде Select они используются в списке выбираемых полей наряду с именами атрибутов. Их аргументы – имена атрибутов, причем, для SUM и AVG допустимы аргументы только числового типа.
Рассмотрим подробнее функцию COUNT. Она подсчитывает количество всех непустых атрибутов, даже если их значение повторяется. Для исключения повторений используется вариант Distinct. Вариант COUNT(*) подсчитывает количество строк в выборке, включая и пустые, и повторяющиеся. Применять Distinct здесь нельзя. Вариант All позволяет считать все непустые значения атрибута, включая повторяющиеся.
Агрегатные функции применимы не только к атрибутам, но и к выражениям, содержащим атрибуты. В этом случае вариант Distinct запрещен.
Пример
Подсчитать количество продавцов, которые выполняли заказы:
Select COUNT(Distinct ном_прод) From Заказы;
Подсчитать количество продавцов:
Select COUNT(*) From Продавцы;
Подсчитать количество непустых сумм:
Select COUNT(All сумма) From Заказы;
Подсчитать общую сумму заказов в тысячах рублей:
Select SUM(сумма/1000) From Заказы;
Конец примера
Группировка
Нередко при работе с базой данных требуется выполнять какие-то действия с группой записей, объединенных общим свойством. Для этого существует возможность группировки, реализуемая фразой Group By. Записи группируются по одинаковым значениям указанного атрибута. Если при этом в запросе участвует агрегатная функция, она выполняется для каждой группы.
Пример
Выбрать наибольшие суммы заказов для каждого продавца:
Select MAX(сумма), ном_прод From Заказы
Group By ном_прод;
-
Сумма
Ном_прод
1900,1
14
5160,4
12
1098,1
17
1713,2
13
4723,0
11
Конец примера
Фраза Group By может содержать более одного атрибута, по которым группируются записи. В этом случае первый атрибут в списке определяет самую внешнюю группу, второй – группу внутри первой и т.п.
При работе с группами данных может возникнуть необходимость отбирать группы по какому-нибудь признаку, например, определить общие суммы заказов по дням и среди них отобрать те, которые превышают некоторое число. Если бы дело касалось записей, задача легко решалась бы фразой Where: …Where сумма >… . Но к группе она неприменима. Для отбора групп по некоторому признаку используется фраза Having.
Пример
Выбрать дни, в которые сумма заказов превышает 5000:
Select дата, Sum(сумма) From Заказы
Group By дата Having Sum(сумма)>5000;
Конец примера
Фраза Having может содержать не только агрегатную функцию, но и любой атрибут. Единственное требование – чтобы этот атрибут в каждой группе имел одинаковое для группы значение.
Пример
Выбрать наибольшие заказы, выполняемые продавцами, номера которых 12 или17:
Select ном_прод, MAX(сумма) From Заказы
Group By ном_прод Having ном_прод in (12, 17);
Конец примера
И, наконец, естественный запрет на использование вложенных агрегатных функций. Например, для выяснения дня, в который была наибольшая сумма заказов, можно, казалось бы, записать:
Select дата, MAX(SUM(сумма)) From Заказы Group By дата;
Group By предполагает, что групп будет столько, сколько различных дат. С другой стороны, SUM(сумма) применяется к каждой группе, а MAX(SUM(сумма)) для всех групп выработает единственное значение, что противоречит предыдущему утверждению.
