💻 Примеры
⚡ Кратко: примеры
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;