Bookings 数据库:航空公司模式、表和 SQL 练习
Bookings 是 PostgreSQL 的航空公司演示数据库:包含 104 个机场之间的航班、预订、机票和登机牌。 在 SQLtest.online 上,你可以直接在浏览器中查询它:做自动判题的练习,或在练习场中运行自己的查询,无需安装任何软件。
- 8 张表和 4 个视图
- 33,121 个航班
- 1,045,726 条机票航段
- 52 道 SQL 练习
什么是 Bookings
Bookings 是 Postgres Professional 公司为学习 PostgreSQL 发布的演示数据库。它模拟一家俄罗斯航空公司的航班:航线、飞机及其座位图、预订、机票和登机牌。
这个副本包含 2017 年 7 月至 9 月的航班。机场和飞机名称以 JSONB 形式存储英文和俄文,机场坐标使用 point 类型。因此它既适合练习 PostgreSQL 的特有功能,也适合练习 JOIN 和大表上的数据分析。
ER 图
该图展示了 Bookings 的表以及它们之间的外键关系。点击可查看完整尺寸。
数据库包含什么
这些表分为两组。
参考数据
airports_data、aircrafts_data 和 seats:每种机型的座位图。
销售和航班
bookings → tickets → ticket_flights ← flights,以及值机时发放的 boarding_passes。
最需要记住的一点:一个预订可以包含多名乘客,一张机票可以包含多个航段。机票和航班通过 ticket_flights 关联,这是最大的一张表。视图 aircrafts、airports、flights_v 和 routes 以更易读的形式展示相同的数据。
各表的数据量:
| 表 | 行数 | 内容 |
|---|---|---|
| bookings | 262,788 | 预订 |
| tickets | 366,733 | 机票,每位乘客一张 |
| ticket_flights | 1,045,726 | 机票包含的航段 |
| boarding_passes | 579,686 | 登机牌 |
| flights | 33,121 | 计划和已执行的航班 |
| airports_data | 104 | 机场 |
| aircrafts_data | 9 | 机型 |
| seats | 1,339 | 各机型的座位 |
表结构
点击表名可查看它的列、示例行和键。
表列表
- aircraft_code每架飞机的唯一代码
- model飞机型号名称,英文和俄文以JSON格式表示
- range飞机飞行范围,单位为公里
- 主键,btree (aircraft_code)
| aircraft_code | model | range | |
|---|---|---|---|
| 1 | 773 | {"en": "Boeing 777-300", "ru": "Боинг 777-300"} | 11100 |
- airport_code每个机场的唯一代码
- airport_name机场名称,英文和俄文以JSON格式表示
- city机场所在城市,英文和俄文以JSON格式表示
- coordinates机场坐标,格式为POINT(经度,纬度)
- timezone机场时区名称
- 主键,btree (airport_code)
| airport_code | airport_name | city | coordinates | timezone | |
|---|---|---|---|---|---|
| 1 | YKS | {"en": "Yakutsk Airport", "ru": "Якутск"} | {"en": "Yakutsk", "ru": "Якутск"} | (129.77099609375,62.0932998657227) | Asia/Yakutsk |
- ticket_no票号
- flight_id航班标识符
- boarding_no登机牌号码
- seat_no座位号码
- 主键,btree (ticket_no, flight_id)
- 唯一约束,btree (flight_id, boarding_no)
- 唯一约束,btree (flight_id, seat_no)
- 外键 (ticket_no, flight_id) 参考 ticket_flights(ticket_no, flight_id)
| ticket_no | flight_id | boarding_no | seat_no | |
|---|---|---|---|---|
| 1 | 0005435212351 | 30625 | 1 | 2D |
- book_ref预订号码
- book_date预订日期
- total_amount总预订费用
- 主键,btree (book_ref)
| book_ref | book_date | total_amount | |
|---|---|---|---|
| 1 | 00000F | 2017-07-05 00:12:00+00 | 265700.00 |
- flight_id航班ID
- flight_no航班号码
- scheduled_departure计划出发时间
- scheduled_arrival计划到达时间
- departure_airport出发机场
- arrival_airport到达机场
- status航班状态
- aircraft_code飞机代码,IATA
- actual_departure实际出发时间
- actual_arrival实际到达时间
- 主键,btree (flight_id)
- 唯一约束,btree (flight_no, scheduled_departure)
| flight_id | flight_no | scheduled_departure | scheduled_arrival | departure_airport | arrival_airport | status | aircraft_code | actual_departure | actual_arrival | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1185 | PG0134 | 2017-09-10 06:50:00+00 | 2017-09-10 11:55:00+00 | DME | BTK | 计划中 | 319 |
- aircraft_code飞机代码,IATA
- seat_no座位号码
- fare_conditions旅行舱位
- 主键,btree (aircraft_code, seat_no)
- 外键 (aircraft_code) 参考 aircrafts(aircraft_code) ON DELETE CASCADE
| aircraft_code | seat_no | fare_conditions | |
|---|---|---|---|
| 1 | 319 | 2A | 商务舱 |
- ticket_no票号
- flight_id航班ID
- fare_conditions旅行舱位
- amount旅行费用
- 主键,btree (ticket_no, flight_id)
- 外键 (flight_id) 参考 flights(flight_id)
- 外键 (ticket_no) 参考 tickets(ticket_no)
| ticket_no | flight_id | fare_conditions | amount | |
|---|---|---|---|---|
| 1 | 0005432159776 | 30625 | 商务舱 | 42100.00 |
- ticket_no票号
- book_ref预订号码
- passenger_id乘客ID
- passenger_name乘客姓名
- contact_data乘客联系信息
| ticket_no | book_ref | passenger_id | passenger_name | contact_data | |
|---|---|---|---|---|---|
| 1 | 0005432000987 | 06B046 | 8149 604011 | VALERIY TIKHONOV | {"phone": "+70127117011"} |
- 主键,btree (ticket_no)
- 外键 (book_ref) 参考 bookings(book_ref)
示例查询
这些查询展示了数据之间是如何关联的。复制任意一条,在练习场中运行即可。
机票及其预订:乘客和预订金额。
SELECT t.ticket_no, t.passenger_name, b.book_date, b.total_amount
FROM tickets t
JOIN bookings b ON b.book_ref = t.book_ref
ORDER BY t.ticket_no
LIMIT 3;
| ticket_no | passenger_name | book_date | total_amount |
|---|---|---|---|
| 0005432000987 | VALERIY TIKHONOV | 2017-07-05 17:19:00+00 | 12400.00 |
| 0005432000988 | EVGENIYA ALEKSEEVA | 2017-07-05 17:19:00+00 | 12400.00 |
| 0005432000989 | ARTUR GERASIMOV | 2017-06-28 22:55:00+00 | 24700.00 |
航班及其飞机:用 ->> 从 JSONB 列读取英文名称。
SELECT f.flight_no, f.departure_airport, f.arrival_airport,
a.model ->> 'en' AS aircraft
FROM flights f
JOIN aircrafts_data a ON a.aircraft_code = f.aircraft_code
ORDER BY f.flight_id
LIMIT 3;
| flight_no | departure_airport | arrival_airport | aircraft |
|---|---|---|---|
| PG0405 | DME | LED | Airbus A321-200 |
| PG0404 | DME | LED | Airbus A321-200 |
| PG0405 | DME | LED | Airbus A321-200 |
票价和座位:从机票航段到航班和登机牌。LEFT JOIN 会保留没有登机牌的航段。
SELECT tf.ticket_no, f.flight_no, tf.fare_conditions, tf.amount, bp.seat_no
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
LEFT JOIN boarding_passes bp
ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
ORDER BY tf.ticket_no, f.flight_id
LIMIT 3;
| ticket_no | flight_no | fare_conditions | amount | seat_no |
|---|---|---|---|---|
| 0005432000987 | PG0242 | Economy | 6200.00 | 7A |
| 0005432000988 | PG0242 | Economy | 6200.00 | 10E |
| 0005432000989 | PG0242 | Economy | 6200.00 | 18E |
按主题分类的 SQL 练习
基于 Bookings 数据库共有 52 道练习,从简单查询到百万行级别的数据分析。答案会在真实的 PostgreSQL 上自动检查。 右侧数字是该主题的练习数量,彩色圆点表示难度范围。
从哪里开始
Bookings 数据库的前几道练习:
常见问题
使用 Bookings 需要安装 PostgreSQL 吗?
不需要。SQLtest.online 的练习和练习场都在我们的服务器上执行查询,有浏览器就够了。在练习场中,Bookings 可在 PostgreSQL 18 上使用。
在哪里下载 Bookings 演示数据库?
Postgres Professional 在其网站上发布了多种规模的版本,并附有模式说明。
为什么有些名称带有花括号?
机场、城市和飞机名称是包含英文和俄文值的 JSONB 对象。使用 ->> 'en' 获取英文文本,或者查询会自动选择语言的视图。