ВУЗ: Томский государственный университет систем управления и радиоэлектроники
Категория: Учебное пособие
Дисциплина: Базы данных
Добавлен: 28.11.2018
Просмотров: 7750
Скачиваний: 53
61
ров. Оператор WHERE является необязательным, т. е. при его отсутствии коман-
да DELETE произведет удаление всех записей таблицы, а при его наличии –
только в тех, которые указаны в условии.
· · · · · · · · · · · · · · · · · · · · · · ·
Пример 3.9
· · · · · · · · · · · · · · · · · · · · · · ·
Удалить из таблицы записи о студентах группы 598. Подобный запрос
будет выглядеть следующим образом:
DELETE FROM Студент WHERE Группа = 598;
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · ·
Пример 3.10
· · · · · · · · · · · · · · · · · · · · · ·
Удалить из таблицы запись о студенте Петрове Иване Сергеевиче. По-
добный запрос будет выглядеть следующим образом:
DELETE FROM Студент WHERE ФИО = “Петров Иван Сергее-
вич”;
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
3.6 Групповые функции
Для работы с группой записей и подсчета различных итоговых результа-
тов для групп в языке SQL существуют групповые функции. Принцип работы
групповой функции состоит в выведении одного результирующего значения
для группы строк. Групповые функции используются вместе с оператором SE-
LECT, который в таком случае имеет следующий синтаксис:
SELECT [столбец|выражение,]групповая_функция
FROM таблица1, …
[WHERE условие]
[GROUP BY выражение_группирования]
[HAVING условие_включения_группы]
[ORDER BY {столбец | выражение [ASC | DESC], … }];
По сравнению с простым запросом групповой запрос обязательно содер-
жит групповую функцию, а также может содержать операторы GROUP BY и
HAVING. Оператор GROUP BY позволяет весь диапазон строк разбить на груп-
пы согласно выражению группирования, в результате чего групповая функция
будет производить расчет результата для каждой такой группы. В случае, когда
62
оператор GROUP BY отсутствует, групповая функция работает для всего набора
строк из таблицы. Оператор HAVING позволяет производить фильтрацию ито-
говых строк согласно некоторому условию включения группы. В таблице 3.8
приведены наиболее часто используемые групповые функции.
Таблица 3.8 – Групповые функции языка SQL
Функция
Описание
AVG()
Вычисляет среднее арифметическое набора число-
вых значений поля запроса по группе записей
COUNT() Вычисляет количество записей в группе
MAX()
Возвращает максимальное значение указанного по-
ля из группы записей
MIN()
Возвращает минимальное значение указанного поля
из группы записей
SUM()
Вычисляет сумму значений указанного поля по
группе записей
Функции AVG и SUM могут применяться только к столбцам с числовыми
данными, а функции MAX, MIN и COUNT – к столбцам любого типа.
· · · · · · · · · · · · · · · · · · · · · · ·
Пример 3.11
· · · · · · · · · · · · · · · · · · · · · ·
Расчет суммарной стипендии всех студентов из таблицы «Студент», реа-
лизуемый с помощью запроса SELECT SUM(Стипендия) AS ‘Суммарная
стипендия’ FROM Студент, приведен в таблице 3.9.
Таблица 3.9 – Суммарная стипендия всех студентов
Суммарная стипендия
9000
В данном примере не была использована группировка, а потому группо-
вая функция произвела подсчет для всех строк.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
63
· · · · · · · · · · · · · · · · · · · · · · ·
Пример 3.12
· · · · · · · · · · · · · · · · · · · · · ·
Расчет суммарной стипендии в каждой группе из таблицы «Студент», ре-
ализуемый с помощью запроса SELECT SUM(Стипендия) AS ‘Суммар-
ная стипендия’ FROM Студент GROUP BY Группа, приведен в табли-
це 3.10.
Таблица 3.10 – Суммарная стипендия в каждой группе
Группа
Суммарная стипендия, руб.
116
5000
598
500
446
3500
В данном примере с помощью группировки все строки были разбиты на
3 группы строк, в которых у каждой записи было одинаковым значение поля
«Группа», и групповая функция произвела подсчет суммы для каждой из этих
групп.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · ·
Пример 3.13
· · · · · · · · · · · · · · · · · · · · · ·
Подсчёт количества студентов, родившихся после 01.01.1990 г., реализу-
емый с помощью запроса SELECT COUNT(ФИО) AS ‘Количество сту-
дентов’
FROM
Студент
WHERE
«Дата
рождения»
>
«01.01.1990», приведен в таблице 3.11.
Таблица 3.11 – Количество студентов, родившихся после 1990 г.
Количество студентов
4
В данном примере функция COUNT производит простой подсчет количе-
ства строк, удовлетворяющих условию. В качестве аргумента данной функции
можно использовать произвольный атрибут.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
64
· · · · · · · · · · · · · · · · · · · · · · ·
Пример 3.14
· · · · · · · · · · · · · · · · · · · · · ·
Расчет суммарной стипендии в каждой группе из таблицы «Студент» и
вывод списка только тех групп, в которых суммарная стипендия больше
1 000 руб., реализуемый с помощью запроса SELECT SUM(Стипендия)
FROM Студент GROUP BY Группа HAVING SUM(Стипендия)>1000,
приведен в таблице 3.12.
Таблица 3.12 – Суммарная стипендия в каждой группе
Группа
SUM (Стипендия, руб.)
116
5000
446
3500
В данном примере с помощью оператора HAVING происходит фильтра-
ция результатов группировки и оператор WHERE в таком случае использовать
нельзя, т. к. он работает только с исходным набором строк, но не с полученным
после группировки.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
3.7 Запросы к нескольким таблицам
В большинстве баз данных информация логически распределена по мно-
гим таблицам и для выдачи необходимой пользователю информации данные
приходится запрашивать у двух или более таблиц. В качестве примера рассмот-
рим фрагмент БД «Студенты», который состоит из двух связанных таблиц
«Группа» и «Студент» (рис. 3.1).
Синтаксис команды SELECT позволяет после оператора FROM использо-
вать не одну, а целый набор таблиц, что и позволяет в дальнейшем извлекать
необходимую информацию, логически размещенную в разных таблицах. В тех
ситуациях, когда в запросе используется более одной таблицы, для однознач-
ной идентификации названия полей после команды SELECT принято вместо
простого названия поля таблицы указывать сначала имя таблицы, а затем, после
точки, – имя поля.
65
Рис. 3.1 – Фрагмент БД «Студенты»
Например, вместо SELECT ФИО, Стипендия FROM Студент,
Группа; запрос пишется в виде строки SELECT Студент.ФИО, Сту-
дент.Стипендия FROM Студент, Группа.
Это связано, прежде всего с тем, что в различных таблицах поля могут
иметь одинаковые названия, например, в используемых таблицах нашего при-
мера поле «Группа» имеется в обеих таблицах. Если поле имеет уникальное
имя во всей базе данных, то процессор СУБД позволяет не указывать имя таб-
лицы перед именем поля. Таким образом, в приведенном выше примере допу-
стимыми являются оба варианта запросов, однако в данном разделе для удоб-
ства восприятия информации будет использован синтаксис с полным указанием
таблиц и полей.
3.7.1 Декартово произведение записей таблиц
Самым простым с точки зрения синтаксиса запросом на вывод информа-
ции из нескольких таблиц является так называемое декартово произведение
таблиц. Для нашего примера такой запрос будет выглядеть следующим обра-
зом: SELECT Студент.*, Группа.* FROM Студент, Группа. Данный
запрос выведет все поля и записи из двух таблиц сразу, при этом «умножив»
все записи друг на друга. В результате пользователь получит результат, приве-
Номер ФИО
Группа Стипендия
1
Иванов Сергей Петрович
116
1500
2
Петров Иван Сергеевич
598
500
«Студент»
Группа Специальность
Факультет
116
Электронная техника
ЭТ
445
Менеджмент
Эконом.
«Группа»
3
Алексеев Семен Олегович
445
1500
4
Белов Петр Иванович
116
2500
598
Информационные системы
ВС