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


-- ============================================================
-- 1. ЗАПРОСЫ НА ДОБАВЛЕНИЕ ТАБЛИЦ
-- ============================================================

-- 1.1. Таблица резервных сведений о преподавателях
CREATE TABLE IF NOT EXISTS teachers_backup (
    teacher_id INT AUTO_INCREMENT PRIMARY KEY,
    last_name VARCHAR(50) NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    specialization VARCHAR(100) NOT NULL
);

-- 1.2. Таблица истории изменений заявок
CREATE TABLE IF NOT EXISTS application_history (
    history_id INT AUTO_INCREMENT PRIMARY KEY,
    application_id INT NOT NULL,
    old_status VARCHAR(20),
    new_status VARCHAR(20),
    changed_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- ============================================================
-- 2. ЗАПРОСЫ НА ИЗМЕНЕНИЕ ГОТОВЫХ ТАБЛИЦ
-- ============================================================

-- 2.1. Добавление поля даты обновления в таблицу заявок
ALTER TABLE applications
    ADD COLUMN updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

-- 2.2. Добавление поля примечания в таблицу кружков
ALTER TABLE `groups`
    ADD COLUMN notes VARCHAR(255);

-- ============================================================
-- 3. ВЫБОРКА ДАННЫХ С УСЛОВИЕМ ОТБОРА
-- ============================================================

-- 3.1. Поиск детей по фамилии
SELECT * FROM children WHERE last_name = 'Иванов';

-- 3.2. Поиск программ длительностью более 50 часов
SELECT name, duration_hours FROM programs WHERE duration_hours > 50;

-- 3.3. Поиск кружков со свободными местами
SELECT group_id, program_id, teacher_id, free_seats
FROM `groups`
WHERE free_seats > 0;

-- 3.4. Выборка новых заявок
SELECT application_id, child_id, group_id, submitted_at
FROM applications
WHERE status = 'новая';

-- 3.5. Поиск преподавателей по специализации
SELECT last_name, first_name, specialization
FROM teachers
WHERE specialization LIKE '%программирование%';

-- ============================================================
-- 4. ВЫБОРКА ДАННЫХ С ГРУППИРОВКОЙ И ФИЛЬТРАЦИЕЙ
-- ============================================================

-- 4.1. Количество детей у каждого родителя
SELECT parent_id, COUNT(*) AS children_count
FROM children
GROUP BY parent_id;

-- 4.2. Родители, у которых больше одного ребёнка
SELECT parent_id, COUNT(*) AS children_count
FROM children
GROUP BY parent_id
HAVING COUNT(*) > 1;

-- 4.3. Количество заявок по каждому статусу
SELECT status, COUNT(*) AS applications_count
FROM applications
GROUP BY status;

-- 4.4. Программы, у которых более двух кружков
SELECT program_id, COUNT(*) AS groups_count
FROM `groups`
GROUP BY program_id
HAVING COUNT(*) > 2;

-- 4.5. Программы со средним числом свободных мест больше пяти
SELECT program_id, AVG(free_seats) AS average_free_seats
FROM `groups`
GROUP BY program_id
HAVING AVG(free_seats) > 5;

-- ============================================================
-- 5. ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ
-- ============================================================

-- 5.1. Дети и сведения об их родителях
SELECT
    c.last_name  AS child_last_name,
    c.first_name AS child_first_name,
    p.last_name  AS parent_last_name,
    p.first_name AS parent_first_name,
    p.phone
FROM children AS c
JOIN parents AS p ON c.parent_id = p.parent_id;

-- 5.2. Заявки с именами детей
SELECT
    a.application_id,
    c.last_name,
    c.first_name,
    a.status,
    a.submitted_at
FROM applications AS a
JOIN children AS c ON a.child_id = c.child_id;

-- 5.3. Кружки, программы и преподаватели
SELECT
    g.group_id,
    p.name       AS program_name,
    t.last_name  AS teacher_last_name,
    t.first_name AS teacher_first_name,
    g.room,
    g.academic_year
FROM `groups` AS g
JOIN programs AS p ON g.program_id = p.program_id
JOIN teachers AS t ON g.teacher_id = t.teacher_id;

-- 5.4. Расписание занятий с названием программы
SELECT
    s.weekday,
    s.start_time,
    s.end_time,
    g.group_id,
    p.name AS program_name
FROM schedule AS s
JOIN `groups` AS g ON s.group_id = g.group_id
JOIN programs AS p ON g.program_id = p.program_id
ORDER BY s.weekday, s.start_time;

-- 5.5. Заявки, дети и назначенные программы
SELECT
    a.application_id,
    c.last_name,
    c.first_name,
    a.status,
    p.name AS program_name,
    a.submitted_at
FROM applications AS a
JOIN children AS c ON a.child_id = c.child_id
LEFT JOIN `groups` AS g ON a.group_id = g.group_id
LEFT JOIN programs AS p ON g.program_id = p.program_id;