Загрузка данных
```sql
-- ============================================================
-- ФАЙЛ: запросы_к_БД_it_cube.sql
-- БД: it_cube (русские имена таблиц)
-- СУБД: MySQL 8.0+
-- ============================================================
USE it_cube;
-- ============================================================
-- РАЗДЕЛ 1. ДОБАВЛЕНИЕ И УДАЛЕНИЕ ТАБЛИЦ
-- ============================================================
-- ------------------------------------------------------------
-- 1.1. ДОБАВЛЕНИЕ ТАБЛИЦ (2 запроса)
-- ------------------------------------------------------------
-- ЗАПРОС 1. Создание таблицы "родители"
CREATE TABLE родители (
код_родителя INT AUTO_INCREMENT PRIMARY KEY,
фамилия VARCHAR(50) NOT NULL,
имя VARCHAR(50) NOT NULL,
отчество VARCHAR(50) NULL,
телефон VARCHAR(20) NOT NULL UNIQUE,
электронная_почта VARCHAR(100) NOT NULL UNIQUE,
снилс CHAR(11) NULL UNIQUE,
дата_регистрации DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- ЗАПРОС 2. Создание таблицы "дети"
CREATE TABLE дети (
код_ребёнка INT AUTO_INCREMENT PRIMARY KEY,
фамилия VARCHAR(50) NOT NULL,
имя VARCHAR(50) NOT NULL,
отчество VARCHAR(50) NULL,
дата_рождения DATE NOT NULL,
снилс CHAR(11) NULL UNIQUE,
код_родителя INT NOT NULL,
CONSTRAINT fk_дети_родители
FOREIGN KEY (код_родителя)
REFERENCES родители(код_родителя)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB;
-- ------------------------------------------------------------
-- 1.2. УДАЛЕНИЕ ТАБЛИЦ (2 запроса)
-- ------------------------------------------------------------
-- ЗАПРОС 3. Удаление таблицы "дети" (дочерняя — удаляется первой)
DROP TABLE IF EXISTS дети;
-- ЗАПРОС 4. Удаление таблицы "родители" (родительская — удаляется второй)
DROP TABLE IF EXISTS родители;
-- ============================================================
-- РАЗДЕЛ 2. ВЫБОРКА ДАННЫХ С УСЛОВИЕМ ОТБОРА (5 запросов)
-- ============================================================
-- ЗАПРОС 1. Дети старше 10 лет
SELECT код_ребёнка, фамилия, имя, отчество, дата_рождения
FROM дети
WHERE дата_рождения <= DATE_SUB(CURDATE(), INTERVAL 10 YEAR);
-- ЗАПРОС 2. Родители с почтой на mail.ru
SELECT код_родителя, фамилия, имя, электронная_почта
FROM родители
WHERE электронная_почта LIKE '%@mail.ru';
-- ЗАПРОС 3. Кружки с более чем 5 свободными местами
SELECT код_кружка, аудитория, макс_мест, свободных_мест
FROM кружки
WHERE свободных_мест > 5;
-- ЗАПРОС 4. Заявки в статусе "новая" или "на_проверке"
SELECT код_заявки, код_ребёнка, статус, дата_подачи
FROM заявки
WHERE статус IN ('новая', 'на_проверке');
-- ЗАПРОС 5. Программы для возраста от 10 до 14 лет
SELECT код_программы, название, возраст_мин, возраст_макс
FROM программы
WHERE возраст_мин >= 10 AND возраст_макс <= 14;
-- ============================================================
-- РАЗДЕЛ 3. ВЫБОРКА С ГРУППИРОВКОЙ И ФИЛЬТРАЦИЕЙ (5 запросов)
-- ============================================================
-- ЗАПРОС 1. Количество детей у каждого родителя (только те, у кого больше 1)
SELECT р.код_родителя, р.фамилия, р.имя, COUNT(д.код_ребёнка) AS детей
FROM родители р
LEFT JOIN дети д ON д.код_родителя = р.код_родителя
GROUP BY р.код_родителя, р.фамилия, р.имя
HAVING COUNT(д.код_ребёнка) > 1;
-- ЗАПРОС 2. Количество заявок по каждому статусу
SELECT статус, COUNT(*) AS количество_заявок
FROM заявки
GROUP BY статус
HAVING COUNT(*) >= 1
ORDER BY количество_заявок DESC;
-- ЗАПРОС 3. Количество кружков у каждого преподавателя (только те, у кого > 1)
SELECT п.код_преподавателя, п.фамилия, п.имя, COUNT(к.код_кружка) AS кружков
FROM преподаватели п
LEFT JOIN кружки к ON к.код_преподавателя = п.код_преподавателя
GROUP BY п.код_преподавателя, п.фамилия, п.имя
HAVING COUNT(к.код_кружка) > 1;
-- ЗАПРОС 4. Средний возраст детей по родителям (только где средний возраст > 8)
SELECT р.код_родителя, р.фамилия, р.имя,
AVG(TIMESTAMPDIFF(YEAR, д.дата_рождения, CURDATE())) AS средний_возраст
FROM родители р
JOIN дети д ON д.код_родителя = р.код_родителя
GROUP BY р.код_родителя, р.фамилия, р.имя
HAVING средний_возраст > 8;
-- ЗАПРОС 5. Суммарное количество мест по программам
SELECT п.код_программы, п.название,
COUNT(к.код_кружка) AS кол_кружков,
SUM(к.макс_мест) AS всего_мест,
SUM(к.свободных_мест) AS свободно
FROM программы п
LEFT JOIN кружки к ON к.код_программы = п.код_программы
GROUP BY п.код_программы, п.название
HAVING SUM(к.макс_мест) IS NOT NULL;
-- ============================================================
-- РАЗДЕЛ 4. ВЫБОРКА ИЗ НЕСКОЛЬКИХ ТАБЛИЦ (5 запросов)
-- ============================================================
-- ЗАПРОС 1. Список заявок с ФИО ребёнка и родителя
SELECT з.код_заявки,
CONCAT(д.фамилия, ' ', д.имя) AS ребёнок,
CONCAT(р.фамилия, ' ', р.имя) AS родитель,
з.статус
FROM заявки з
JOIN дети д ON д.код_ребёнка = з.код_ребёнка
JOIN родители р ON р.код_родителя = д.код_родителя;
-- ЗАПРОС 2. Кружки с названием программы и ФИО преподавателя
SELECT к.код_кружка,
п.название AS программа,
CONCAT(пр.фамилия, ' ', пр.имя) AS преподаватель,
к.учебный_год,
к.свободных_мест
FROM кружки к
JOIN программы п ON п.код_программы = к.код_программы
JOIN преподаватели пр ON пр.код_преподавателя = к.код_преподавателя;
-- ЗАПРОС 3. Расписание кружков с программой и преподавателем
SELECT к.код_кружка,
п.название AS программа,
CONCAT(пр.фамилия, ' ', пр.имя) AS преподаватель,
р.день_недели,
р.время_начала,
р.время_окончания
FROM расписание р
JOIN кружки к ON к.код_кружка = р.код_кружка
JOIN программы п ON п.код_программы = к.код_программы
JOIN преподаватели пр ON пр.код_преподавателя = к.код_преподавателя;
-- ЗАПРОС 4. Зачисленные дети с указанием кружка и программы
SELECT CONCAT(д.фамилия, ' ', д.имя) AS ребёнок,
п.название AS программа,
к.учебный_год,
к.аудитория,
з.дата_подачи
FROM заявки з
JOIN дети д ON д.код_ребёнка = з.код_ребёнка
JOIN кружки к ON к.код_кружка = з.код_кружка
JOIN программы п ON п.код_программы = к.код_программы
WHERE з.статус = 'зачислен';
-- ЗАПРОС 5. Полная информация по каждой заявке
SELECT з.код_заявки,
CONCAT(д.фамилия, ' ', д.имя) AS ребёнок,
CONCAT(р.фамилия, ' ', р.имя) AS родитель,
р.телефон,
IFNULL(п.название, '— не распределён —') AS программа,
IFNULL(CONCAT(пр.фамилия, ' ', пр.имя), '—') AS преподаватель,
з.статус,
з.дата_подачи
FROM заявки з
JOIN дети д ON д.код_ребёнка = з.код_ребёнка
JOIN родители р ON р.код_родителя = д.код_родителя
LEFT JOIN кружки к ON к.код_кружка = з.код_кружка
LEFT JOIN программы п ON п.код_программы = к.код_программы
LEFT JOIN преподаватели пр ON пр.код_преподавателя = к.код_преподавателя;
-- ============================================================
-- КОНЕЦ ФАЙЛА
-- ============================================================
```