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

Sakila 数据库:模式、表和 SQL 练习

Sakila 是 MySQL 官方的示例数据库,描述了一家 DVD 影片租赁连锁店的业务。 在 SQLtest.online 上,你可以直接在浏览器中使用它:做自动判题的练习,或在练习场中运行自己的查询,无需安装任何软件。

  • 16 张表和 7 个视图
  • 1,000 部影片
  • 16,044 条租赁记录
  • 179 道 SQL 练习

什么是 Sakila

Sakila 由 MySQL 文档团队的 Mike Hillyer 创建,目的是让文档和书籍中的示例使用同一个贴近实际的模式。 它的名字来自 MySQL 标志上的海豚 Sakila,并以 BSD 许可证发布。

这个数据库模拟了一个常见的业务:包含演员和类型的影片目录、两家门店的顾客和员工、光盘租赁和付款。 因此它非常适合学习:表之间的关系一看就懂,数据量也足够练习分组、窗口函数和数据分析。

ER 图

该图展示了 Sakila 的表以及它们之间的外键关系。点击可查看完整尺寸。

Sakila 数据库 ER 图

数据库包含什么

Sakila 的表可以分为三组。

影片目录

film、actor、category、language,以及关联表 film_actor、film_category。

门店和人员

store、staff、customer 和地址:address → city → country。

租赁和付款

inventory 是各门店的实体光盘,rental 是租赁记录,payment 是付款记录。

最需要记住的一点:顾客租的是光盘,而不是影片。因此 rental 不是直接关联 film,而是通过 inventory 关联。 film_text 表是标题和描述的辅助副本,用于全文搜索。

主要表中的数据量:

表行数内容
rental16,044光盘租赁
payment16,049顾客付款
film_actor5,462演员在影片中的角色
inventory4,581门店中的光盘
film1,000影片
customer599顾客
city600城市
actor200演员
country109国家
category16类型
store2门店

表结构

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

表列表

actor - 演员表。
  • actor_id唯一记录标识符 (PK)
  • first_name演员的名字
  • last_name演员的姓氏
  • last_update最后更新时间
actor_id first_name last_name last_update
1 John Doe 2023-01-01 12:00:00
  • 主键,btree (actor_id)
address - 客户和员工地址。
  • address_id唯一记录标识符 (PK)
  • address邮政地址
  • address2附加地址
  • district地区或区域
  • city_id城市标识符 (FK)
  • postal_code邮政编码
  • phone电话号码
  • last_update最后更新时间
address_id address address2 district city_id postal_code phone last_update
1 123 Main St [null] 市中心 1 12345 +1234567890 2023-01-01 12:00:00
  • 主键,btree (address_id)
  • 外键 (city_id) 参考 city(city_id)
category - 电影类别。
  • category_id唯一记录标识符 (PK)
  • name类别名称
  • last_update最后更新时间
category_id name last_update
1 动作 2023-01-01 12:00:00
  • 主键,btree (category_id)
city - 城市表。
  • city_id唯一记录标识符 (PK)
  • city城市名称
  • country_id国家标识符 (FK)
  • last_update最后更新时间
city_id city country_id last_update
1 大都会 1 2023-01-01 12:00:00
  • 主键,btree (city_id)
  • 外键 (country_id) 参考 country(country_id)
country - 国家表。
  • country_id唯一记录标识符 (PK)
  • country国家名称
  • last_update最后更新时间
country_id country last_update
1 美国 2023-01-01 12:00:00
  • 主键,btree (country_id)
customer - 客户表。
  • customer_id唯一记录标识符 (PK)
  • store_id商店标识符 (FK)
  • first_name客户的名字
  • last_name客户的姓氏
  • email客户的电子邮件地址
  • address_id地址标识符 (FK)
  • active客户活动指示器 (0/1)
  • create_date客户添加到数据库的日期和时间
  • last_update最后更新时间
customer_id store_id first_name last_name email address_id active create_date last_update
1 1 John Doe john.doe@example.com 1 1 2023-01-01 12:00:00 2023-01-01 12:00:00
  • 主键,btree (customer_id)
  • 外键 (store_id) 参考 store(store_id)
  • 外键 (address_id) 参考 address(address_id)
film - 电影表。
  • film_id唯一记录标识符 (PK)
  • title电影标题
  • description电影的简要描述或情节
  • release_year电影发行年份
  • language_id电影语言的标识符 (FK)
  • original_language_id原始语言的标识符,以防它被配音成新语言
  • rental_duration租赁期的天数
  • rental_rate租赁电影的费用,持续时间在 rental_duration 列中指定
  • length电影长度(分钟)
  • replacement_cost丢失或损坏光盘的罚款金额
  • rating分配给电影的评级。可以是:G、PG、PG-13、R 或 NC-17
  • special_featuresDVD 上包含的特殊功能列表。可以是零个或多个:预告片、评论、删减片段、幕后花絮
  • last_update最后更新时间
film_id title description release_year language_id original_language_id rental_duration rental_rate length replacement_cost rating special_features last_update
1 电影标题 电影的简要描述。 2000 1 2 5 4.99 120 19.99 PG-13 预告片、评论 2023-01-01 12:00:00
  • 主键,btree (film_id)
  • 外键 (language_id) 参考 language(language_id)
  • 外键 (original_language_id) 参考 language(language_id)
film_actor - 演员与电影的关系。
  • actor_id演员的标识符 (FK)
  • film_id电影的标识符 (FK)
  • last_update最后更新时间
actor_id film_id last_update
1 1 2023-01-01 12:00:00
  • 主键,btree (actor_id, film_id)
  • 外键 (actor_id) 参考 actor(actor_id)
  • 外键 (film_id) 参考 film(film

示例查询

这些查询展示了表之间是如何关联的。复制任意一条,在练习场中运行即可。

影片及其语言:简单的多对一关系。

SELECT f.title, l.name AS language, f.rental_rate, f.length
FROM film f
JOIN language l ON l.language_id = f.language_id
ORDER BY f.film_id
LIMIT 3;
titlelanguagerental_ratelength
ACADEMY DINOSAUREnglish0.9986
ACE GOLDFINGEREnglish4.9948
ADAPTATION HOLESEnglish2.9950

顾客住在哪里:四张表组成的链条。

SELECT c.first_name, c.last_name, ci.city, co.country
FROM customer c
JOIN address a ON a.address_id = c.address_id
JOIN city ci ON ci.city_id = a.city_id
JOIN country co ON co.country_id = ci.country_id
ORDER BY c.customer_id
LIMIT 3;
first_namelast_namecitycountry
MARYSMITHSaseboJapan
PATRICIAJOHNSONSan BernardinoUnited States
LINDAWILLIAMSAthenaiGreece

租了哪部影片、付了多少钱:从租赁记录经由 inventory 找到影片。

SELECT r.rental_date, f.title, p.amount
FROM rental r
JOIN inventory i ON i.inventory_id = r.inventory_id
JOIN film f ON f.film_id = i.film_id
JOIN payment p ON p.rental_id = r.rental_id
ORDER BY r.rental_id
LIMIT 3;
rental_datetitleamount
2005-05-24 22:53:30BLANKET BEVERLY2.99
2005-05-24 22:54:33FREAKY POCUS2.99
2005-05-24 23:03:39GRADUATE LORD3.99

按主题分类的 SQL 练习

基于 Sakila 数据库共有 179 道练习,从简单的 SELECT 查询到使用窗口函数的数据分析。答案会在真实的 MySQL 上自动检查。 右侧数字是该主题的练习数量,彩色圆点表示难度范围。

从哪里开始

"Sakila 数据库"部分的前几道练习:

  1. 获取演员
  2. 检索演员姓名
  3. 有序电影标题
  4. 按标题排序的前10部电影
  5. 电影列表 - 第三页
  6. 按多个字段排序电影
  7. 最长的电影
  8. 识别长电影
  9. 查找长喜剧
  10. 经典电影

全部 Sakila 练习 →

常见问题

使用 Sakila 需要安装 MySQL 吗?

不需要。SQLtest.online 的练习和练习场都在我们的服务器上执行查询,有浏览器就够了。在练习场中,Sakila 可在 MySQL 8.0、MySQL 9.7 和 MariaDB 10 上使用。

在哪里下载 Sakila 数据库?

官方的 sakila-schema.sql 和 sakila-data.sql 文件位于 MySQL 示例数据库页面,Sakila 文档中有详细说明。

有适用于 PostgreSQL 的 Sakila 吗?

有,它的移植版本叫 Pagila。结构相同,只是部分类型和函数换成了 PostgreSQL 中的对应写法。

可以修改 Sakila 中的数据吗?

在练习场中数据库是只读的,以保证所有人看到相同的数据。INSERT、UPDATE 和 DELETE 练习会在所需表的临时副本上执行,然后检查该副本的内容。

Sakila 适合用来准备 SQL 面试吗?

适合。用它可以方便地练习 JOIN、分组、子查询和窗口函数,这些都是技术面试中最常考的内容。