БД_лабы(11 лаб, 5 семестр) / БД_ЛР5
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра Систем автоматизированного проектирования
отчет
по лабораторной работе № 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- использование подзапросов как выражений:
Использование подзапросов с одним значением
Запрос 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.
