Файл: Базы данных Учебное пособие.pdf

Добавлен: 28.11.2018

Просмотров: 7750

Скачиваний: 53

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

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 позволяет весь диапазон строк разбить на груп-
пы согласно выражению группирования, в результате чего групповая функция 
будет производить расчет результата для каждой такой группы. В случае, когда 


background image

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 

В данном примере не была использована группировка, а потому группо-

вая функция произвела подсчет для всех строк. 
 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·   


background image

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 г. 

Количество студентов 

В данном примере функция COUNT производит простой подсчет количе-

ства строк, удовлетворяющих условию. В качестве аргумента данной функции 
можно использовать произвольный атрибут. 
 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·   


background image

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  принято  вместо 
простого названия поля таблицы указывать сначала имя таблицы, а затем, после 
точки, – имя поля.  


background image

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

Информационные системы

ВС