学习 MySQL 必备的几个示例数据库

 

 

大家好!我是只谈技术不剪发的 Tony 老师。今天给大家介绍几个我在 MySQL 学习过程中常用的几个示例数据库。

MySQL 官方网站提供了以下几个示例数据库:Sakila、Employees、world、world_x 以及 menagerie。这些数据库既可以用于日常学习和测试,也可以作为我们设计时数据库的一个参考。本文就来介绍一下这些数据库的模式结构以及如何下载和安装。

Sakila 数据库

Sakila 是一个在线 DVD 出租商店数据库,为各种 MySQL 文档、书籍、教程、文章、示例等提供了一个标准数据库模式;同时,它还可以用于演示 MySQL 的其他功能特性,例如视图、存储过程和触发器。Sakila 数据库的模式结构如下图所示:

学习 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 数据库的创建脚本可以点此下载,然后运行以下命令创建数据库并初始化数据:

1 shell> mysql -t <  sakila-schema.sql;
2 
3 shell> mysql -t <  sakila-data.sql;

 

创建成功之后,可以执行以下语句进行验证:

 1 mysql> USE sakila;
 2 Database changed
 3 
 4 mysql> SHOW FULL TABLES;
 5 +----------------------------+------------+
 6 | Tables_in_sakila           | Table_type |
 7 +----------------------------+------------+
 8 | actor                      | BASE TABLE |
 9 | actor_info                 | VIEW       |
10 | address                    | BASE TABLE |
11 | category                   | BASE TABLE |
12 | city                       | BASE TABLE |
13 | country                    | BASE TABLE |
14 | customer                   | BASE TABLE |
15 | customer_list              | VIEW       |
16 | film                       | BASE TABLE |
17 | film_actor                 | BASE TABLE |
18 | film_category              | BASE TABLE |
19 | film_list                  | VIEW       |
20 | film_text                  | BASE TABLE |
21 | inventory                  | BASE TABLE |
22 | language                   | BASE TABLE |
23 | nicer_but_slower_film_list | VIEW       |
24 | payment                    | BASE TABLE |
25 | rental                     | BASE TABLE |
26 | sales_by_film_category     | VIEW       |
27 | sales_by_store             | VIEW       |
28 | staff                      | BASE TABLE |
29 | staff_list                 | VIEW       |
30 | store                      | BASE TABLE |
31 +----------------------------+------------+
32 23 rows in set (0.01 sec)
33 
34 mysql> SELECT COUNT(*) FROM film;
35 +----------+
36 | COUNT(*) |
37 +----------+
38 |     1000 |
39 +----------+
40 1 row in set (0.00 sec)
41 
42 mysql> SELECT COUNT(*) FROM film_text;
43 +----------+
44 | COUNT(*) |
45 +----------+
46 |     1000 |
47 +----------+
48 1 row in set (0.00 sec)

 

关于 Sakila 数据库的详细介绍和使用可以查看官方文档

Employees 数据库

Employees 示例数据库包含了 6 个表(dept_emp、dept_manager、titles、salaries、employees 以及 departments),大约 400 万条数据(需要约 160 MB 磁盘空间)。Employees 数据库的模式结构如下图所示:

学习 MySQL 必备的几个示例数据库

Employees 数据库支持分区表。另外,它还提供了一个数据测试的脚本,可以用于验证初始数据的完整性。

Employees 数据库的初始化脚本可以点此下载,然后运行以下命令进行解压缩:

1 shell> unzip test_db-master.zip
2 shell> cd test_db-master/

 

Employees 数据库默认使用 InnoDB 存储引擎,如果需要使用其他引擎,可以修改 employees.sql 文件中的以下内容:

1 /*!50503 set default_storage_engine = InnoDB */;

 

然后执行以下命令创建数据库并加载数据:

1 shell> mysql -t < employees.sql

??如果想要使用分区表,可以执行 employees_partitioned.sql 文件。

Employees 数据库提供了 md5 和 sha 两种验证数据的方法:

 1 shell>time mysql -t < test_employees_sha.sql
 2 +----------------------+
 3 | INFO                 |
 4 +----------------------+
 5 | TESTING INSTALLATION |
 6 +----------------------+
 7 +--------------+------------------+------------------------------------------+
 8 | table_name   | expected_records | expected_crc                             |
 9 +--------------+------------------+------------------------------------------+
10 | employees    |           300024 | 4d4aa689914d8fd41db7e45c2168e7dcb9697359 |
11 | departments  |                9 | 4b315afa0e35ca6649df897b958345bcb3d2b764 |
12 | dept_manager |               24 | 9687a7d6f93ca8847388a42a6d8d93982a841c6c |
13 | dept_emp     |           331603 | f16f6ce609d032d6b1b34748421e9195c5083da8 |
14 | titles       |           443308 | d12d5f746b88f07e69b9e36675b6067abb01b60e |
15 | salaries     |          2844047 | b5a1785c27d75e33a4173aaa22ccf41ebd7d4a9f |
16 +--------------+------------------+------------------------------------------+
17 +--------------+------------------+------------------------------------------+
18 | table_name   | found_records    | found_crc                                |
19 +--------------+------------------+------------------------------------------+
20 | employees    |           300024 | 4d4aa689914d8fd41db7e45c2168e7dcb9697359 |
21 | departments  |                9 | 4b315afa0e35ca6649df897b958345bcb3d2b764 |
22 | dept_manager |               24 | 9687a7d6f93ca8847388a42a6d8d93982a841c6c |
23 | dept_emp     |           331603 | f16f6ce609d032d6b1b34748421e9195c5083da8 |
24 | titles       |           443308 | d12d5f746b88f07e69b9e36675b6067abb01b60e |
25 | salaries     |          2844047 | b5a1785c27d75e33a4173aaa22ccf41ebd7d4a9f |
26 +--------------+------------------+------------------------------------------+
27 +--------------+---------------+-----------+
28 | table_name   | records_match | crc_match |
29 +--------------+---------------+-----------+
30 | employees    | OK            | ok        |
31 | departments  | OK            | ok        |
32 | dept_manager | OK            | ok        |
33 | dept_emp     | OK            | ok        |
34 | titles       | OK            | ok        |
35 | salaries     | OK            | ok        |
36 +--------------+---------------+-----------+
37 
38 real 0m37.067s
39 user 0m0.007s
40 sys 0m0.009s
41 
42 shell>time mysql -t < test_employees_md5.sql
43 +----------------------+
44 | INFO                 |
45 +----------------------+
46 | TESTING INSTALLATION |
47 +----------------------+
48 +--------------+------------------+----------------------------------+
49 | table_name   | expected_records | expected_crc                     |
50 +--------------+------------------+----------------------------------+
51 | employees    |           300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 |
52 | departments  |                9 | d1af5e170d2d1591d776d5638d71fc5f |
53 | dept_manager |               24 | 8720e2f0853ac9096b689c14664f847e |
54 | dept_emp     |           331603 | c2c4fc7f0506e50959a6c67ad55cac31 |
55 | titles       |           443308 | bfa016c472df68e70a03facafa1bc0a8 |
56 | salaries     |          2844047 | fd220654e95aea1b169624ffe3fca934 |
57 +--------------+------------------+----------------------------------+
58 +--------------+------------------+----------------------------------+
59 | table_name   | found_records    | found_crc                        |
60 +--------------+------------------+----------------------------------+
61 | employees    |           300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 |
62 | departments  |                9 | d1af5e170d2d1591d776d5638d71fc5f |
63 | dept_manager |               24 | 8720e2f0853ac9096b689c14664f847e |
64 | dept_emp     |           331603 | c2c4fc7f0506e50959a6c67ad55cac31 |
65 | titles       |           443308 | bfa016c472df68e70a03facafa1bc0a8 |
66 | salaries     |          2844047 | fd220654e95aea1b169624ffe3fca934 |
67 +--------------+------------------+----------------------------------+
68 +--------------+---------------+-----------+
69 | table_name   | records_match | crc_match |
70 +--------------+---------------+-----------+
71 | employees    | OK            | ok        |
72 | departments  | OK            | ok        |
73 | dept_manager | OK            | ok        |
74 | dept_emp     | OK            | ok        |
75 | titles       | OK            | ok        |
76 | salaries     | OK            | ok        |
77 +--------------+---------------+-----------+
78 
79 real 0m33.453s
80 user 0m0.007s
81 sys 0m0.009s

 

world 数据库

world 数据库包含了 country、countrylanguage 以及 city 表。

学习 MySQL 必备的几个示例数据库
world 是一个小型的简单数据库,主要用于基础查询测试。

world 数据库的初始化脚本可以点此下载,然后执行以下命令进行安装:

1 shell> unzip world.sql.zip
2 shell> mysql -t < world.sql

 

执行以下命令验证数据库的安装:

 1 mysql> USE world;
 2 Database changed
 3 
 4 mysql> SHOW TABLES;
 5 +-----------------+
 6 | Tables_in_world |
 7 +-----------------+
 8 | city            |
 9 | country         |
10 | countrylanguage |
11 +-----------------+
12 3 rows in set (0.00 sec)
13 
14 mysql> SELECT COUNT(*) FROM city;
15 +----------+
16 | COUNT(*) |
17 +----------+
18 | 4079     |
19 +----------+
20 1 row in set (0.02 sec)
21 
22 mysql> SELECT COUNT(*) FROM country;
23 +----------+
24 | COUNT(*) |
25 +----------+
26 | 239      |
27 +----------+
28 1 row in set (0.00 sec)

 

world_x 数据库

world_x 是一个基于 world 修改后的数据库,主要用于测试 MySQL 5.7 之后提供的文档存储功能和 X DevAPI。

学习 MySQL 必备的几个示例数据库
world_x 数据库的初始化脚本可以点此下载,然后执行以下命令进行安装:

1 shell> unzip world_x-db.zip
2 shell> cd world_x-db
3 shell> mysql -t < world_x.sql

 

执行以下命令验证数据库的安装:

mysql> USE world_x;
Database changed

mysql> SHOW TABLES;
+-------------------+
| Tables_in_world_x |
+-------------------+
| city              |
| country           |
| countryinfo       |
| countrylanguage   |
+-------------------+
4 rows in set (0.00 sec)

mysql> SELECT COUNT(*) FROM city;
+----------+
| COUNT(*) |
+----------+
|     4079 |
+----------+
1 row in set (0.02 sec)

mysql> SELECT COUNT(*) FROM country;
+----------+
| COUNT(*) |
+----------+
|      239 |
+----------+
1 row in set (0.00 sec)

 

menagerie 数据库

menagerie 数据库是一个小型的动物数据库,包含 pet 和 event 表。

学习 MySQL 必备的几个示例数据库
menagerie 数据库的初始化脚本可以点此下载,然后执行以下命令进行解压缩:

1 shell> unzip menagerie-db.zip
2 shell> cd menagerie-db

 

创建一个新的数据库:

1 mysql> CREATE DATABASE menagerie;
2 mysql> USE menagerie;

 

创建 pet 表并加载数据:

mysql> SOURCE cr_pet_tbl.sql;
mysql> LOAD DATA LOCAL INFILE ‘pet.txt‘ INTO TABLE pet;
mysql> SOURCE ins_puff_rec.sql;

 

创建 event 表并加载数据:

1 mysql> SOURCE cr_event_tbl.sql;
2 mysql> LOAD DATA LOCAL INFILE ‘event.txt‘ INTO TABLE event;

 

总结

Sakila 是一个相对复杂和完整的示例数据库,可以用于测试 MySQL 中的各种功能;Employees 是一个经典的员工管理数据库;world 是一个小型的数据库,world_x 是一个文档数据库;menagerie 是一个简单的数据库。这些示例数据库可以满足我们不同的学习和测试需求,也为数据库设计提供了一定的参考价值。

你在学习和工作中还使用或参考过哪些经典的 MySQL 示例数据库?欢迎关注??、评论??、点赞??!

 

学习 MySQL 必备的几个示例数据库

上一篇:[mysql] left join 和 join 和right join的区别


下一篇:Winforms学习笔记——DataGridView