學習 MySQL 必備的幾個示例數據庫

大家好!我是隻談技術不剪髮的 Tony 老師。今天給大家介紹幾個我在 MySQL 學習過程中常用的幾個示例數據庫。

MySQL 官方網站提供了以下幾個示例數據庫:Sakila、Employees、world、world_x 以及 menagerie。這些數據庫既可以用於日常學習和測試,也可以作爲我們設計時數據庫的一個參考。本文就來介紹一下這些數據庫的模式結構以及如何下載和安裝。

Sakila 數據庫

Sakila 是一個在線 DVD 出租商店數據庫,爲各種 MySQL 文檔、書籍、教程、文章、示例等提供了一個標準數據庫模式;同時,它還可以用於演示 MySQL 的其他功能特性,例如視圖、存儲過程和觸發器。Sakila 數據庫的模式結構如下圖所示:

Sakila
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 數據庫的創建腳本可以點此下載,然後運行以下命令創建數據庫並初始化數據:

shell> mysql -t <  sakila-schema.sql;

shell> mysql -t <  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)

關於 Sakila 數據庫的詳細介紹和使用可以查看官方文檔

Employees 數據庫

Employees 示例數據庫包含了 6 個表(dept_emp、dept_manager、titles、salaries、employees 以及 departments),大約 400 萬條數據(需要約 160 MB 磁盤空間)。Employees 數據庫的模式結構如下圖所示:

Employees

Employees 數據庫支持分區表。另外,它還提供了一個數據測試的腳本,可以用於驗證初始數據的完整性。

Employees 數據庫的初始化腳本可以點此下載,然後運行以下命令進行解壓縮:

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

Employees 數據庫默認使用 InnoDB 存儲引擎,如果需要使用其他引擎,可以修改 employees.sql 文件中的以下內容:

/*!50503 set default_storage_engine = InnoDB */;

然後執行以下命令創建數據庫並加載數據:

shell> mysql -t < 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

world 數據庫

world 數據庫包含了 country、countrylanguage 以及 city 表。

world
world 是一個小型的簡單數據庫,主要用於基礎查詢測試。

world 數據庫的初始化腳本可以點此下載,然後執行以下命令進行安裝:

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

執行以下命令驗證數據庫的安裝:

mysql> USE world;
Database changed

mysql> SHOW TABLES;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 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)

world_x 數據庫

world_x 是一個基於 world 修改後的數據庫,主要用於測試 MySQL 5.7 之後提供的文檔存儲功能和 X DevAPI。

world_x
world_x 數據庫的初始化腳本可以點此下載,然後執行以下命令進行安裝:

shell> unzip world_x-db.zip
shell> cd world_x-db
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 表。

menagerie
menagerie 數據庫的初始化腳本可以點此下載,然後執行以下命令進行解壓縮:

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

創建一個新的數據庫:

mysql> CREATE DATABASE menagerie;
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 表並加載數據:

mysql> SOURCE cr_event_tbl.sql;
mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;

總結

Sakila 是一個相對複雜和完整的示例數據庫,可以用於測試 MySQL 中的各種功能;Employees 是一個經典的員工管理數據庫;world 是一個小型的數據庫,world_x 是一個文檔數據庫;menagerie 是一個簡單的數據庫。這些示例數據庫可以滿足我們不同的學習和測試需求,也爲數據庫設計提供了一定的參考價值。

你在學習和工作中還使用或參考過哪些經典的 MySQL 示例數據庫?歡迎關注❤️、評論📝、點贊👍!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章