Загрузка данных
USE it_cube;
-- #########################################################
-- # БЛОК 1. ЗАПРОСЫ НА СОЕДИНЕНИЕ ТАБЛИЦ (5 запросов) #
-- #########################################################
-- =========================================================
-- ЗАПРОС 1. INNER JOIN + LEFT JOIN
-- Что делает: выводит список всех заявок с ФИО ребёнка,
-- ФИО и телефоном родителя, названием программы и статусом.
-- =========================================================
SELECT
a.application_id,
CONCAT(c.last_name, ' ', c.first_name, ' ', IFNULL(c.middle_name, '')) AS child_fio,
c.birth_date,
CONCAT(p.last_name, ' ', p.first_name) AS parent_fio,
p.phone AS parent_phone,
pr.name AS program_name,
a.status,
a.submitted_at
FROM `applications` a
INNER JOIN `children` c ON a.child_id = c.child_id
INNER JOIN `parents` p ON c.parent_id = p.parent_id
LEFT JOIN `groups` g ON a.group_id = g.group_id
LEFT JOIN `programs` pr ON g.program_id = pr.program_id
ORDER BY a.submitted_at DESC;
-- =========================================================
-- ЗАПРОС 2. LEFT JOIN + GROUP BY
-- Что делает: выводит список всех групп с названием программы,
-- ФИО преподавателя, аудиторией и количеством заявок.
-- =========================================================
SELECT
g.group_id,
pr.name AS program_name,
CONCAT(t.last_name, ' ', t.first_name) AS teacher_fio,
t.specialization,
g.room,
g.academic_year,
g.max_seats,
g.free_seats,
COUNT(a.application_id) AS applications_count
FROM `groups` g
LEFT JOIN `programs` pr ON g.program_id = pr.program_id
LEFT JOIN `teachers` t ON g.teacher_id = t.teacher_id
LEFT JOIN `applications` a ON g.group_id = a.group_id
GROUP BY g.group_id, pr.name, teacher_fio, t.specialization,
g.room, g.academic_year, g.max_seats, g.free_seats
ORDER BY applications_count DESC;
-- =========================================================
-- ЗАПРОС 3. МНОГОТАБЛИЧНЫЙ JOIN (4 таблицы)
-- Что делает: выводит расписание с программой и преподавателем.
-- =========================================================
SELECT
s.lesson_id,
s.weekday,
s.start_time,
s.end_time,
g.room,
pr.name AS program_name,
CONCAT(t.last_name, ' ', t.first_name, ' ', IFNULL(t.middle_name, '')) AS teacher_fio,
g.academic_year
FROM `schedule` s
INNER JOIN `groups` g ON s.group_id = g.group_id
INNER JOIN `programs` pr ON g.program_id = pr.program_id
INNER JOIN `teachers` t ON g.teacher_id = t.teacher_id
ORDER BY FIELD(s.weekday, 'Пн','Вт','Ср','Чт','Пт','Сб','Вс'), s.start_time;
-- =========================================================
-- ЗАПРОС 4. JOIN + АГРЕГАЦИЯ + CASE
-- Что делает: статистика заявок по каждому родителю.
-- =========================================================
SELECT
p.parent_id,
CONCAT(p.last_name, ' ', p.first_name) AS parent_fio,
p.phone,
p.email,
COUNT(DISTINCT c.child_id) AS children_count,
COUNT(a.application_id) AS total_applications,
SUM(CASE WHEN a.status = 'зачислен' THEN 1 ELSE 0 END) AS enrolled,
SUM(CASE WHEN a.status = 'одобрена' THEN 1 ELSE 0 END) AS approved,
SUM(CASE WHEN a.status = 'отклонена' THEN 1 ELSE 0 END) AS rejected
FROM `parents` p
LEFT JOIN `children` c ON p.parent_id = c.parent_id
LEFT JOIN `applications` a ON c.child_id = a.child_id
GROUP BY p.parent_id, parent_fio, p.phone, p.email
ORDER BY total_applications DESC;
-- =========================================================
-- ЗАПРОС 5. JOIN (3 таблицы)
-- Что делает: история изменения статусов заявок.
-- =========================================================
SELECT
h.history_id,
h.application_id,
CONCAT(c.last_name, ' ', c.first_name) AS child_fio,
h.old_status,
h.new_status,
h.changed_at,
a.status AS current_status
FROM `application_history` h
INNER JOIN `applications` a ON h.application_id = a.application_id
INNER JOIN `children` c ON a.child_id = c.child_id
ORDER BY h.changed_at DESC;
-- #########################################################
-- # БЛОК 2. CRUD-ЗАПРОСЫ (6 запросов: 2+2+2) #
-- #########################################################
-- =========================================================
-- ЗАПРОС 6. INSERT — ДОБАВЛЕНИЕ
-- Новый родитель + его ребёнок.
-- =========================================================
INSERT INTO `parents` (last_name, first_name, middle_name, phone, email, snils, address)
VALUES ('Сидоров', 'Пётр', 'Николаевич', '+79161234567', 'sidorov@mail.ru',
'12345678901', 'г. Москва, ул. Ленина, д. 10, кв. 5');
INSERT INTO `children` (last_name, first_name, middle_name, birth_date, snils, parent_id, gender)
VALUES ('Сидоров', 'Артём', 'Петрович', '2014-05-12', '12345678902',
LAST_INSERT_ID(), 'М');
-- =========================================================
-- ЗАПРОС 7. INSERT — ДОБАВЛЕНИЕ
-- Новая заявка для только что созданного ребёнка.
-- =========================================================
INSERT INTO `applications` (child_id, group_id, status, comment)
VALUES (
(SELECT child_id FROM `children` WHERE snils = '12345678902' LIMIT 1),
(SELECT group_id FROM `groups` WHERE academic_year = '2025-2026' LIMIT 1),
'новая',
'Заявка подана через сайт'
);
-- =========================================================
-- ЗАПРОС 8. DELETE — УДАЛЕНИЕ
-- Удаление старых отклонённых заявок (> 6 месяцев).
-- =========================================================
DELETE FROM `applications`
WHERE status = 'отклонена'
AND submitted_at < DATE_SUB(NOW(), INTERVAL 6 MONTH);
-- =========================================================
-- ЗАПРОС 9. DELETE — УДАЛЕНИЕ
-- Удаление пустых групп за 2023-2024 учебный год.
-- =========================================================
DELETE FROM `groups`
WHERE academic_year = '2023-2024'
AND group_id NOT IN (
SELECT group_id FROM `applications` WHERE group_id IS NOT NULL
);
-- =========================================================
-- ЗАПРОС 10. UPDATE + INSERT — ИЗМЕНЕНИЕ
-- Смена статуса заявки №1 на "одобрена" + запись в историю.
-- =========================================================
UPDATE `applications`
SET status = 'одобрена',
comment = CONCAT(IFNULL(comment, ''), ' | Одобрено администратором'),
updated_at = NOW()
WHERE application_id = 1;
INSERT INTO `application_history` (application_id, old_status, new_status)
VALUES (1, 'новая', 'одобрена');
-- =========================================================
-- ЗАПРОС 11. UPDATE × 3 — ИЗМЕНЕНИЕ
-- Перевод заявки №2 в группу №2 + корректировка мест.
-- =========================================================
UPDATE `applications`
SET group_id = 2,
status = 'зачислен',
updated_at = NOW()
WHERE application_id = 2;
UPDATE `groups` SET free_seats = free_seats + 1 WHERE group_id = 1;
UPDATE `groups` SET free_seats = free_seats - 1 WHERE group_id = 2;
-- #########################################################
-- # БЛОК 3. МАССОВАЯ ВСТАВКА (1 запрос) #
-- #########################################################
-- =========================================================
-- ЗАПРОС 12. МНОЖЕСТВЕННЫЙ INSERT
-- 5 преподавателей + 5 занятий одним запросом.
-- =========================================================
-- 12.1 Пять преподавателей одним INSERT
INSERT INTO `teachers`
(last_name, first_name, middle_name, specialization, phone, email, hire_date)
VALUES
('Иванов', 'Иван', 'Иванович', 'Программирование Python', '+79001110001', 'ivanov@itcube.ru', '2024-09-01'),
('Петрова', 'Мария', 'Сергеевна', 'Робототехника', '+79001110002', 'petrova@itcube.ru', '2024-09-01'),
('Кузнецов', 'Алексей','Дмитриевич', 'Веб-разработка', '+79001110003', 'kuznetsov@itcube.ru', '2024-10-15'),
('Смирнова', 'Ольга', 'Андреевна', '3D-моделирование', '+79001110004', 'smirnova@itcube.ru', '2024-11-01'),
('Фёдоров', 'Денис', 'Олегович', 'Кибербезопасность', '+79001110005', 'fedorov@itcube.ru', '2025-01-10');
-- 12.2 Пять занятий в расписание одним INSERT
INSERT INTO `schedule` (group_id, weekday, start_time, end_time)
VALUES
(1, 'Пн', '15:00:00', '16:30:00'),
(1, 'Ср', '15:00:00', '16:30:00'),
(1, 'Пт', '15:00:00', '16:30:00'),
(2, 'Вт', '16:45:00', '18:15:00'),
(2, 'Чт', '16:45:00', '18:15:00');