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 的表可以分为三组。
影片目录
film、actor、category、language,以及关联表 film_actor、film_category。
门店和人员
store、staff、customer 和地址:address → city → country。
租赁和付款
inventory 是各门店的实体光盘,rental 是租赁记录,payment 是付款记录。
最需要记住的一点:顾客租的是光盘,而不是影片。因此 rental 不是直接关联 film,而是通过 inventory 关联。 film_text 表是标题和描述的辅助副本,用于全文搜索。
主要表中的数据量:
| 表 | 行数 | 内容 |
|---|---|---|
| rental | 16,044 | 光盘租赁 |
| payment | 16,049 | 顾客付款 |
| film_actor | 5,462 | 演员在影片中的角色 |
| inventory | 4,581 | 门店中的光盘 |
| film | 1,000 | 影片 |
| customer | 599 | 顾客 |
| city | 600 | 城市 |
| actor | 200 | 演员 |
| country | 109 | 国家 |
| category | 16 | 类型 |
| store | 2 | 门店 |
表结构
点击表名可查看它的列、示例行和键。
表列表
- 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_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_id唯一记录标识符 (PK)
- name类别名称
- last_update最后更新时间
| category_id | name | last_update |
|---|---|---|
| 1 | 动作 | 2023-01-01 12:00:00 |
- 主键,btree (category_id)
- 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_id唯一记录标识符 (PK)
- country国家名称
- last_update最后更新时间
| country_id | country | last_update |
|---|---|---|
| 1 | 美国 | 2023-01-01 12:00:00 |
- 主键,btree (country_id)
- 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 | 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_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)
- 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;
| title | language | rental_rate | length |
|---|---|---|---|
| ACADEMY DINOSAUR | English | 0.99 | 86 |
| ACE GOLDFINGER | English | 4.99 | 48 |
| ADAPTATION HOLES | English | 2.99 | 50 |
顾客住在哪里:四张表组成的链条。
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_name | last_name | city | country |
|---|---|---|---|
| MARY | SMITH | Sasebo | Japan |
| PATRICIA | JOHNSON | San Bernardino | United States |
| LINDA | WILLIAMS | Athenai | Greece |
租了哪部影片、付了多少钱:从租赁记录经由 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_date | title | amount |
|---|---|---|
| 2005-05-24 22:53:30 | BLANKET BEVERLY | 2.99 |
| 2005-05-24 22:54:33 | FREAKY POCUS | 2.99 |
| 2005-05-24 23:03:39 | GRADUATE LORD | 3.99 |
按主题分类的 SQL 练习
基于 Sakila 数据库共有 179 道练习,从简单的 SELECT 查询到使用窗口函数的数据分析。答案会在真实的 MySQL 上自动检查。 右侧数字是该主题的练习数量,彩色圆点表示难度范围。
- SQL基础 39
- 计算 15
- 聚合函数 27
- 子查询 8
- 公共表表达式 (CTE) 5
- 窗口函数 9
- 分析查询 33
- 数据操作查询 (DML) 12
- 数据定义语言 (DDL) 4
从哪里开始
"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、分组、子查询和窗口函数,这些都是技术面试中最常考的内容。