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 строки)
    

Надеемся, что эти несколько простых примеров помогли составить представление о содержимом демонстрационной базы данных.