ФЕДЕРАЛЬНОЕ АГЕНТСТВО ВОЗДУШНОГО ТРАНСПОРТА ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)
|
Кафедра ВМКСС
ОТЧЁТ по выполнению лабораторных работ по дисциплине «Базы данных»
Семестр V
Вариант № 17
Выполнила студентка группы ИС 3-1 Магальник Екатерина Борисовна (Ф.И.О.) Преподаватель: __д.т.н., Профессор Егорова А.А._ (звание, степень, Ф.И.О.)
МОСКВА – 2024
|
Лабораторная работа №2 проектирование базы данных в субд mysql 5.5
Цель лабораторной работы:
Целью лабораторной работы является изучение СУБД MySQL и методов проектирования в ней баз данных.
Задание на выполнение и ход лабораторной работы:
В соответствии со своим вариантом для заданной в первой лабораторной работе предметной области:
создать проект, базу данных и описать таблицы базы данных в СУБД MySQL 5.5 (входящей в состав Денвер 3 или MAMP 5.0 и выше);
В Денвере при помощи phpMyAdmin была создана база данных, в которой будут таблицы с различными данными о пеших туристических походах:
После в базе данных были созданы следующие таблицы:
Таблица chat-user является служебной таблицей-связкой, через которую туристы по их айди связываются с чатом.
Таблица chats нужна для хранения информации о чате: даты и времени создания, названия и инструктора.
Таблица costumers содержит данные о туристах: фамилию, имя, отчество, номер телефона, почту и дату рождения.
Таблица damage-of-equipment содержит информацию о том, какое арендованное оборудование было повреждено и по какой причине.
Таблица equipment содержит информацию о том, какое в походе имеется оборудование и в каком количестве.
Таблица halts содержит информацию о привалах: название, пропускную способность, местоположение, инфраструктуру и тип (берется из словаря).
Таблица instructors содержит информацию об инструкторах: фамилию, имя, отчество, номер телефона, почту и стаж работы.
Таблица messages содержит информацию о присланных в чат сообщениях: в какой чат сообщение было прислано, в какую дату и время оно было прислано.
Таблица qualification-of-instructor содержит информацию о квалификации инструктора: название документа и дату получения.
Таблица rent содержит информацию об арендованном оборудовании: кто арендовал, что арендовал и сколько он заплатил за аренду.
Таблица review содержит информацию об отзывах на туристические маршруты: кто написал и текст отзыва.
Таблица route-halt является служебной таблицей-связкой, через которую связаны маршруты и привалы, которые есть на этих маршрутах.
Таблица routes содержит информацию о туристических походах: название, стоимость, длительность в часах и точку отправления.
Таблица teams является служебной таблицей-связкой, через которую видно, какой пользователь в какой поход идет и был ли этот поход оплачен.
Таблица trip содержит информацию о том, когда начинается и заканчивается пеший поход.
Таблица type-of-halt является справочником, в котором хранятся все типа существующих привалов.
наполнить таблицы данными в количестве, необходимом для поверки корректности запросов;
Таблица chat-user:
Таблица chats:
Таблица costumers:
Таблица equipment:
Таблица halts:
Таблица instructors:
Таблица qualification-of-instructor:
Таблица rent:
Таблица route-halt:
Таблица routes:
Таблица teams:
Таблица trip:
Таблица type-of-halt:
сформулировать (на естественном языке) 15-20 запросов к базе данных с учетом бизнес-правил;
Удаляем людей младше 18 лет
Добавление в таблицу оборудования
Добавление в таблицу маршрутов
Добавление в таблицу квалификации
Ищем маршруты, длительность которых меньше или равна 24 часам
Ищем имена и фамилии инструкторов, которые получили дипломы раньше 2022 года
Найти имя маршрута, у которых больше одного привала
Найти максимальное количество привалов на всех маршрутах
Найти минимальное количество привалов на всех маршрутах
Средний возраст туристов
Вывести название и цену самого дорогого и самого дешевого маршрута
Найти людей, которые ходили в поход с Егоровой Аллой Альбертовной и в каком году это было
Найти когда, куда и с каким инструктором ходила Егорова Алла Альбертовна
Вывести название маршрутов, на который сходило больше 10 человек в июне любого года и длительность которого 72 часа (3 дня)
Вывести данные людей, которые ходили на маршрут «The road to the Lavra»
проверить корректность данных (в части достаточности данных для демонстрации корректности запросов);
реализовать запросы.
Изначальная таблица клиентов:
Удаляем людей младше 18 лет
DELETE FROM costumers WHERE YEAR(date_of_birth) > 2005;
Полученная таблица:
Были удалены последние 3 записи
Запросы на добавление данных в таблицу:
Добавление в таблицу оборудования:
INSERT INTO `equipment` (`equipment_id`, `title`, `amount`) VALUES (NULL, 'Sunglasses', '6'), (NULL, 'First aid kit', '8');
Добавление в таблицу маршрутов:
INSERT INTO `routes` (`route_id`, `title`, `duration_in_hours`, `point_of_departure`, `price`) VALUES (NULL, 'The magical paths of Kirzhach', '72', 'Sanino railway station', '5000'), (NULL, 'Kapeshnaya sotnya (Moscow region)', '72', 'Tugolesye platform', '5850');
Добавление в таблицу квалификации:
INSERT INTO `qualification-of-instructor` (`qualification_id`, `instructor`, `document`, `date_of_receipt`) VALUES ('5', '5', 'Hiking school \"The Merry Way\"', '2023-09-15');
Ищем маршруты, длительность которых меньше или равна 24 часам:
Select * from routes where duration_in_hours <= 24
Ищем имена и фамилии инструкторов, которые получили дипломы раньше 2022 года:
SELECT last_name, first_name
from instructors
join `qualification-of-instructor` on instructors.instructor_id = `qualification-of-instructor`.instructor
where YEAR(date_of_receipt) < 2022;
Найти имя маршрута, у которых больше одного привала:
SELECT title
FROM routes
JOIN `route-halt` ON routes.route_id = `route-halt`.route
GROUP BY title
HAVING COUNT(`route-halt`.halt) > 1;
Найти максимальное количество привалов на всех маршрутах:
SELECT MAX(halt_count) AS max_halts
FROM (
SELECT `route-halt`.route, COUNT(`route-halt`.halt) AS halt_count
FROM `route-halt`
GROUP BY `route-halt`.route
) AS route_halt_counts;
Найти минимальное количество привалов на всех маршрутах:
SELECT MIN(halt_count) AS min_halts
FROM (
SELECT `route-halt`.route, COUNT(`route-halt`.halt) AS halt_count
FROM `route-halt`
GROUP BY `route-halt`.route
) AS route_halt_counts;
Средний возраст туристов:
SELECT ROUND(AVG(YEAR(CURDATE()) - YEAR(date_of_birth) -
(DATE_FORMAT(CURDATE(), '%m%d') < DATE_FORMAT(date_of_birth, '%m%d')))) AS average_age
FROM costumers;
Вывести название и цену самого дорогого и самого дешевого маршрута:
SELECT title, price
FROM routes
WHERE price = (SELECT MAX(price) FROM routes)
OR price = (SELECT MIN(price) FROM routes);
Найти людей, которые ходили в поход с Егоровой Аллой Альбертовной и в каком году это было:
SELECT DISTINCT YEAR(trip.date_of_begining), costumers.last_name, costumers.first_name, costumers.middle_name FROM trip
JOIN teams AS tm1 ON trip.trip_id = tm1.trip
JOIN costumers ON costumers.user_id = tm1.user
WHERE
EXISTS (
SELECT 1
FROM costumers AS c
JOIN teams AS tm3 ON c.user_id = tm3.user
WHERE c.last_name = 'Egorova'
AND c.first_name = 'Alla'
AND c.middle_name = 'Albertovna'
AND c.user_id = tm3.user
)
AND NOT (costumers.last_name = 'Egorova'
AND costumers.first_name = 'Alla'
AND costumers.middle_name = 'Albertovna')
ORDER BY YEAR(trip.date_of_begining);
Найти когда, куда и с каким инструктором ходила Егорова Алла Альбертовна:
SELECT DISTINCT routes.title, trip.date_of_begining, trip.date_of_ending, instructors.last_name, instructors.first_name, instructors.middle_name FROM trip
JOIN teams AS tm1 ON trip.trip_id = tm1.trip
JOIN instructors ON instructors.instructor_id = tm1.instructor
JOIN routes ON routes.route_id = trip.route
WHERE
EXISTS (
SELECT 1
FROM costumers AS c
JOIN teams AS tm3 ON c.user_id = tm3.user
WHERE c.last_name = 'Egorova'
AND c.first_name = 'Alla'
AND c.middle_name = 'Albertovna'
AND c.user_id = tm3.user
);
Вывести название маршрутов, на который сходило больше 10 человек в июне любого года и длительность которого 72 часа (3 дня):
SELECT routes.title FROM routes
JOIN trip AS tp ON routes.route_id = tp.route
JOIN teams AS tm ON tm.trip = tp.trip_id
WHERE routes.duration_in_hours = 72 AND MONTH(tp.date_of_begining)=6
GROUP BY routes.title
HAVING COUNT(tm.user) >= 10;
Вывести данные людей, которые ходили на маршрут «The road to the Lavra»
SELECT
c.last_name,
c.first_name,
c.middle_name,
c.phone_number
FROM
costumers AS c
JOIN
teams AS tm ON c.user_id = tm.user
JOIN
trip AS tp ON tm.trip = tp.trip_id
JOIN
routes AS r ON tp.route = r.route_id
WHERE
r.title = "The road to the Lavra";
