← К оглавлению занятия

💻 Примеры

⚡ Кратко: примеры

  • hr: фильтр по отделу, зарплате, фамилии; условное поле; средняя зарплата.
  • world: JOIN стран с городами и языками; подсчёт записей.
  • Airlines: группировка самолётов, рейсов, билетов; оконная функция RANK().

База данных hr

Сотрудники отдела 90

Точное совпадение по числовому идентификатору отдела.

SELECT *
FROM employees
WHERE department_id = 90;

Сотрудники с зарплатой больше 5000

Сравнение числового столбца.

SELECT first_name, last_name, salary
FROM employees
WHERE salary > 5000;

Сотрудники, фамилия которых начинается на L

Шаблон L% находит фамилии, начинающиеся с буквы L.

SELECT first_name, last_name
FROM employees
WHERE last_name LIKE 'L%';

Зарплата сотрудника Lex De Haan

Два условия на имя и фамилию соединяются через AND.

SELECT salary
FROM employees
WHERE first_name = 'Lex' AND last_name = 'De Haan';

Условное поле SALARY_GROUP

CASE помечает зарплату выше 10000 единицей, остальные — нулём.

SELECT first_name, last_name, salary,
       CASE
         WHEN salary > 10000 THEN 1
         ELSE 0
       END AS salary_group
FROM employees;

Средняя зарплата сотрудников с зарплатой меньше 10000

Фильтр накладывается до агрегации через WHERE.

SELECT AVG(salary) AS avg_salary
FROM employees
WHERE salary < 10000;

База данных world

Страны со столицами

Соединяем страну и город по полю Capital.

SELECT country.Name AS country_name, city.Name AS capital
FROM country
JOIN city ON country.Capital = city.ID;

Страны с языками

Каждая строка — одна страна и один язык.

SELECT country.Name AS country_name, countrylanguage.Language
FROM country
JOIN countrylanguage ON country.Code = countrylanguage.CountryCode;

Страны с официальными языками

Добавляем фильтр на официальный статус языка.

SELECT country.Name AS country_name, countrylanguage.Language
FROM country
JOIN countrylanguage ON country.Code = countrylanguage.CountryCode
WHERE countrylanguage.IsOfficial = 'T';

Сравнение количества записей

Три независимых запроса подсчитывают строки в каждом результате.

SELECT COUNT(*) FROM country JOIN city ON country.Capital = city.ID;
SELECT COUNT(*) FROM country JOIN countrylanguage ON country.Code = countrylanguage.CountryCode;
SELECT COUNT(*) FROM country JOIN countrylanguage ON country.Code = countrylanguage.CountryCode
WHERE countrylanguage.IsOfficial = 'T';

База данных Airlines

Количество самолётов каждой модели

Группировка по модели с подсчётом строк.

SELECT model, COUNT(*) AS aircraft_count
FROM aircraft
GROUP BY model;

Количество самолётов по странам

Если в таблице aircraft есть поле country, группируем по нему.

SELECT country, COUNT(*) AS aircraft_count
FROM aircraft
GROUP BY country;

Количество trips для каждого типа лайнера

Группировка рейсов по полю plane.

SELECT plane, COUNT(*) AS trip_count
FROM trips
GROUP BY plane;

Билеты с собственной ценой и средней ценой по всей таблице

Оконная функция AVG() OVER () считает среднее по всем строкам без группировки.

SELECT id, price, AVG(price) OVER () AS avg_price
FROM tickets;

Средняя стоимость билета в каждом классе обслуживания

Классическая группировка с агрегатом.

SELECT service_class, AVG(price) AS avg_price
FROM tickets
GROUP BY service_class;

Поездки по убыванию количества билетов

Соединяем рейсы и билеты, группируем и сортируем.

SELECT trips.id, trips.trip_no, COUNT(tickets.id) AS ticket_count
FROM trips
JOIN tickets ON trips.id = tickets.trip_id
GROUP BY trips.id, trips.trip_no
ORDER BY ticket_count DESC;

Ранг поездки по количеству билетов

Оконная функция RANK() расставляет ранг после группировки. В MySQL 8+ и PostgreSQL запрос выполняется в два этапа: сначала агрегируем, затем ранжируем во вложенном запросе или CTE.

SELECT id, trip_no, ticket_count,
       RANK() OVER (ORDER BY ticket_count DESC) AS trip_rank
FROM (
    SELECT trips.id, trips.trip_no, COUNT(tickets.id) AS ticket_count
    FROM trips
    JOIN tickets ON trips.id = tickets.trip_id
    GROUP BY trips.id, trips.trip_no
) AS trip_stats;
⚠️ Проверить по документации: точные имена столбцов и доступность оконных функций зависят от версии СУБД.