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

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра Систем автоматизированного проектирования

отчет

по лабораторной работе № 5

по дисциплине «Базы Данных»

Тема: Работа с вложенными запросами

Студенты гр. 3352

________________

Гареева К.Р.

________________

Жигунова О.М.

Преподаватель

________________

Горяинов С.В.

Санкт-Петербург

2025

Цель работы

Научиться писать и применять вложенные запросы.

Упражнение 1 - использование вложенных запросов как производных таблиц

Запрос 1

Напишем запрос, который находит взрослых членов библиотеки, у которых больше 3 детей, и показывает для каждого такого взрослого его номер, кол-во детей и поле expr_date (рис. 1). Для этого в скобках вставляем подзапрос, который используется как производная таблица “d”, содержащая читателей с количеством детей большим, чем 3. Таблицу “d” соединим с таблицей “adult” по полю d.adult_member_no = a.member_no.

SELECT

d.adult_member_no, d.No_of_Children, a.expr_date

FROM (

SELECT

adult_member_no, COUNT(*) AS No_of_Children

FROM juvenile

GROUP BY adult_member_no

HAVING COUNT(*) > 3

) AS d

JOIN adult AS a

ON d.adult_member_no = a.member_no;

Рисунок 1 - Результат запроса 1.

Запрос 2

Перепишем предыдущий запрос в виде двух разных запросов. Первый запрос выводит сгруппированный столбец взрослых и количество детей для каждого (рис. 2).

SELECT adult_member_no, COUNT(*) AS No_of_Children

FROM juvenile

GROUP BY adult_member_no

HAVING COUNT(*) > 3;

Рисунок 2 - Результат запроса 2

Запрос 3

Второй запрос выводит взрослого, его кол-во детей и поле expr_date (рис. 3)

SELECT a.member_no, a.expr_date

FROM adult AS a

JOIN juvenile AS j

ON a.member_no = j.adult_member_no;

Рисунок 3 - Результат запроса 3

Упражнение 2- использование подзапросов как выражений:

  1. Использование подзапросов с одним значением

Запрос 4

Для начала узнаем максимальное значение поля loanhis, то есть наибольшее значение оплаченного штрафа. Используем агрегатную функцию MAX() (рис. 4).

SELECT MAX(fine_paid) AS MaxFine

FROM loanhist;

Рисунок 4 - Результат запроса 4

Запрос 5

Теперь напишем запрос, который выводит имя, фамилию и isbn людей с максимальным оплаченным штрафом (рис 5). Подзапрос в разделе WHERE повторяет условие запроса 4.

SELECT

m.firstname,

m.lastname,

l.isbn,

l.fine_paid

FROM member AS m

JOIN loanhist AS l ON m.member_no = l.member_no

WHERE l.fine_paid = (

SELECT MAX(fine_paid)

FROM loanhist);

Рисунок 5 - Результат запроса 5

2. Использование подзапроса как части условия поиска

Запрос 6

Напишем запрос, который выведет имя, фамилию, isbn и оплаченный штраф людей (рис. 6).

SELECT

m.firstname,

m.lastname,

l.isbn,

l.fine_paid

FROM member AS m

JOIN loanhist AS l

ON m.member_no = l.member_no;

Рисунок 6 - Результат запроса 6

Запрос 7

Теперь добавим условие максимального штрафа и исключим дублирующиеся строки с помощью ключевого слова DISTINCT (рис. 7).

SELECT DISTINCT

m.firstname,

m.lastname,

l.isbn,

l.fine_paid

FROM member AS m

JOIN loanhist AS l

ON m.member_no = l.member_no

WHERE l.fine_paid = (

SELECT MAX(fine_paid)

FROM loanhist);

Рисунок 7 - Результат запроса 7

3. Использование запросов для создания списка значений.

Запрос 8

Напишем запрос, который выводит isbn книг, зарезервированных более 50 раз (рис. 8).

SELECT isbn

FROM reservation

GROUP BY isbn

HAVING COUNT(*) > 50;

Рисунок 8 - Результат запроса 8

Запрос 9

Теперь дополним запрос выводом номера, названия, isbn книг и кол-ва бронирования для каждой из них. Добавим условие фильтрации групп, чтобы количество бронирований было меньше 5 или больше 50 (рис. 9).

SELECT

t.title_no,

t.title,

i.isbn,

COUNT(r.isbn) AS [Total Reserved]

FROM title AS t

JOIN item AS i ON t.title_no = i.title_no

JOIN reservation AS r ON i.isbn = r.isbn

GROUP BY t.title_no, t.title, i.isbn

HAVING COUNT(r.isbn) > 50 OR COUNT(r.isbn) < 5;

Рисунок 9 - Результат запроса 9

4. Использование подзапроса с несколькими значениями.

Запрос 10.1

Напишем запрос, возвращающий isbn тех книг, которые зарезервированы менее 5 раз (рис. 10.1).

SELECT isbn

FROM reservation

GROUP BY isbn

HAVING COUNT(*) < 5;

Рисунок 10.1 - Выполнение запроса 10.1

Запрос 10.2

Далее напишем запрос, чтобы он выводил номер, название книги и количество бронирований, добавив подзапрос такой же, как 10.1 запрос (рис. 10.2).

SELECT

t.title_no, t.title, i.isbn,

COUNT(r.isbn) AS Total_Reserved

FROM title AS t

JOIN item AS i ON t.title_no = i.title_no

JOIN reservation AS r ON i.isbn = r.isbn

WHERE i.isbn IN (

SELECT isbn

FROM reservation

GROUP BY isbn

HAVING COUNT(*) < 5)

GROUP BY t.title_no, t.title, i.isbn;

Рисунок 10.2 - Результат запроса 10.2

Упражнение 3 - Использование коррелированных подзапросов.

Запрос 11

Сделаем запрос, отображающий список читателей, имеющих сумму штрафов, превышающую 5. Для этого напишем внешний запрос, выводящий номер и фамилию читателя, дополним его внутренним запросом, который вычисляет сумму штрафа, и свяжем поля внешнего и внутреннего запроса.

SELECT m.member_no, m.lastname

FROM member m

WHERE (SELECT SUM(l.fine_paid)

FROM loanhist l

WHERE l.member_no = m.member_no) > 5;

Рисунок 11 - Результат выполнения запроса 11

Вывод

В ходе выполнения лабораторной работы были рассмотрены вложенные подзапросы, используемые как производные таблицы, подзапросы, возвращающие одно значение и применяемые в выражениях WHERE и HAVING, а также подзапросы, возвращающие множество значений и использующие оператор IN. Отдельное внимание было уделено коррелированным подзапросам, которые обращаются к данным внешнего запроса. В процессе работы были закреплены навыки использования агрегатных функций COUNT, SUM и MAX, операторов соединения JOIN и INNER JOIN, а также фильтрации данных с помощью предложений WHERE и HAVING.

Соседние файлы в папке БД_лабы(11 лаб, 5 семестр)