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

✅ Решения

⚡ Кратко: решения

  • hr: WHERE, LIKE, CASE, AVG.
  • world: JOIN + фильтр IsOfficial = 'T'; больше всего строк — у стран с языками.
  • Airlines: GROUP BY, JOIN для билетов, RANK() OVER во вложенном запросе.

Блок 1. База данных hr

1.1

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

Фильтр по точному значению числового столбца.

SELECT *
FROM employees
WHERE department_id = 90;
1.2

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

Числовое сравнение в WHERE.

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

Сотрудники с фамилией на L

Шаблон 'L%' находит строки, начинающиеся с L.

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

Зарплата Lex De Haan

Два условия на строковые столбцы соединены через AND.

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

Поле SALARY_GROUP

Условное выражение формирует флаг: 1 — зарплата выше 10000, иначе 0.

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

Средняя зарплата ниже 10000

Сначала отбираем нужные строки через WHERE, затем считаем среднее.

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

Блок 2. База данных world

2.1

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

Соединяем country и city по идентификатору столицы.

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

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

Соединяем страны со всеми языками.

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

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

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

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

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

Выполняем три отдельных запроса COUNT(*). Больше всего строк будет в запросе 2.2, потому что одна страна может иметь много языков; меньше всего — в запросе 2.3, где остаются только официальные языки.

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';

Блок 3. База данных Airlines

3.1

Самолёты по моделям

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

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

Самолёты по странам

Группировка по стране регистрации самолёта.

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

Рейсы по типам лайнеров

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

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

Билеты и средняя цена

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

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

Средняя цена по классам

Классическая группировка с агрегатной функцией.

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

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

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

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;
3.7

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

Сначала агрегируем данные во вложенном запросе, затем ранжируем полученный набор через RANK() OVER.

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;
⚠️ Проверить по документации: точные имена столбцов и поддержка оконных функций зависят от версии СУБД.