- •Введение
- •1. Основные понятия и определения
- •1.1. Информационные системы и банк данных
- •1.2. Назначение и основные компоненты банка данных
- •1.3. Архитектура базы данных. Физическая и логическая независимость данных
- •1.4. Системы управления базами данных
- •1.5. Оперативные и аналитические системы
- •1.6. Требования, предъявляемые к базам данных
- •2. Модели данных
- •2.1. Иерархическая модель данных
- •2.2. Сетевая модель
- •2.3. Реляционная модель
- •2.4. Постреляционная модель
- •2.5. Многомерная модель
- •2.6. Объектно-ориентированная модель
- •2.7. Объектно-реляционная модель данных
- •3. Реляционная модель данных
- •3.1. Основные определения
- •3.1.1. Определение отношения, домена, кортежа, реляционной базы данных, ключей
- •3.1.2. Классы отношений
- •Объектное отношение "Детали"
- •3.1.3. Индексирование
- •3.1.4. Связи между отношениями (таблицами) Обычно база данных представляет собой набор связанных таблиц. Связывание таблиц дает следующие преимущества:
- •3.1.5. Обеспечение целостности данных
- •3.2. Операции реляционной алгебры
- •3.2.1. Основные понятия
- •3.2.2. Базовые теоретико-множественные операции реляционной алгебры
- •3.2.3. Специальные операции реляционной алгебры
- •3.3. Реляционное исчисление
- •3.4. Язык запросов по образцу qbe
- •3.5. Структурированный язык запросов sql
- •3.5.1. История развития sql
- •3.5.2. Общая характеристика языка
- •3.5.3. Структура sql
- •3.5.4. Оператор выбора select
- •3.5.5. Применение агрегатных функций и группировки
- •3.5.6. Раздел order by и ключевое слово top
- •3.5.7. Вложенные запросы
- •3.5.8. Внутренние и внешние объединения
- •3.5.9. Перекрестные запросы
- •3.5.10. Операторы манипулирования данными
- •3.5.11. Запросы на создание таблиц
- •3.5.12. Использование языка определения данных
- •Строка данных
- •Числовые типы данных.
- •3. Дата и время.
- •4. Проектирование баз данных
- •4.1. Этапы проектирования бд
- •4.2. Проблемы проектирования реляционных баз данных
- •Сотрудники_Телефоны_Комнаты
- •Сотрудники_Телефоны_Комнаты
- •4.3. Нормализация отношений
- •4.4. Метод сущность-связь
- •Средства автоматизации проектирования
- •4.5.1. Основные определения
- •4.5.2. Модели жизненного цикла
- •4.5.3. Модели структурного проектирования
- •4.5.4. Объектно-ориентированные модели
- •4.5.5. Классификация case-средств
- •5. Физические модели баз данных
- •5.1. Файловые структуры, используемые в базах данных
- •5.2. Хешированные файлы
- •5.2.1. Стратегия разрешения коллизий с областью переполнения
- •5.2.2. Организация стратегии свободного замещения
- •5.3. Индексные файлы
- •5.3.1. Файлы с плотным индексом, или индексно-прямые файлы
- •5.3.2. Файлы с неплотным индексом, или индексно-последовательные файлы
- •5.3.3. Организация индексов в виде b-tree (в-деревьев)
- •5.4. Моделирование отношений «один-ко-многим» на файловых структурах
- •5.5. Инвертированные списки
- •5.6. Модели бесфайловой организации данных
- •6. Защита информации в базах данных
- •6.1. Общие подходы к обеспечению безопасности данных
- •6.2. Назначение и проверка полномочий, проверка подлинности
- •6.3. Средства защиты базы данных
- •7. Распределенные базы данных
- •7.1. Организация базы данных в локальной сети
- •7.2. Модели архитектуры клиент-сервер
- •Передача данных из бд
- •Удаленный доступ к данным
- •Распределенная бд
- •7.3. Управление распределенными данными
- •Заключение
- •Библиографический список
- •Оглавление
- •Учебное издание
- •394026 Воронеж, Московский просп., 14
3.5.5. Применение агрегатных функций и группировки
В разделе GROUP BY задается список полей группировки. GROUP BY группирует записи данных и объединяет в одну запись все записи данных, которые содержат идентичные значения в указанном поле (или полях).
В SQL добавлены дополнительные функции, которые позволяют вычислять обобщенные групповые значения. Для применения агрегатных функций предполагается предварительная операция группировки. При группировке все множество кортежей отношения разбивается на группы, в которых объединяются кортежи, имеющие одинаковые значения атрибутов, которые заданы в списке группировки.
Например, сгруппируем отношение R1 по значению столбца Дисциплина. Мы получим 3 группы, для которых можем вычислить некоторые групповые значения, например количество кортежей в группе, максимальное или минимальное значение столбца Оценка.
Это осуществляется с помощью агрегатных функций. Агрегатные функции вычисляют одиночные значения для каждой группы таблицы. Список агрегатных функций представлен в табл. 3.2.
Таблица 3.2
Агрегатные функции
Функция |
Результат |
COUNT |
Количество строк или непустых значений полей, которые выбрал запрос |
SUM |
Сумма всех выбранных значений данного поля |
AVG |
Среднеарифметическое значение всех выбранных значений данного поля |
MIN |
Наименьшее из всех выбранных значений данного поля |
MAX |
Наибольшее из всех выбранных значений данного поля |
Агрегатные функции применяются подобно именам полей в операторе SELECT, но они используют имя поля как аргумент. С функциями SUM И AVG могут использоваться только числовые поля. С функциями COUNT, MAX, MIN могут использоваться как числовые, так и символьные поля. При использовании с символьными полями MAX и MIN будут транслировать их в эквивалент ASCII кода и обрабатывать в алфавитном порядке.
Например, можно вычислить количество студентов, сдавших экзамены по каждой дисциплине. Для этого надо выполнить запрос с группировкой по полю «Дисциплина» и вывести в качестве результата название дисциплины и количество строк в группе по данной дисциплине. Применение символа * в качестве аргумента функции COUNT означает подсчет всех строк в группе.
SELECT R1.Дисциплина, COUNT(*)
FROM R1
GROUP BY R1.Дисциплина;
Результат:
Дисциплина |
COUNT(*) |
Базы данных |
3 |
Моделирование |
3 |
Сети ЭВМ |
3 |
Если же необходимо определить количество студентов, сдавших экзамен по каждой дисциплине, то необходимо исключить неопределенные значения из исходного отношения перед группировкой. В этом случае запрос будет выглядеть следующим образом:
SELECT R1.Дисциплина, COUNT(*)
FROM R1
WHERE R1.Оценка IS NOT NULL
GROUP BY R1.Дисциплина;
Результат:
Дисциплина |
COUNT(*) |
Базы данных |
3 |
Моделирование |
2 |
Сети ЭВМ |
3 |
В этом случае строка со студентом
Миронов А.В. |
Моделирование |
Null |
не попадет в набор кортежей перед группировкой, поэтому количество кортежей в группе для дисциплины «Моделирование» будет на 1 меньше.
Можно применять агрегатные функции также и без операции предварительной группировки, в этом случае все отношение рассматривается как одна группа и для этой группы можно вычислить одно значение на группу. Найдем количество студентов, успешно сдавших экзамены:
SELECT COUNT(*)
FROM R1 WHERE Оценка > 2;
Аргументом агрегатных функций могут быть отдельные столбцы таблиц. Но для того, чтобы вычислить, например, количество различных значений некоторого столбца в группе, необходимо применить ключевое слово DISTINCT совместно с именем столбца. Вычислим количество различных оценок, полученных по каждой дисциплине:
SELECT R1.Дисциплина, COUNT (DISTINCT R1.Оценка)
FROM R1 WHERE R1.Оценка IS NOT NULL
GROUP BY R1.Дисциплина;
Результат:
Дисциплина |
COUNT(DISTINCT R1.Оценка) |
Базы данных |
3 |
Моделирование |
2 |
Сети ЭВМ |
2 |
В результат можно включить значение поля группировки и несколько агрегатных функций, а в условиях группировки можно использовать несколько полей. При этом группы образуются по набору заданных полей группировки. Операции с агрегатными функциями могут быть применимы к нескольким исходным таблицам. Например, определить для каждой группы и каждой дисциплины количество студентов, успешно сдавших экзамен, и средний балл по дисциплине.
SELECT R2.Группа, R1. Дисциплина, COUNT(*), AVG(Оценка) FROM R1, R2
WHERE R1.ФИО = R2.ФИО AND
R1.Оценка IS NOT NULL AND R1.Оценка >2
GROUP BY R2.Группа, R1.Дисциплина;
Результат:
Группа |
Дисциплина |
COUNT(*) |
AVG (Оценка) |
ВМ-021 |
Базы данных |
2 |
3,67 |
ВМ-021 |
Моделирование |
2 |
4,5 |
ВМ-022 |
Сети ЭВМ |
3 |
4,67 |
Рассмотрим в качестве другого примера отношения-таблицы F и Q из базы данных «Банк», в которой содержится информация о счетах в филиалах некоторого банка:
F = (N, ФИО, Филиал, ДатаОткрытия, ДатаЗакрытия, Остаток);
Q = (Филиал, Город).
Определим суммарный остаток на счетах в филиалах:
SELECT Филиал, SUM(Остаток)
FROM F GROUP BY Филиал;
Группа состоит из строк с одинаковым значением поля Филиал, и функция SUM применяется отдельно для каждой такой группы, то есть суммарный остаток на счетах подсчитывается отдельно для каждого филиала. Значение поля, к которому применяется GROUP BY, имеет, по определению, только одно значение на группу вывода, как и результат работы агрегатной функции. Поэтому мы можем совместить в одном запросе агрегат и поле.
Рассмотрим еще несколько примеров на применение группировки и агрегатных функций.
Пусть даны следующие таблицы:
Дисциплины (Код_дисциплины, Название_дисциплины);
Группы (Шифр_группы, Факультет, Специальность, Курс);
Студенты (Номер_зачетки, Шифр_группы, Фамилия. Имя, Отчество, Дата_рождения);
Экзамены (Код_дисциплины, Номер_зачетки, Семестр, Дата, Оценка).
Ключевые поля подчеркнуты. Таблицы Группы и Студенты связаны по полю Шифр_группы, таблицы Студенты и Экзамены связаны по полю Номер_зачетки, таблицы Дисциплины и Экзамены связаны по полю Код_дисциплины.
Пример 1. Определить количество студентов в каждой группе.
Select Шифр_группы, count(Номер_зачетки) As Кол_студентов
From Студенты Group by Шифр_группы;
Пример 2. Определить количество студентов в каждой группе и дополнительно вывести факультет.
Select Факультет, С.Шифр_группы,
count(Номер_зачетки) As Кол_студентов
From Группы Г, Студенты С
Where Г.Шифр_группы = С.Шифр_группы
Group by Факультет, С.Шифр_группы;
Пример 3. Определить количество групп каждой специальности и курса.
Select Специальность, Курс, count(Шифр_группы)
As Кол_групп
From Группы
Group by Специальность, Курс;
Пример 4. Определить среднюю оценку по каждой дисциплине в каждой группе.
Select Название_дисциплины, Шифр_группы, avg(Оценка) As Средняя_оценка
From Студенты С, Экзамен Э, Дисциплины Д
Where (С.Номер_зачетки=Э.Номер_зачетки) and
(Э.Код_дисциплины=Д.Код_дисциплины)
Group by Название_дисциплины, Шифр_группы;
В разделе HAVING задаются предикаты-условия, накладываемые на каждую группу. HAVING используется для фильтрации записей, полученных в результате группировки. WHERE определяет, какие записи должны участвовать в группировании, т.е. фильтрует до группирования. HAVING определяет, какие из получившихся в результате группировки записей будут включены в результирующую выборку, т.е. фильтрует записи после группирования.
Имеются две таблицы, связанные по полю Филиал.
F (N, ФИО, Филиал, ДатаОткрытия, ДатаЗакрытия, Остаток)
Q (Филиал, Город)
Пример 1. Определить суммарные значения остатков на счетах, которые превышают 5000. Чтобы увидеть суммарные остатки свыше 5000, необходимо использовать предложение HAVING. Предложение HAVING определяет критерии, используемые, чтобы удалять определенные группы из вывода, точно так же, как предложение WHERE делает это для индивидуальных записей.
SELECT Филиал, SUM(Остаток)
FROM F
GROUP BY Филиал
HAVING SUM(Остаток) > 5000;
Аргументы в предложении HAVING подчиняются тем же самым правилам, что и в предложении SELECT, где используется GROUP BY. Они должны иметь одно значение на группу вывода.
Пример 2. Определить суммарные остатки на счетах филиалов в Воронеже, Липецке, Курске:
SELECT Филиал, SUM(Остаток)
FROM F, Q
WHERE F.Филиал = Q.Филиал
GROUP BY Филиал
HAVING Город IN («Воронеж», «Липецк», «Курск»);
Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть TRUE.
Пример 3. Пусть даны две таблицы Группы (Шифр_группы, Специальность, Факультет), Студенты (Номер_зачетки, Шифр_группы, Фамилия, Имя, Отчество). Определить группы, где количество студентов больше 20.
Select Шифр_группы, count(Номер_зачетки)
As Кол_студентов From Студенты
Group by Шифр_группы
Having count(Номер_зачетки) > 20;
Пример 4. Определить количество студентов в каждой группе специальности ВМ.
Select Специальность, С.Шифр_группы,
count(Номер_зачетки) As Кол_студентов
From Студенты С, Группы Г
Where С.Шифр_группы = Г.Шифр_группы
Group by Специальность, С.Шифр_группы
Having Специальность = “ВМ”;