Загрузка данных


```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 пр.код_преподавателя = к.код_преподавателя;

-- ============================================================
-- КОНЕЦ ФАЙЛА
-- ============================================================
```