M.5. Использование #
M.5.1. Переводы #
По умолчанию значения различных переводимых полей выдаются на английском языке. Это поля airport_name, city и coutry представления airports, а также поле model представления airplanes.
Вы можете выбрать отображение этих полей на русском языке (единственный перевод, который предоставляется в демонстрационной базе). Чтобы переключиться на русский язык, задайте для параметра bookings.lang значение ru:
SET bookings.lang = 'ru';
или
ALTER DATABASE demo SET bookings.lang = 'ru';
Необходимо переподключиться к базе данных, чтобы изменения после выполнения команды вступили в силу.
M.5.2. Примеры запросов #
Чтобы лучше познакомиться с содержимым демонстрационной базы данных, посмотрим на результаты нескольких простых запросов.
Результаты, представленные ниже, были получены для версии с небольшой базой данных PostgresPro 2025-09-01 (91 день) от 13 октября 2016. Если в вашей системе запросы выдают другие данные, проверьте версию демонстрационной базы (функция bookings.version). Незначительные отклонения могут быть связаны с местным временем, отличным от московского, и настройками локализации.
Все рейсы выполняются несколькими типами самолётов:
SELECT * FROM airplanes;
airplane_code | model | range | speed
---------------+------------------------+-------+-------
32N | Аэробус A320neo | 6500 | 830
339 | Аэробус A330-900neo | 13300 | 870
351 | Аэробус A350-1000 | 16700 | 913
35X | Аэробус A350F | 8700 | 903
76F | Боинг 767-300F | 6000 | 850
77W | Боинг 777-300ER | 14600 | 905
789 | Боинг 787-9 Dreamliner | 14000 | 913
7M7 | Боинг 737 MAX 7 | 7000 | 840
CR7 | Бомбардье CRJ700 | 3100 | 829
E70 | Эмбраэр E170 | 4000 | 800
(10 строк)
Для каждого типа самолёта поддерживается отдельный список мест. Например, в бизнес-классе Embraer E170 можно выбрать следующие места:
SELECT *
FROM seats
WHERE airplane_code = 'E70' AND fare_conditions = 'Business';
airplane_code | seat_no | fare_conditions
---------------+---------+-----------------
E70 | 1A | Business
E70 | 1C | Business
E70 | 1D | Business
E70 | 2A | Business
E70 | 2C | Business
E70 | 2D | Business
(6 строк)
В самолётах большего размера имеется больше мест различных классов обслуживания:
SELECT
s.airplane_code,
string_agg (s.fare_conditions || '(' || s.num || ')', ', ') AS fare_conditions
FROM (
SELECT airplane_code, fare_conditions, count(*)::text AS num
FROM seats
GROUP BY airplane_code, fare_conditions
) s
GROUP BY s.airplane_code
ORDER BY s.airplane_code;
airplane_code | fare_conditions
---------------+-----------------------------------------
32N | Business(28), Economy(138)
339 | Business(29), Economy(224), Comfort(28)
351 | Economy(281), Business(44)
77W | Economy(326), Business(30), Comfort(48)
789 | Economy(188), Business(48), Comfort(21)
7M7 | Business(16), Economy(144)
CR7 | Business(6), Economy(52), Comfort(12)
E70 | Business(6), Economy(72)
(8 строк)
Airbus A350F и Boeing 767-300F являются грузовыми и не выполняют пассажирские рейсы.
Демонстрационная база данных содержит перечень практически всех крупных аэропортов. В большинстве городов есть только один аэропорт.
SELECT
count(*) airports,
count(distinct country||','||city) cities,
count(distinct country) countries
FROM airports;
airports | cities | countries
----------+--------+-----------
5501 | 5157 | 230
(1 строка)Например, в Москве пять аэропортов:
SELECT airport_code, airport_name, coordinates, timezone FROM airports WHERE country = 'Россия' AND city = 'Москва'; airport_code | airport_name | coordinates | timezone --------------+--------------+-------------------+--------------- BKA | Быково | (38.06,55.6172) | Europe/Moscow DME | Домодедово | (37.9063,55.4088) | Europe/Moscow OSF | Остафьево | (37.5072,55.5117) | Europe/Moscow SVO | Шереметьево | (37.4146,55.9726) | Europe/Moscow VKO | Внуково | (37.2615,55.5915) | Europe/Moscow (5 строк)
Маршрутная сеть хранится в таблице routes. Например, вот направления, куда можно отправиться из Рима 1 ноября 2025 года:
SELECT r.route_no, a.airport_code, a.airport_name, a.city, a.country, r.days_of_week,
r.duration
FROM routes r
JOIN airports a ON a.airport_code = r.arrival_airport
WHERE departure_airport = (SELECT airport_code FROM airports WHERE airport_name =
'Фьюмичино')
AND validity @> '2025-11-01 00:00:00CET'::timestamptz;
route_no | airport_code | airport_name | city | country | days_of_week | duration
----------+--------------+--------------+---------+-------------------+-----------------+----------
PG0086 | BGY | Бергамо | Милан | Италия | {1,2,3,4,5,6,7} | 01:05:00
PG0176 | ORY | Орли | Париж | Франция | {2,4,6,7} | 01:55:00
PG0228 | HGH | Сяошань | Ханчжоу | Китай | {7} | 11:30:00
PG0233 | MXP | Мальпенса | Милан | Италия | {1,2,3,4,5,6,7} | 01:05:00
PG0235 | ORD | О'Хара | Чикаго | Соединённые Штаты | {2} | 09:50:00
(5 строк)
Обратите внимание, что часовой пояс — CET, Центральноевропейское время.
База данных была сформирована на момент времени, возвращаемый функцией bookings.now():
SELECT bookings.now();
now
------------------------
2025-12-01 00:00:00+03
(1 строка)
Все рейсы классифицируются как совершённые и будущие относительно этого момента:
SELECT
status,
count(*) AS count,
min(scheduled_departure) AS min_scheduled_departure,
max(scheduled_departure) AS max_scheduled_departure
FROM flights
GROUP BY status
ORDER BY min_scheduled_departure;
status | count | min_scheduled_departure | max_scheduled_departure
-----------+-------+-------------------------+-------------------------
Arrived | 10966 | 2025-10-01 03:00:00+03 | 2025-12-01 02:10:00+03
Cancelled | 121 | 2025-10-01 15:25:00+03 | 2026-01-29 19:20:00+03
Departed | 20 | 2025-11-30 15:50:00+03 | 2025-12-01 02:50:00+03
Boarding | 4 | 2025-12-01 02:55:00+03 | 2025-12-01 03:25:00+03
Delayed | 10 | 2025-12-01 03:30:00+03 | 2025-12-02 01:00:00+03
On Time | 157 | 2025-12-01 03:35:00+03 | 2025-12-02 02:55:00+03
Scheduled | 10480 | 2025-12-02 03:10:00+03 | 2026-01-30 02:55:00+03
(7 строк)
Найдём следующий рейс из Екатеринбурга (аэропорт SVX) в Ухань (аэропорт WUH). Используем представление timetable, чтобы избежать соединения таблиц flights и routes:
SELECT *
FROM timetable t
WHERE t.departure_airport = 'SVX'
AND t.arrival_airport = 'WUH'
AND t.scheduled_departure > bookings.now()
ORDER BY t.scheduled_departure
LIMIT 1 \gx
-[ RECORD 1 ]-------------+-----------------------
flight_id | 11465
route_no | PG0522
departure_airport | SVX
arrival_airport | WUH
status | Scheduled
airplane_code | 7M7
scheduled_departure | 2025-12-03 10:30:00+03
scheduled_departure_local | 2025-12-03 12:30:00
actual_departure |
actual_departure_local |
scheduled_arrival | 2025-12-03 17:30:00+03
scheduled_arrival_local | 2025-12-03 22:30:00
actual_arrival |
actual_arrival_local |
Обратите внимание, что представлены два типа времени: местное (московское) и местное время в аэропорте назначения.
M.5.3. Бронирования #
Каждое бронирование может включать несколько билетов, по одному на каждого пассажира. Билет, в свою очередь, может включать несколько перелётов. Полная информация о бронировании находится в трёх таблицах: bookings, tickets и segments.
Взглянем на бронирование с кодом JU35I4:
SELECT * FROM bookings WHERE book_ref = 'JU35I4';
book_ref | book_date | total_amount
----------+-------------------------------+--------------
JU35I4 | 2025-10-09 06:53:16.710703+03 | 86750.00
(1 строка)
В нём содержатся следующие билеты:
SELECT *
FROM tickets
WHERE book_ref = 'JU35I4';
ticket_no | book_ref | passenger_id | passenger_name | outbound
---------------+----------+------------------+-------------------+----------
0005433348362 | JU35I4 | RU 2714075620824 | Nadezhda Sergeeva | t
0005433348356 | JU35I4 | RU 8692103212506 | Artur Isakov | t
(2 строки)
Чтобы узнать, какие перелёты включены в билет Надежды Сергеевой, выполним следующий запрос:
SELECT r.route_no,
dep.airport_code dep_airport, dep.country dep_country, dep.city dep_city,
arr.airport_code arr_airport, arr.country arr_country, arr.city arr_city
FROM segments s
JOIN flights f ON f.flight_id = s.flight_id
JOIN routes r ON r.route_no = f.route_no AND r.validity @> f.scheduled_departure
JOIN airports dep ON dep.airport_code = r.departure_airport
JOIN airports arr ON arr.airport_code = r.arrival_airport
WHERE s.ticket_no = '0005433348362'
ORDER BY f.scheduled_departure;
route_no | dep_airport | dep_country | dep_city | arr_airport | arr_country | arr_city
----------+-------------+-------------+--------------------+-------------+-------------+--------------------
PG0370 | OVB | Россия | Новосибирск | SVO | Россия | Москва
PG0179 | SVO | Россия | Москва | FRA | Германия | Франкфурт-на-Майне
PG0408 | FRA | Германия | Франкфурт-на-Майне | FCO | Италия | Рим
PG0482 | FCO | Италия | Рим | HEL | Финляндия | Хельсинки
(3 строки)
Как видно, Надежда летит из Новосибирска в Хельсинки с пересадками в Москве, Франкфурте-на-Майне и Риме.
Некоторые перелёты в этом билете имеют более ранние даты, чем возвращает функция bookings.now(): это значит, что эти рейсы уже были выполнены. После регистрации на первый рейс пассажир получает посадочные талоны с номерами мест. Первые два посадочных талона Надежды содержат номер и время посадки, в то время как в двух последних время посадки пока не указано:
SELECT f.route_no, f.flight_id, f.status, bp.seat_no, bp.boarding_no, bp.boarding_time
FROM flights f
JOIN boarding_passes bp ON bp.flight_id = f.flight_id
WHERE bp.ticket_no = '0005433348362'
ORDER BY f.scheduled_departure;
route_no | flight_id | status | seat_no | boarding_no | boarding_time
----------+-----------+-----------+---------+-------------+-------------------------------
PG0370 | 10817 | Arrived | 17B | 45 | 2025-11-29 18:18:42.972147+03
PG0179 | 10935 | Arrived | 16A | 33 | 2025-11-30 11:54:41.297034+03
PG0408 | 11108 | On Time | 24C | |
PG0482 | 11264 | Scheduled | 4B | |
(4 строки)
Надеемся, что эти несколько простых примеров помогли составить представление о содержимом демонстрационной базы данных.