Загрузка данных
Ниже подготовлены запросы для твоей базы данных на MySQL 8.0+. Для каждого запроса есть объяснение, что он делает и какой результат возвращает.
1. Запросы на добавление и удаление таблиц
Здесь будут 2 запроса на создание таблиц и 2 запроса на удаление таблиц. Выполнять запросы на удаление нужно осторожно: они удаляют саму таблицу вместе с данными.
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
);
Объяснение: создаётся таблица teachers_backup, предназначенная для хранения фамилии, имени и специализации преподавателя. IF NOT EXISTS предотвращает ошибку, если таблица с таким названием уже существует.
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
);
Объяснение: создаётся таблица application_history, в которой можно хранить сведения об изменении статусов заявок: прежний статус, новый статус и дату изменения.
Примечание: эти две таблицы вспомогательные и не входят в исходные семь таблиц базы данных.
1.3. Удаление таблицы преподавателей из резервной таблицы
DROP TABLE IF EXISTS teachers_backup;
Объяснение: удаляет таблицу teachers_backup, если она существует. Вместе с таблицей удаляются все находящиеся в ней данные.
1.4. Удаление таблицы истории заявок
DROP TABLE IF EXISTS application_history;
Объяснение: удаляет таблицу application_history, если она существует. Команда IF EXISTS позволяет избежать ошибки, если таблица уже была удалена.
2. Выборка данных с условием отбора — 5 запросов
Для этих запросов используется оператор SELECT, который выбирает данные, и WHERE, который задаёт условия отбора.
Запрос 1. Найти всех детей с определённой фамилией
SELECT *
FROM children
WHERE last_name = 'Иванов';
Объяснение: выводит все сведения о детях, фамилия которых — Иванов. Заменив фамилию в условии, можно найти других детей.
Запрос 2. Найти программы длительностью более 50 часов
SELECT name, duration_hours
FROM programs
WHERE duration_hours > 50;
Объяснение: выводит названия программ и их продолжительность, если программа рассчитана более чем на 50 часов. Оператор > означает «больше».
Запрос 3. Найти кружки, в которых есть свободные места
SELECT group_id, program_id, teacher_id, free_seats
FROM `groups`
WHERE free_seats > 0;
Объяснение: показывает кружки, в которых осталось хотя бы одно свободное место. Кавычки вокруг groups нужны для корректного использования имени таблицы.
Запрос 4. Найти заявки со статусом «новая»
SELECT application_id, child_id, group_id, submitted_at
FROM applications
WHERE status = 'новая';
Объяснение: выводит все новые заявки, которые ещё не перешли в другой статус. Это позволяет определить заявки, требующие рассмотрения.
Запрос 5. Найти преподавателей по специализации
SELECT last_name, first_name, specialization
FROM teachers
WHERE specialization LIKE '%программирование%';
Объяснение: находит преподавателей, в специализации которых содержится слово «программирование». Символ % означает любое количество любых символов, в том числе ноль.
3. Выборка с использованием группировки и фильтрации — 5 запросов
В этих запросах используются GROUP BY, COUNT(), AVG() и HAVING.
GROUP BY — объединяет записи в группы по заданному полю.
COUNT() — считает количество записей.
AVG() — вычисляет среднее значение.
HAVING — фильтрует уже сформированные группы.
Запрос 1. Подсчитать количество детей у каждого родителя
SELECT parent_id, COUNT(*) AS children_count
FROM children
GROUP BY parent_id;
Объяснение: группирует детей по идентификатору родителя и считает количество детей в каждой группе. Результат содержит идентификатор родителя и количество связанных с ним детей.
Запрос 2. Найти родителей, у которых больше одного ребёнка
SELECT parent_id, COUNT(*) AS children_count
FROM children
GROUP BY parent_id
HAVING COUNT(*) > 1;
Объяснение: сначала группирует детей по родителям, а затем оставляет только тех родителей, у которых больше одного ребёнка. Условие применяется через HAVING, потому что оно проверяет результат группировки.
Запрос 3. Подсчитать количество заявок каждого статуса
SELECT status, COUNT(*) AS applications_count
FROM applications
GROUP BY status;
Объяснение: объединяет заявки по статусам и подсчитывает их количество в каждой группе. Например, результат может показать, сколько заявок новых, одобренных или отклонённых.
Запрос 4. Найти программы, по которым открыто более двух кружков
SELECT program_id, COUNT(*) AS groups_count
FROM `groups`
GROUP BY program_id
HAVING COUNT(*) > 2;
Объяснение: группирует кружки по образовательным программам и считает количество кружков каждой программы. В результат попадают программы, для которых создано более двух кружков.
Запрос 5. Найти кружки со средним количеством свободных мест больше пяти
SELECT program_id, AVG(free_seats) AS average_free_seats
FROM `groups`
GROUP BY program_id
HAVING AVG(free_seats) > 5;
Объяснение: для каждой программы вычисляет среднее количество свободных мест в её кружках. Затем выводит только программы, у которых среднее значение превышает пять.
4. Выборка данных из нескольких таблиц — 5 запросов
Для получения связанных данных используются JOIN и LEFT JOIN. Они позволяют объединять сведения по внешним ключам.
Запрос 1. Вывести детей вместе с данными родителей
SELECT
children.last_name AS child_last_name,
children.first_name AS child_first_name,
parents.last_name AS parent_last_name,
parents.first_name AS parent_first_name,
parents.phone
FROM children
JOIN parents
ON children.parent_id = parents.parent_id;
Объяснение: объединяет таблицы children и parents по полю parent_id. Результат показывает имя ребёнка, имя родителя и его телефон.
Запрос 2. Вывести заявки с именами детей
SELECT
applications.application_id,
children.last_name,
children.first_name,
applications.status,
applications.submitted_at
FROM applications
JOIN children
ON applications.child_id = children.child_id;
Объяснение: объединяет заявки с таблицей детей. Вместо одного только идентификатора ребёнка можно увидеть его фамилию и имя, а также статус и дату подачи заявки.
Запрос 3. Вывести кружки, названия программ и преподавателей
SELECT
`groups`.group_id,
programs.name AS program_name,
teachers.last_name AS teacher_last_name,
teachers.first_name AS teacher_first_name,
`groups`.room,
`groups`.academic_year
FROM `groups`
JOIN programs
ON `groups`.program_id = programs.program_id
JOIN teachers
ON `groups`.teacher_id = teachers.teacher_id;
Объяснение: объединяет три таблицы: groups, programs и teachers. Запрос показывает, какая программа проводится в каждом кружке и какой преподаватель его ведёт.
Запрос 4. Вывести расписание занятий с названиями программ
SELECT
schedule.weekday,
schedule.start_time,
schedule.end_time,
`groups`.group_id,
programs.name AS program_name
FROM schedule
JOIN `groups`
ON schedule.group_id = `groups`.group_id
JOIN programs
ON `groups`.program_id = programs.program_id
ORDER BY schedule.weekday, schedule.start_time;
Объяснение: объединяет расписание, кружки и программы. Результат показывает день недели, время занятия, номер кружка и название программы. ORDER BY сортирует записи по дню недели и времени начала.
Запрос 5. Вывести заявки, детей и назначенные кружки
SELECT
applications.application_id,
children.last_name,
children.first_name,
applications.status,
programs.name AS program_name,
applications.submitted_at
FROM applications
JOIN children
ON applications.child_id = children.child_id
LEFT JOIN `groups`
ON applications.group_id = `groups`.group_id
LEFT JOIN programs
ON `groups`.program_id = programs.program_id;
Объяснение: объединяет заявки с детьми, кружками и образовательными программами.
Здесь используется LEFT JOIN, чтобы заявки без назначенного кружка тоже отображались. Если кружок ещё не назначен, поле program_name будет содержать NULL.
Итог
В работе представлены 17 запросов: 2 на создание таблиц, 2 на удаление таблиц и по 5 запросов для каждого из трёх видов выборки.
Раздел
Количество
Создание таблиц
2
Удаление таблиц
2
Выборка с условиями WHERE
5
Группировка и фильтрация GROUP BY, HAVING
5
Выборка из нескольких таблиц (JOIN)
5
Всего
19
Обрати внимание: итоговое количество — 19 запросов. Чтобы увидеть результаты запросов на выборку, сначала нужно добавить данные в таблицы. Если таблицы пустые, запросы выполнятся, но вернут пустые результаты.