Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Кашина_ТРиЗБД_ЛБ4

.docx
Скачиваний:
0
Добавлен:
03.12.2025
Размер:
256.69 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования

«Владимирский государственный университет

имени Александра Григорьевича и Николая Григорьевича Столетовых» (ВлГУ)

Колледж инновационных технологий и предпринимательства

КАФЕДРА ФИЗИКИ И ПРИКЛАДНОЙ МАТЕМАТИКИ

Лабораторная работа № 4

по дисциплине «Технология разработки и защиты баз данных»

на тему: «Агрегатные функции. Использование встроенных функций.»

Выполнил

студент группы ИПсп-123

Кашина Д. А.

Принял

Кабанова М.Ю.

Владимир, 2025

Цель работы: 1. Изучить используемый в реляционных СУБД оператор извлечения данных из таблиц SELECT и выполнение группировки и сортировки данных.

2. Изучить синтаксис языка модификации данных.

Ход работы:

1 самостоятельное задание.

Для каждой из должностей указать суммарный фонд заработной платы.

/*Кашина 25.05.25

Для каждой из должностей указать суммарный фонд заработной платы.*/

SELECT dolgnost AS Должность,

SUM(ISNULL(salary, 0) + ISNULL(rise, 0)) AS "Сумма запрплат"

FROM [dbo].[Teacher]

GROUP BY dolgnost;

2 самостоятельное задание.

Для каждого факультета, расположенного в корпусе 1, вывести количество групп и общее количество студентов по каждой кафедре.

/*Кашина 25.09.25

Для каждого факультета, расположенного в корпусе 1, вывести количество групп

и общее количество студентов по каждой кафедре.*/

SELECT

k.kod_faculteta,

k.Name_kafedru AS Кафедра,

COUNT(DISTINCT s.Groupname) AS Количество_групп,

COUNT(s.Student_ID) AS Количество_студентов

FROM[Kafedra] k

JOIN [Student1] s ON k.kod_kafedru = s.kod_kafedru

WHERE k.num_korpusa = '1'

GROUP BY k.kod_faculteta, k.Name_kafedru;

3 самостоятельный запрос.

Для каждой кафедры и должности вывести суммарную и среднюю зарплату

преподавателей.

/* Кашина 25.09.25

Для каждой кафедры и должности вывести суммарную и среднюю зарплату преподавателей.*/

SELECT

kod_kafedru,

dolgnost,

SUM(salary + ISNULL(rise, 0)) AS Суммарная_зарплата,

AVG(salary + ISNULL(rise, 0)) AS Средняя_зарплата

FROM dbo.Teacher

GROUP BY kod_kafedru, dolgnost;

4 самостоятельный запрос.

Вывести фамилии доцентов в обратном алфавитном порядке и их зарплату.

/*Кашина 25.05.25

Вывести фамилии доцентов в обратном алфавитном порядке и их зарплату.*/

SELECT name_teacher AS Фамилия, salary AS Зарплата

FROM dbo.Teacher

WHERE dolgnost = 'доцент'

ORDER BY name_teacher DESC;

Запросы по варианту.

  1. Один запрос с использованием группировки по одному столбцу.

/*Кашина 25.05.25

Один запрос с использованием группировки по одному столбцу.

подсчет количества заказов у каждого клиента:*/

SELECT ID_Client, COUNT(*) AS Количество_заказов

FROM [Order]

GROUP BY ID_Client;

  1. Один запрос на использование группировки по нескольким столбцам.

/*Кашина 25.05.25

Один запрос на использование группировки по нескольким столбцам.

подсчет общего количества заказов и суммы по каждому курьеру и статусу заказа*/

SELECT ID_Courier, Order_Status, COUNT(*) AS Количество_заказов, SUM(Total_Cost) AS Общая_сумма

FROM [Order]

GROUP BY ID_Courier, Order_Status;

  1. Один запрос с использованием условия отбора групп HAVING

/*Кашина 25.05.25

Один запрос с использованием условия отбора групп HAVING

выбор курьеров, у которых сумма всех заказов превышает определенное значение (например, 1000)*/

SELECT ID_Courier, SUM(Total_Cost) AS Общая_сумма_заказов

FROM [Order]

GROUP BY ID_Courier

HAVING SUM(Total_Cost) > 1000;

  1. Один запрос с использованием фразы HAVING без фразы GROUP BY

/*Кашина 25.05.25

4. Один запрос с использованием фразы HAVING без фразы GROUP BY

вывести общее количество и сумму заказов, если сумма больше 1000*/

SELECT COUNT(*) AS Количество_заказов, SUM(Total_Cost) AS Общая_сумма

FROM [Order]

HAVING SUM(Total_Cost) > 1000;

  1. Один запрос с использованием сортировки по столбцу.

/* Кашина 25.05.25

5. Один запрос с использованием сортировки по столбцу

вывести клиентов в городе с сортировкой по имени по возрастанию*/

SELECT Name, City

FROM Client

ORDER BY Name ASC;

Контрольные вопросы:

  1. Запросы с группировкой строк

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

Именно для этого предназначена фраза GROUP BY. Она позволяет все множество строк таблицы разделить на группы по признаку равенства значений одного или нескольких столбцов (и выражений над ними).

Фраза GROUP BY должна располагаться вслед за фразой WHERE (если она отсутствует, то за фразой FROM).

Общий синтаксис фразы GROUP BY следующий:

GROUP BY выражение [, выражение]...

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

– константой;

– агрегатной функцией, которая оперирует всеми значениями аргумента в пределах группы и агрегирует их в одно значение (например, в сумму);

– выражением, идентичным стоящему во фразе GROUP BY;

– выражением, объединяющим приведенные выше варианты.

  1. Группировка по столбцам

Группировка по значениям одного столбца является самым простым вариантом использования фразы GROUP BY.

Группировка по нескольким столбцам

SQL позволяет группировать строки таблицы и по нескольким столбцам. В этом случае имена столбцов перечисляются во фразе GROUP BY через запятую.

  1. Условие отбора групп.

Предположим, что нужно вывести номера кафедр, у которых суммарное количество работающих профессоров более 1. Приведенная ниже формулировка запроса является неверной:

SELECT kod_kafedru

FROM Teacher

WHERE COUNT (dolgnost) > 1 and dolgnost=’профессор’

GROUP BY kod_kafedru;

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

WHERE COUNT (dolgnost) > 3 and dolgnost=’профессор’;

*

Ошибка в строке 3;

CRA-00934: групповая функция здесь не разрешена

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

для исходных таблиц, и может использоваться лишь при наличии фразы GROUP BY. В предложении SELECT фразы WHERE, GROUP BY и HAVING обрабатываются в следующем порядке:

– Фразой WHERE отбираются строки, удовлетворяющие указанному в ней условию.

– Фраза GROUP BY группирует отобранные строки.

– Фразой HAVING отбираются группы, удовлетворяющие указанному в ней условию.