Загрузка данных
Билет №13
Предметная область: Расписание и продажа билетов в кинотеатр
Таблицы: фильмы, кинозалы, сеансы, клиенты, билеты.
Решение (SQL-скрипт: создание таблиц, тестовые данные, запросы)
-- Предметная область: Расписание и продажа билетов в кинотеатр
CREATE TABLE films ( -- фильмы
film_id INT PRIMARY KEY,
title VARCHAR(120) NOT NULL,
genre VARCHAR(50) NOT NULL,
duration INT NOT NULL CHECK (duration > 0)
);
CREATE TABLE halls ( -- кинозалы
hall_id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
seats INT NOT NULL CHECK (seats > 0)
);
CREATE TABLE sessions ( -- сеансы
session_id INT PRIMARY KEY,
film_id INT NOT NULL,
hall_id INT NOT NULL,
start_time DATETIME NOT NULL,
price DECIMAL(8,2) NOT NULL,
FOREIGN KEY (film_id) REFERENCES films(film_id),
FOREIGN KEY (hall_id) REFERENCES halls(hall_id)
);
CREATE TABLE clients ( -- клиенты
client_id INT PRIMARY KEY,
full_name VARCHAR(120) NOT NULL,
phone VARCHAR(20)
);
CREATE TABLE film_tickets ( -- билеты
ticket_id INT PRIMARY KEY,
session_id INT NOT NULL,
client_id INT NOT NULL,
seat_no INT NOT NULL,
FOREIGN KEY (session_id) REFERENCES sessions(session_id),
FOREIGN KEY (client_id) REFERENCES clients(client_id)
);
INSERT INTO films VALUES
(1,'Звездный путь','фантастика',130),(2,'Любовь и город','мелодрама',105),
(3,'Гонка','боевик',118),(4,'Тайна леса','триллер',95),(5,'Веселые зверята','мультфильм',88);
INSERT INTO halls VALUES
(1,'Красный',120),(2,'Синий',80),(3,'Зеленый',60),(4,'VIP',30),(5,'Детский',50);
INSERT INTO sessions VALUES
(1,1,1,'2025-04-01 18:00',400),(2,2,2,'2025-04-01 20:00',350),
(3,3,1,'2025-04-01 21:30',400),(4,5,5,'2025-04-02 11:00',250),
(5,4,3,'2025-04-02 22:00',300);
INSERT INTO clients VALUES
(1,'Алёшин Кир','+7902-001'),(2,'Власова Ника','+7902-002'),
(3,'Гнатюк Лев','+7902-003'),(4,'Дёмина Роза','+7902-004'),(5,'Ефимов Тим','+7902-005');
INSERT INTO film_tickets VALUES
(1,1,1,15),(2,1,2,16),(3,2,3,5),(4,4,4,10),(5,1,5,17);
-- Запросы
-- 1) Выборка с условием: фильмы длиннее 100 минут
SELECT title, duration FROM films WHERE duration > 100;
-- 2) Соединение: сеанс, фильм и зал
SELECT s.session_id, f.title, h.name AS hall, s.start_time
FROM sessions s JOIN films f ON s.film_id = f.film_id
JOIN halls h ON s.hall_id = h.hall_id;
-- 3) Группировка: количество проданных билетов на каждый сеанс
SELECT s.session_id, COUNT(t.ticket_id) AS sold
FROM sessions s LEFT JOIN film_tickets t ON s.session_id = t.session_id
GROUP BY s.session_id;
-- 4) Подзапрос: фильмы, на которые проданы билеты
SELECT title FROM films WHERE film_id IN
(SELECT film_id FROM sessions WHERE session_id IN (SELECT session_id FROM film_tickets));
-- 5) Обновление: поднять цену вечерних сеансов на 50 руб.
UPDATE sessions SET price = price + 50 WHERE start_time >= '2025-04-01 18:00';
Задание 4. Краткое руководство пользователя
Руководство пользователя. Система автоматизирует кинотеатр: фильмы, залы, сеансы, клиентов и продажу билетов. Заполните фильмы и залы, сформируйте расписание сеансов. Билет связывает сеанс, клиента и место. Запрос с группировкой показывает заполняемость сеансов по числу проданных билетов.
Билет №14
Предметная область: Учет сотрудников и проектов в IT-компании
Таблицы: отделы, сотрудники, проекты, роли в проектах, навыки сотрудников.
Решение (SQL-скрипт: создание таблиц, тестовые данные, запросы)
-- Предметная область: Учет сотрудников и проектов в IT-компании
CREATE TABLE departments ( -- отделы
dept_id INT PRIMARY KEY,
name VARCHAR(80) NOT NULL UNIQUE
);
CREATE TABLE employees ( -- сотрудники
emp_id INT PRIMARY KEY,
full_name VARCHAR(120) NOT NULL,
dept_id INT NOT NULL,
salary DECIMAL(10,2) NOT NULL CHECK (salary > 0),
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
CREATE TABLE projects ( -- проекты
project_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
start_date DATE NOT NULL,
budget DECIMAL(12,2) NOT NULL
);
CREATE TABLE project_roles ( -- роли в проектах
role_id INT PRIMARY KEY,
project_id INT NOT NULL,
emp_id INT NOT NULL,
role_name VARCHAR(60) NOT NULL,
FOREIGN KEY (project_id) REFERENCES projects(project_id),
FOREIGN KEY (emp_id) REFERENCES employees(emp_id)
);
CREATE TABLE emp_skills ( -- навыки сотрудников
skill_id INT PRIMARY KEY,
emp_id INT NOT NULL,
skill VARCHAR(60) NOT NULL,
level VARCHAR(20) NOT NULL,
FOREIGN KEY (emp_id) REFERENCES employees(emp_id)
);
INSERT INTO departments VALUES
(1,'Разработка'),(2,'Тестирование'),(3,'Аналитика'),(4,'DevOps'),(5,'Дизайн');
INSERT INTO employees VALUES
(1,'Антонов Глеб',1,120000),(2,'Белова Мира',2,90000),
(3,'Власов Тим',1,110000),(4,'Громов Ян',4,130000),(5,'Дёмина Ева',5,95000);
INSERT INTO projects VALUES
(1,'CRM-система','2025-01-10',2000000),(2,'Мобильное приложение','2025-02-01',1500000),
(3,'Сайт-портал','2025-03-15',800000),(4,'Аналитика BI','2025-03-20',1200000),
(5,'Чат-бот','2025-04-01',500000);
INSERT INTO project_roles VALUES
(1,1,1,'Тимлид'),(2,1,3,'Разработчик'),(3,2,2,'Тестировщик'),
(4,2,4,'DevOps-инженер'),(5,3,5,'Дизайнер');
INSERT INTO emp_skills VALUES
(1,1,'Java','эксперт'),(2,1,'SQL','продвинутый'),(3,3,'Python','эксперт'),
(4,4,'Docker','эксперт'),(5,5,'Figma','продвинутый');
-- Запросы
-- 1) Выборка с условием: сотрудники с зарплатой выше 100000
SELECT full_name, salary FROM employees WHERE salary > 100000;
-- 2) Соединение: сотрудник, проект и его роль
SELECT e.full_name, p.name AS project, pr.role_name
FROM project_roles pr JOIN employees e ON pr.emp_id = e.emp_id
JOIN projects p ON pr.project_id = p.project_id;
-- 3) Группировка: число сотрудников в каждом отделе
SELECT d.name, COUNT(e.emp_id) AS staff
FROM departments d LEFT JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.name;
-- 4) Подзапрос: сотрудники, участвующие в проектах
SELECT full_name FROM employees WHERE emp_id IN (SELECT emp_id FROM project_roles);
-- 5) Обновление: повысить зарплату отдела 'Разработка' на 10%
UPDATE employees SET salary = salary * 1.10
WHERE dept_id = (SELECT dept_id FROM departments WHERE name = 'Разработка');
Задание 4. Краткое руководство пользователя
Руководство пользователя. Система учитывает сотрудников и проекты IT-компании. Заполните отделы и сотрудников, создайте проекты. Участие сотрудника в проекте оформляется ролью, навыки фиксируются отдельно. Запрос с группировкой показывает численность отделов.
Билет №15
Предметная область: Туристическое агентство и продажа туров
Таблицы: страны, отели, туры, туристы, заявки на бронирование.
Решение (SQL-скрипт: создание таблиц, тестовые данные, запросы)
-- Предметная область: Туристическое агентство и продажа туров
CREATE TABLE countries ( -- страны
country_id INT PRIMARY KEY,
name VARCHAR(60) NOT NULL UNIQUE
);
CREATE TABLE hotels ( -- отели
hotel_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
country_id INT NOT NULL,
stars INT CHECK (stars BETWEEN 1 AND 5),
FOREIGN KEY (country_id) REFERENCES countries(country_id)
);
CREATE TABLE tours ( -- туры
tour_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
hotel_id INT NOT NULL,
days INT NOT NULL CHECK (days > 0),
price DECIMAL(10,2) NOT NULL,
FOREIGN KEY (hotel_id) REFERENCES hotels(hotel_id)
);
CREATE TABLE tourists ( -- туристы
tourist_id INT PRIMARY KEY,
full_name VARCHAR(120) NOT NULL,
passport VARCHAR(20) NOT NULL UNIQUE
);
CREATE TABLE requests ( -- заявки на бронирование
request_id INT PRIMARY KEY,
tour_id INT NOT NULL,
tourist_id INT NOT NULL,
req_date DATE NOT NULL,
persons INT NOT NULL CHECK (persons > 0),
FOREIGN KEY (tour_id) REFERENCES tours(tour_id),
FOREIGN KEY (tourist_id) REFERENCES tourists(tourist_id)
);
INSERT INTO countries VALUES
(1,'Турция'),(2,'Египет'),(3,'Греция'),(4,'Таиланд'),(5,'Италия');
INSERT INTO hotels VALUES
(1,'Rixos Premium',1,5),(2,'Sunrise Resort',2,4),(3,'Olympic Palace',3,4),
(4,'Phuket Paradise',4,5),(5,'Roma Bella',5,3);
INSERT INTO tours VALUES
(1,'Анталия 10 дней',1,10,72000),(2,'Хургада 7 дней',2,7,58000),
(3,'Родос 9 дней',3,9,69000),(4,'Пхукет 12 дней',4,12,130000),
(5,'Рим экскурсии',5,6,85000);
INSERT INTO tourists VALUES
(1,'Агеев Лев','70 111111'),(2,'Бойко Яна','70 222222'),
(3,'Власюк Ким','70 333333'),(4,'Гущина Рита','70 444444'),(5,'Дроздов Ян','70 555555');
INSERT INTO requests VALUES
(1,1,1,'2025-03-01',2),(2,4,2,'2025-03-02',1),(3,1,3,'2025-03-03',3),
(4,3,4,'2025-03-05',2),(5,2,5,'2025-03-06',4);
-- Запросы
-- 1) Выборка с условием: туры дешевле 70000 руб.
SELECT name, price FROM tours WHERE price < 70000;
-- 2) Соединение: тур, отель и страна
SELECT t.name AS tour, h.name AS hotel, c.name AS country
FROM tours t JOIN hotels h ON t.hotel_id = h.hotel_id
JOIN countries c ON h.country_id = c.country_id;
-- 3) Группировка: число заявок и всего человек по каждому туру
SELECT t.name, COUNT(r.request_id) AS reqs, SUM(r.persons) AS persons_total
FROM tours t LEFT JOIN requests r ON t.tour_id = r.tour_id
GROUP BY t.name;
-- 4) Подзапрос: отели в стране 'Турция'
SELECT name FROM hotels WHERE country_id =
(SELECT country_id FROM countries WHERE name = 'Турция');
-- 5) Обновление: скидка 7% на туры в отели 5 звезд
UPDATE tours SET price = price * 0.93
WHERE hotel_id IN (SELECT hotel_id FROM hotels WHERE stars = 5);
Задание 4. Краткое руководство пользователя
Руководство пользователя. Система продажи туров. Заполните страны и отели (привязка к стране), сформируйте туры. Туристы оставляют заявки на бронирование с указанием тура и числа человек. Запрос с группировкой показывает спрос на туры по числу заявок и туристов.
Билет №16
Предметная область: Фитнес-клуб и абонементы
Таблицы: клиенты, тренеры, направления, абонементы, расписание занятий.
Решение (SQL-скрипт: создание таблиц, тестовые данные, запросы)
-- Предметная область: Фитнес-клуб и абонементы
CREATE TABLE directions ( -- направления
direction_id INT PRIMARY KEY,
name VARCHAR(60) NOT NULL UNIQUE
);
CREATE TABLE trainers ( -- тренеры
trainer_id INT PRIMARY KEY,
full_name VARCHAR(120) NOT NULL,
direction_id INT NOT NULL,
FOREIGN KEY (direction_id) REFERENCES directions(direction_id)
);
CREATE TABLE clients ( -- клиенты
client_id INT PRIMARY KEY,
full_name VARCHAR(120) NOT NULL,
phone VARCHAR(20) NOT NULL
);
CREATE TABLE memberships ( -- абонементы
membership_id INT PRIMARY KEY,
client_id INT NOT NULL,
start_date DATE NOT NULL,
months INT NOT NULL CHECK (months > 0),
price DECIMAL(10,2) NOT NULL,
FOREIGN KEY (client_id) REFERENCES clients(client_id)
);
CREATE TABLE schedule ( -- расписание занятий
lesson_id INT PRIMARY KEY,
direction_id INT NOT NULL,
trainer_id INT NOT NULL,
lesson_time DATETIME NOT NULL,
FOREIGN KEY (direction_id) REFERENCES directions(direction_id),
FOREIGN KEY (trainer_id) REFERENCES trainers(trainer_id)
);
INSERT INTO directions VALUES
(1,'Йога'),(2,'Кроссфит'),(3,'Бокс'),(4,'Пилатес'),(5,'Плавание');
INSERT INTO trainers VALUES
(1,'Антонов Глеб',2),(2,'Белова Майя',1),(3,'Власов Тим',3),
(4,'Громова Зоя',4),(5,'Дёмин Лев',5);
INSERT INTO clients VALUES
(1,'Егоров Ким','+7903-001'),(2,'Жукова Ия','+7903-002'),
(3,'Зорин Влад','+7903-003'),(4,'Исаев Ян','+7903-004'),(5,'Котова Аня','+7903-005');
INSERT INTO memberships VALUES
(1,1,'2025-03-01',6,12000),(2,2,'2025-03-05',3,7000),
(3,3,'2025-03-10',12,20000),(4,4,'2025-03-12',1,3000),(5,5,'2025-03-15',6,12000);
INSERT INTO schedule VALUES
(1,1,2,'2025-03-20 10:00'),(2,2,1,'2025-03-20 12:00'),
(3,3,3,'2025-03-20 18:00'),(4,4,4,'2025-03-21 09:00'),(5,5,5,'2025-03-21 19:00');
-- Запросы
-- 1) Выборка с условием: абонементы дороже 10000 руб.
SELECT membership_id, price FROM memberships WHERE price > 10000;
-- 2) Соединение: занятие, направление и тренер
SELECT s.lesson_time, dr.name AS direction, t.full_name AS trainer
FROM schedule s JOIN directions dr ON s.direction_id = dr.direction_id
JOIN trainers t ON s.trainer_id = t.trainer_id;
-- 3) Группировка: сумма проданных абонементов по каждому клиенту
SELECT c.full_name, SUM(m.price) AS total
FROM clients c JOIN memberships m ON c.client_id = m.client_id
GROUP BY c.full_name;
-- 4) Подзапрос: тренеры направления 'Бокс'
SELECT full_name FROM trainers WHERE direction_id =
(SELECT direction_id FROM directions WHERE name = 'Бокс');
-- 5) Обновление: продлить абонемент membership_id=4 на 2 месяца
UPDATE memberships SET months = months + 2 WHERE membership_id = 4;
Задание 4. Краткое руководство пользователя
Руководство пользователя. Система фитнес-клуба учитывает направления, тренеров, клиентов, абонементы и расписание. Заполните направления и тренеров, зарегистрируйте клиентов и продайте абонементы. Расписание связывает направление, тренера и время. Запрос с группировкой считает выручку по клиентам.
Билет №17
Предметная область: Агентство недвижимости и аренда квартир
Таблицы: собственники, объекты недвижимости, районы, арендаторы, договоры аренды.
Решение (SQL-скрипт: создание таблиц, тестовые данные, запросы)
-- Предметная область: Агентство недвижимости и аренда квартир
CREATE TABLE districts ( -- районы
district_id INT PRIMARY KEY,
name VARCHAR(60) NOT NULL UNIQUE
);
CREATE TABLE owners ( -- собственники
owner_id INT PRIMARY KEY,
full_name VARCHAR(120) NOT NULL,
phone VARCHAR(20) NOT NULL
);
CREATE TABLE properties ( -- объекты недвижимости
property_id INT PRIMARY KEY,
address VARCHAR(150) NOT NULL,
district_id INT NOT NULL,
owner_id INT NOT NULL,
rooms INT NOT NULL CHECK (rooms > 0),
rent_price DECIMAL(10,2) NOT NULL,
FOREIGN KEY (district_id) REFERENCES districts(district_id),
FOREIGN KEY (owner_id) REFERENCES owners(owner_id)
);
CREATE TABLE tenants ( -- арендаторы
tenant_id INT PRIMARY KEY,
full_name VARCHAR(120) NOT NULL,
passport VARCHAR(20) NOT NULL UNIQUE
);
CREATE TABLE rent_contracts ( -- договоры аренды
contract_id INT PRIMARY KEY,
property_id INT NOT NULL,
tenant_id INT NOT NULL,
start_date DATE NOT NULL,
months INT NOT NULL CHECK (months > 0),
FOREIGN KEY (property_id) REFERENCES properties(property_id),
FOREIGN KEY (tenant_id) REFERENCES tenants(tenant_id)
);
INSERT INTO districts VALUES
(1,'Центральный'),(2,'Заречье'),(3,'Северный'),(4,'Южный'),(5,'Зеленый');
INSERT INTO owners VALUES
(1,'Аксёнов Лев','+7904-001'),(2,'Белая Рита','+7904-002'),
(3,'Власов Ким','+7904-003'),(4,'Гордеев Ян','+7904-004'),(5,'Дёмина Оля','+7904-005');
INSERT INTO properties VALUES
(1,'ул. Ленина, 5-12',1,1,2,35000),(2,'ул. Мира, 8-3',2,2,1,25000),
(3,'пр. Победы, 40-77',1,3,3,50000),(4,'ул. Садовая, 2-9',4,4,1,22000),
(5,'ул. Парковая, 11-5',5,5,2,38000);
INSERT INTO tenants VALUES
(1,'Емельянов Ян','40 111111'),(2,'Жукова Ия','40 222222'),
(3,'Зорин Лев','40 333333'),(4,'Исаева Аня','40 444444'),(5,'Котов Влад','40 555555');
INSERT INTO rent_contracts VALUES
(1,1,1,'2025-03-01',12),(2,2,2,'2025-03-05',6),(3,3,3,'2025-03-10',24),
(4,4,4,'2025-03-12',12),(5,1,5,'2025-04-01',6);
-- Запросы
-- 1) Выборка с условием: объекты с арендой дороже 30000 руб.
SELECT address, rent_price FROM properties WHERE rent_price > 30000;
-- 2) Соединение: договор, объект и арендатор
SELECT rc.contract_id, p.address, t.full_name AS tenant, rc.months
FROM rent_contracts rc JOIN properties p ON rc.property_id = p.property_id
JOIN tenants t ON rc.tenant_id = t.tenant_id;
-- 3) Группировка: число объектов в каждом районе
SELECT d.name, COUNT(p.property_id) AS objects
FROM districts d LEFT JOIN properties p ON d.district_id = p.district_id
GROUP BY d.name;
-- 4) Подзапрос: объекты, которые сдаются в аренду (есть договор)
SELECT address FROM properties WHERE property_id IN (SELECT property_id FROM rent_contracts);
-- 5) Обновление: поднять аренду в 'Центральном' районе на 5%
UPDATE properties SET rent_price = rent_price * 1.05
WHERE district_id = (SELECT district_id FROM districts WHERE name = 'Центральный');
Задание 4. Краткое руководство пользователя
Руководство пользователя. Система агентства недвижимости ведет районы, собственников, объекты, арендаторов и договоры. Заполните районы и собственников, внесите объекты. Договор аренды связывает объект и арендатора. Запрос с группировкой показывает распределение объектов по районам.
Билет №18
Предметная область: Служба доставки посылок
Таблицы: клиенты, посылки, курьеры, маршруты, доставки.
Решение (SQL-скрипт: создание таблиц, тестовые данные, запросы)
-- Предметная область: Служба доставки посылок
CREATE TABLE clients ( -- клиенты
client_id INT PRIMARY KEY,
full_name VARCHAR(120) NOT NULL,
phone VARCHAR(20) NOT NULL
);
CREATE TABLE couriers ( -- курьеры
courier_id INT PRIMARY KEY,
full_name VARCHAR(120) NOT NULL,
transport VARCHAR(40) NOT NULL
);
CREATE TABLE routes ( -- маршруты
route_id INT PRIMARY KEY,
name VARCHAR(80) NOT NULL,
distance DECIMAL(6,1) NOT NULL
);
CREATE TABLE parcels ( -- посылки
parcel_id INT PRIMARY KEY,
client_id INT NOT NULL,
weight DECIMAL(6,2) NOT NULL CHECK (weight > 0),
address_to VARCHAR(150) NOT NULL,
FOREIGN KEY (client_id) REFERENCES clients(client_id)
);
CREATE TABLE deliveries ( -- доставки
delivery_id INT PRIMARY KEY,
parcel_id INT NOT NULL,
courier_id INT NOT NULL,
route_id INT NOT NULL,
status VARCHAR(30) NOT NULL DEFAULT 'в пути',
FOREIGN KEY (parcel_id) REFERENCES parcels(parcel_id),
FOREIGN KEY (courier_id) REFERENCES couriers(courier_id),
FOREIGN KEY (route_id) REFERENCES routes(route_id)
);
INSERT INTO clients VALUES
(1,'Антонов Ян','+7905-001'),(2,'Белова Ия','+7905-002'),
(3,'Власов Лев','+7905-003'),(4,'Гущин Ким','+7905-004'),(5,'Дёмина Аня','+7905-005');
INSERT INTO couriers VALUES
(1,'Егоров Глеб','велосипед'),(2,'Жуков Тим','автомобиль'),
(3,'Зорин Влад','пешком'),(4,'Исаев Лев','скутер'),(5,'Котов Ян','автомобиль');
INSERT INTO routes VALUES
(1,'Центр-Север',8.5),(2,'Центр-Юг',12.0),(3,'Запад',6.0),
(4,'Восток',15.0),(5,'Кольцо',20.0);
INSERT INTO parcels VALUES
(1,1,2.5,'ул. Ленина, 5'),(2,2,0.8,'ул. Мира, 8'),(3,3,5.0,'пр. Победы, 40'),
(4,4,1.2,'ул. Садовая, 2'),(5,5,3.3,'ул. Парковая, 11');
INSERT INTO deliveries VALUES
(1,1,1,1,'доставлено'),(2,2,2,2,'в пути'),(3,3,5,4,'в пути'),
(4,4,4,3,'доставлено'),(5,5,2,5,'ожидает');
-- Запросы
-- 1) Выборка с условием: посылки тяжелее 2 кг
SELECT parcel_id, weight FROM parcels WHERE weight > 2;
-- 2) Соединение: доставка, посылка и курьер
SELECT d.delivery_id, p.address_to, c.full_name AS courier, d.status
FROM deliveries d JOIN parcels p ON d.parcel_id = p.parcel_id
JOIN couriers c ON d.courier_id = c.courier_id;
-- 3) Группировка: число доставок у каждого курьера
SELECT c.full_name, COUNT(d.delivery_id) AS deliveries_cnt
FROM couriers c LEFT JOIN deliveries d ON c.courier_id = d.courier_id
GROUP BY c.full_name;
-- 4) Подзапрос: клиенты, чьи посылки еще не доставлены
SELECT full_name FROM clients WHERE client_id IN
(SELECT client_id FROM parcels WHERE parcel_id IN
(SELECT parcel_id FROM deliveries WHERE status <> 'доставлено'));
-- 5) Обновление: отметить доставку delivery_id=2 как доставленную
UPDATE deliveries SET status = 'доставлено' WHERE delivery_id = 2;
Задание 4. Краткое руководство пользователя
Руководство пользователя. Система службы доставки учитывает клиентов, курьеров, маршруты, посылки и доставки. Зарегистрируйте клиентов и курьеров, заведите маршруты. Посылка принадлежит клиенту; доставка связывает посылку, курьера и маршрут. Запрос с группировкой показывает нагрузку курьеров.