新月份,新目标。您的帮助使项目向前推进。 🖥️ 支持 sqltest →
SQL 代码已复制到剪贴板

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 的表以及它们之间的外键关系。点击可查看完整尺寸。

Bookings 数据库 ER 图

数据库包含什么

这些表分为两组。

参考数据

airports_data、aircrafts_data 和 seats:每种机型的座位图。

销售和航班

bookings → tickets → ticket_flights ← flights,以及值机时发放的 boarding_passes。

最需要记住的一点:一个预订可以包含多名乘客,一张机票可以包含多个航段。机票和航班通过 ticket_flights 关联,这是最大的一张表。视图 aircrafts、airports、flights_v 和 routes 以更易读的形式展示相同的数据。

各表的数据量:

表行数内容
bookings262,788预订
tickets366,733机票,每位乘客一张
ticket_flights1,045,726机票包含的航段
boarding_passes579,686登机牌
flights33,121计划和已执行的航班
airports_data104机场
aircrafts_data9机型
seats1,339各机型的座位

表结构

点击表名可查看它的列、示例行和键。

表列表

aircrafts_data - 飞机表。
  • aircraft_code每架飞机的唯一代码
  • model飞机型号名称,英文和俄文以JSON格式表示
  • range飞机飞行范围,单位为公里
  • 主键,btree (aircraft_code)
aircraft_codemodelrange
1773{"en": "Boeing 777-300", "ru": "Боинг 777-300"}11100
airports_data - 机场表。
  • airport_code每个机场的唯一代码
  • airport_name机场名称,英文和俄文以JSON格式表示
  • city机场所在城市,英文和俄文以JSON格式表示
  • coordinates机场坐标,格式为POINT(经度,纬度)
  • timezone机场时区名称
  • 主键,btree (airport_code)
airport_codeairport_namecitycoordinatestimezone
1YKS{"en": "Yakutsk Airport", "ru": "Якутск"}{"en": "Yakutsk", "ru": "Якутск"}(129.77099609375,62.0932998657227)Asia/Yakutsk
boarding_passes - 登机牌表。
  • 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_noflight_idboarding_noseat_no
100054352123513062512D
bookings - 预订表。
  • book_ref预订号码
  • book_date预订日期
  • total_amount总预订费用
  • 主键,btree (book_ref)
book_refbook_datetotal_amount
100000F2017-07-05 00:12:00+00265700.00
flights - 航班表。
  • 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
11185PG01342017-09-10 06:50:00+002017-09-10 11:55:00+00DMEBTK计划中319
seats - 飞机座位表。
  • aircraft_code飞机代码,IATA
  • seat_no座位号码
  • fare_conditions旅行舱位
  • 主键,btree (aircraft_code, seat_no)
  • 外键 (aircraft_code) 参考 aircrafts(aircraft_code) ON DELETE CASCADE
aircraft_codeseat_nofare_conditions
13192A商务舱
ticket_flights - 票与航班的关系。
  • 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
1000543215977630625商务舱42100.00
tickets - 票表。
  • ticket_no票号
  • book_ref预订号码
  • passenger_id乘客ID
  • passenger_name乘客姓名
  • contact_data乘客联系信息
ticket_no book_ref passenger_id passenger_name contact_data
1000543200098706B0468149 604011VALERIY 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_nopassenger_namebook_datetotal_amount
0005432000987VALERIY TIKHONOV2017-07-05 17:19:00+0012400.00
0005432000988EVGENIYA ALEKSEEVA2017-07-05 17:19:00+0012400.00
0005432000989ARTUR GERASIMOV2017-06-28 22:55:00+0024700.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_nodeparture_airportarrival_airportaircraft
PG0405DMELEDAirbus A321-200
PG0404DMELEDAirbus A321-200
PG0405DMELEDAirbus 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_noflight_nofare_conditionsamountseat_no
0005432000987PG0242Economy6200.007A
0005432000988PG0242Economy6200.0010E
0005432000989PG0242Economy6200.0018E

按主题分类的 SQL 练习

基于 Bookings 数据库共有 52 道练习,从简单查询到百万行级别的数据分析。答案会在真实的 PostgreSQL 上自动检查。 右侧数字是该主题的练习数量,彩色圆点表示难度范围。

从哪里开始

Bookings 数据库的前几道练习:

  1. 获取机场数据
  2. 机场列表
  3. 远程飞机
  4. 查找波音飞机
  5. 从多莫杰多沃出发的航班
  6. 列出来自多莫杰多沃的飞机
  7. 按日期获取预订
  8. 飞机使用分析
  9. 票价条件类型
  10. 缺少商务舱座位的飞机

全部 Bookings 练习 →

常见问题

使用 Bookings 需要安装 PostgreSQL 吗?

不需要。SQLtest.online 的练习和练习场都在我们的服务器上执行查询,有浏览器就够了。在练习场中,Bookings 可在 PostgreSQL 18 上使用。

在哪里下载 Bookings 演示数据库?

Postgres Professional 在其网站上发布了多种规模的版本,并附有模式说明。

为什么有些名称带有花括号?

机场、城市和飞机名称是包含英文和俄文值的 JSONB 对象。使用 ->> 'en' 获取英文文本,或者查询会自动选择语言的视图。