MySQL 官方网站提供了以下几个示例数据库:Sakila
、Employees
、world
、world_x
、menagerie
这些数据库既可以用于日常学习和测试,也可以作为我们设计时数据库的一个参考。本文就来介绍一下这些数据库的模式结构以及如何下载和安装。
Sakila 数据库
Sakila 是一个在线 DVD 出租商店数据库,为各种 MySQL 文档、书籍、教程、文章、示例等提供了一个标准数据库模式;同时,它还可以用于演示 MySQL 的其他功能特性,例如视图、存储过程和触发器。Sakila 数据库的模式结构如下图所示:
数据表有以下这些
表名 | 描述 |
---|---|
actor(演员信息表) | 通过 film_actor 表和 film 表进行关联。 |
film(电影信息表) | film 引用了 language 表,同时被 film_category、film_actor 以及 inventory 表引用 |
film_actor(电影演员表) | film 表和 actor 表之间的多对多关系 |
film_category(电影分类表) | film 表和 category 表之间的多对多关系 |
category(分类表) | 通过 film_category 表和 film 表进行关联 |
inventory(电影库存表) | 每部电影在不同商店里的库存,被 rental 表引用 |
film_text(电影描述表) | 包含了 film 表中的 film_id、title 以及 description 三个字段,通过 film 表上的触发器进行数据同步 |
language(语言信息表) | language 表被 film 表引用 |
address(地址信息表) | 其中主键字段 address_id 是 customer、staff 以及 store 表上的外键引用字段,同时引用了 city 表 |
city(城市信息表) | 引用了 country 表,同时被 address 表引用 |
country(国家信息表) | country 表被 city 表引用 |
customer(客戶信息表) | 引用了 address 和 store 表,同时被 payment 和 rental 表引用 |
payment(付款信息表) | 引用了 customer、staff 以及 rental 表 |
rental(租赁信息表) | 每个 DVD 每次被租赁的信息。引用了 inventory、customer 以及 staff 表,同时被 payment 表引用 |
staff(员工表) | 引用了 store 和 address 表,同时被 rental、payment 以及 store 表引用 |
store(商品信息表) | 引用了 staff 和 address 表,同时被 staff、customer 以及 inventory 表引用 |
Sakila 数据库提供了以下视图
表名 | 描述 |
---|---|
actor_info | 包含了所有的演员,以及他们演出过的电影 |
customer_list | 客户和地址信息列表 |
film_list | 电影信息和参与的演员 |
nicer_but_slower_film_list | 电影信息和参与的演员,演员的姓名调整为首字母大写 |
sales_by_film_category | 按照不同电影分类统计的销售金额,同一个电影可能被分为多个类别 |
sales_by_store | 按照商店统计的销售金额 |
staff_list | 员工列表,包括地址和所属的商店 |
Sakila 数据库提供了以下存储过程和函数
表名 | 描述 |
---|---|
film_in_stock | 存储过程,获取指定电影在指定商店内未出租的 DVD |
film_not_in_stock | 存储过程,获取指定电影在指定商店内已出租未归还的 DVD |
rewards_report | 存储过程,获取上个月的最佳客户列表 |
get_customer_balance | 存储函数,返回指定客户在某个日期之前的欠款 |
inventory_held_by_customer | 存储函数,返回正在租赁某个 DVD 的客户。 |
inventory_in_stock | 存储函数,返回某个 DVD 是否可出租。TRUE 表示可以出租,FALSE 表示已出租未归还 |
Sakila 数据库包含了以下触发器
表名 | 描述 |
---|---|
customer_create_date | 插入数据时将 customer 表的 create_date 字段设置为当前日期和时间。 |
payment_date | 插入数据时将 payment 表的 payment_date 字段设置为当前日期和时间 |
rental_date | 插入数据时将 rental 表的 rental_date 字段设置为当前日期和时间 |
ins_film | 将 film 表上插入的相关数据复制一份到 film_text 表 |
upd_film | 将 film 表上更新的相关数据同步到 film_text 表 |
del_film | 删除 film 表数据时同步删除 film_text 表上的相关数据 |
Sakila 数据库的创建脚本可以点击此处下载,然后运行以下命令创建数据库并初始化数据:
mysql -u root -p sakila < sakila-schema.sql
mysql -u root -p sakila < sakila-data.sql
创建成功之后,可以执行以下语句进行验证:
mysql> USE sakila;
Database changed
mysql> SHOW FULL TABLES;
+----------------------------+------------+
| Tables_in_sakila | Table_type |
+----------------------------+------------+
| actor | BASE TABLE |
| actor_info | VIEW |
| address | BASE TABLE |
| category | BASE TABLE |
| city | BASE TABLE |
| country | BASE TABLE |
| customer | BASE TABLE |
| customer_list | VIEW |
| film | BASE TABLE |
| film_actor | BASE TABLE |
| film_category | BASE TABLE |
| film_list | VIEW |
| film_text | BASE TABLE |
| inventory | BASE TABLE |
| language | BASE TABLE |
| nicer_but_slower_film_list | VIEW |
| payment | BASE TABLE |
| rental | BASE TABLE |
| sales_by_film_category | VIEW |
| sales_by_store | VIEW |
| staff | BASE TABLE |
| staff_list | VIEW |
| store | BASE TABLE |
+----------------------------+------------+
23 rows in set (0.01 sec)
mysql> SELECT COUNT(*) FROM film;
+----------+
| COUNT(*) |
+----------+
| 1000 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT COUNT(*) FROM film_text;
+----------+
| COUNT(*) |
+----------+
| 1000 |
+----------+
1 row in set (0.00 sec)
Employees 数据库
Employees 示例数据库包含了 6 个表(dept_emp、dept_manager、titles、salaries、employees 以及 departments),大约 400 万条数据(需要约 160 MB 磁盘空间)。Employees 数据库的模式结构如下图所示:
Employees 数据库支持分区表。另外,它还提供了一个数据测试的脚本,可以用于验证初始数据的完整性。
Employees 数据库的初始化脚本可以点此下载,然后运行以下命令进行解压缩:
unzip test_db-master.zip
cd test_db-master/
然后执行以下命令创建数据库并加载数据:
mysql -u root -p Employees < employees.sql
#如果想要使用分区表,可以执行 employees_partitioned.sql 文件。
Employees 数据库提供了 md5 和 sha 两种验证数据的方法:
shell>time mysql -t < test_employees_sha.sql
+----------------------+
| INFO |
+----------------------+
| TESTING INSTALLATION |
+----------------------+
+--------------+------------------+------------------------------------------+
| table_name | expected_records | expected_crc |
+--------------+------------------+------------------------------------------+
| employees | 300024 | 4d4aa689914d8fd41db7e45c2168e7dcb9697359 |
| departments | 9 | 4b315afa0e35ca6649df897b958345bcb3d2b764 |
| dept_manager | 24 | 9687a7d6f93ca8847388a42a6d8d93982a841c6c |
| dept_emp | 331603 | f16f6ce609d032d6b1b34748421e9195c5083da8 |
| titles | 443308 | d12d5f746b88f07e69b9e36675b6067abb01b60e |
| salaries | 2844047 | b5a1785c27d75e33a4173aaa22ccf41ebd7d4a9f |
+--------------+------------------+------------------------------------------+
+--------------+------------------+------------------------------------------+
| table_name | found_records | found_crc |
+--------------+------------------+------------------------------------------+
| employees | 300024 | 4d4aa689914d8fd41db7e45c2168e7dcb9697359 |
| departments | 9 | 4b315afa0e35ca6649df897b958345bcb3d2b764 |
| dept_manager | 24 | 9687a7d6f93ca8847388a42a6d8d93982a841c6c |
| dept_emp | 331603 | f16f6ce609d032d6b1b34748421e9195c5083da8 |
| titles | 443308 | d12d5f746b88f07e69b9e36675b6067abb01b60e |
| salaries | 2844047 | b5a1785c27d75e33a4173aaa22ccf41ebd7d4a9f |
+--------------+------------------+------------------------------------------+
+--------------+---------------+-----------+
| table_name | records_match | crc_match |
+--------------+---------------+-----------+
| employees | OK | ok |
| departments | OK | ok |
| dept_manager | OK | ok |
| dept_emp | OK | ok |
| titles | OK | ok |
| salaries | OK | ok |
+--------------+---------------+-----------+
real 0m37.067s
user 0m0.007s
sys 0m0.009s
shell>time mysql -t < test_employees_md5.sql
+----------------------+
| INFO |
+----------------------+
| TESTING INSTALLATION |
+----------------------+
+--------------+------------------+----------------------------------+
| table_name | expected_records | expected_crc |
+--------------+------------------+----------------------------------+
| employees | 300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 |
| departments | 9 | d1af5e170d2d1591d776d5638d71fc5f |
| dept_manager | 24 | 8720e2f0853ac9096b689c14664f847e |
| dept_emp | 331603 | c2c4fc7f0506e50959a6c67ad55cac31 |
| titles | 443308 | bfa016c472df68e70a03facafa1bc0a8 |
| salaries | 2844047 | fd220654e95aea1b169624ffe3fca934 |
+--------------+------------------+----------------------------------+
+--------------+------------------+----------------------------------+
| table_name | found_records | found_crc |
+--------------+------------------+----------------------------------+
| employees | 300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 |
| departments | 9 | d1af5e170d2d1591d776d5638d71fc5f |
| dept_manager | 24 | 8720e2f0853ac9096b689c14664f847e |
| dept_emp | 331603 | c2c4fc7f0506e50959a6c67ad55cac31 |
| titles | 443308 | bfa016c472df68e70a03facafa1bc0a8 |
| salaries | 2844047 | fd220654e95aea1b169624ffe3fca934 |
+--------------+------------------+----------------------------------+
+--------------+---------------+-----------+
| table_name | records_match | crc_match |
+--------------+---------------+-----------+
| employees | OK | ok |
| departments | OK | ok |
| dept_manager | OK | ok |
| dept_emp | OK | ok |
| titles | OK | ok |
| salaries | OK | ok |
+--------------+---------------+-----------+
real 0m33.453s
user 0m0.007s
sys 0m0.009s