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


Билет №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. Краткое руководство пользователя
Руководство пользователя. Система службы доставки учитывает клиентов, курьеров, маршруты, посылки и доставки. Зарегистрируйте клиентов и курьеров, заведите маршруты. Посылка принадлежит клиенту; доставка связывает посылку, курьера и маршрут. Запрос с группировкой показывает нагрузку курьеров.