學(xué)習(xí) MySQL 必備的幾個(gè)示例數(shù)據(jù)庫(kù)
作者: 不剪發(fā)的Tony老師
畢業(yè)于北京航空航天大學(xué),十多年數(shù)據(jù)庫(kù)管理與開(kāi)發(fā)經(jīng)驗(yàn),目前在一家全球性的金融公司從事數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)。CSDN學(xué)院簽約講師以及GitChat專欄作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net
文章目錄
Sakila 數(shù)據(jù)庫(kù)
Employees 數(shù)據(jù)庫(kù)
world 數(shù)據(jù)庫(kù)
world_x 數(shù)據(jù)庫(kù)
menagerie 數(shù)據(jù)庫(kù)
總結(jié)
大家好!我是只談技術(shù)不剪發(fā)的 Tony 老師。今天給大家介紹幾個(gè)我在 MySQL 學(xué)習(xí)過(guò)程中常用的幾個(gè)示例數(shù)據(jù)庫(kù)。
MySQL 官方網(wǎng)站提供了以下幾個(gè)示例數(shù)據(jù)庫(kù):Sakila、Employees、world、world_x 以及
menagerie。這些數(shù)據(jù)庫(kù)既可以用于日常學(xué)習(xí)和測(cè)試,也可以作為我們?cè)O(shè)計(jì)時(shí)數(shù)據(jù)庫(kù)的一個(gè)參考。本文就來(lái)介紹一下這些數(shù)據(jù)庫(kù)的模式結(jié)構(gòu)以及如何下載和安裝。
Sakila 數(shù)據(jù)庫(kù)
Sakila 是一個(gè)在線 DVD 出租商店數(shù)據(jù)庫(kù),為各種 MySQL 文檔、書籍、教程、文章、示例等提供了一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)模式;同時(shí),它還可以用于演示 MySQL 的其他功能特性,例如視圖、存儲(chǔ)過(guò)程和觸發(fā)器。Sakila 數(shù)據(jù)庫(kù)的模式結(jié)構(gòu)如下圖所示:
Sakila 數(shù)據(jù)庫(kù)提供了以下數(shù)據(jù)表:
actor,演員信息表。通過(guò) film_actor 表和 film 表進(jìn)行關(guān)聯(lián)。
film,電影信息表。film 引用了 language 表,同時(shí)被 film_category、film_actor 以及 inventory 表引用。
film_actor,電影演員表。film 表和 actor 表之間的多對(duì)多關(guān)系。
film_category,電影分類表。film 表和 category 表之間的多對(duì)多關(guān)系。
category,分類表。通過(guò) film_category 表和 film 表進(jìn)行關(guān)聯(lián)。
inventory,電影庫(kù)存表。每部電影在不同商店里的庫(kù)存,被 rental 表引用。
film_text,電影描述表。包含了 film 表中的 film_id、title 以及 description 三個(gè)字段,通過(guò) film 表上的觸發(fā)器進(jìn)行數(shù)據(jù)同步。
language,語(yǔ)言信息表。language 表被 film 表引用。
address,地址信息表。其中主鍵字段 address_id 是 customer、staff 以及 store 表上的外鍵引用字段,同時(shí)引用了 city 表。
city,城市信息表。引用了 country 表,同時(shí)被 address 表引用。
country,國(guó)家信息表。country 表被 city 表引用。
customer,客戶信息表。引用了 address 和 store 表,同時(shí)被 payment 和 rental 表引用。
payment,付款信息表。引用了 customer、staff 以及 rental 表。
rental,租賃信息表,每個(gè) DVD 每次被租賃的信息。引用了 inventory、customer 以及 staff 表,同時(shí)被 payment 表引用。
staff,員工信息表。引用了 store 和 address 表,同時(shí)被 rental、payment 以及 store 表引用。
store,商店信息表,引用了 staff 和 address 表,同時(shí)被 staff、customer 以及 inventory 表引用。
Sakila 數(shù)據(jù)庫(kù)提供了以下視圖:
actor_info,包含了所有的演員,以及他們演出過(guò)的電影。
customer_list,客戶和地址信息列表。
film_list,電影信息和參與的演員。
nicer_but_slower_film_list,電影信息和參與的演員,演員的姓名調(diào)整為首字母大寫。
sales_by_film_category,按照不同電影分類統(tǒng)計(jì)的銷售金額,同一個(gè)電影可能被分為多個(gè)類別。
sales_by_store,按照商店統(tǒng)計(jì)的銷售金額。
staff_list,員工列表,包括地址和所屬的商店。
Sakila 數(shù)據(jù)庫(kù)提供了以下存儲(chǔ)過(guò)程和函數(shù):
film_in_stock,存儲(chǔ)過(guò)程,獲取指定電影在指定商店內(nèi)未出租的 DVD。
film_not_in_stock,存儲(chǔ)過(guò)程,獲取指定電影在指定商店內(nèi)已出租未歸還的 DVD。
rewards_report,存儲(chǔ)過(guò)程,獲取上個(gè)月的最佳客戶列表。
get_customer_balance,存儲(chǔ)函數(shù),返回指定客戶在某個(gè)日期之前的欠款。
inventory_held_by_customer,存儲(chǔ)函數(shù),返回正在租賃某個(gè) DVD 的客戶。
inventory_in_stock,存儲(chǔ)函數(shù),返回某個(gè) DVD 是否可出租。TRUE 表示可以出租,F(xiàn)ALSE 表示已出租未歸還。
Sakila 數(shù)據(jù)庫(kù)包含了以下觸發(fā)器:
customer_create_date,插入數(shù)據(jù)時(shí)將 customer 表的 create_date 字段設(shè)置為當(dāng)前日期和時(shí)間。
payment_date,插入數(shù)據(jù)時(shí)將 payment 表的 payment_date 字段設(shè)置為當(dāng)前日期和時(shí)間。
rental_date,插入數(shù)據(jù)時(shí)將 rental 表的 rental_date 字段設(shè)置為當(dāng)前日期和時(shí)間。
ins_film,將 film 表上插入的相關(guān)數(shù)據(jù)復(fù)制一份到 film_text 表。
upd_film,將 film 表上更新的相關(guān)數(shù)據(jù)同步到 film_text 表。
del_film,刪除 film 表數(shù)據(jù)時(shí)同步刪除 film_text 表上的相關(guān)數(shù)據(jù)。
Sakila 數(shù)據(jù)庫(kù)的創(chuàng)建腳本可以點(diǎn)此下載,然后運(yùn)行以下命令創(chuàng)建數(shù)據(jù)庫(kù)并初始化數(shù)據(jù):
shell> mysql -t < sakila-schema.sql;
shell> mysql -t < sakila-data.sql;
創(chuàng)建成功之后,可以執(zhí)行以下語(yǔ)句進(jìn)行驗(yàn)證:
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)
關(guān)于 Sakila 數(shù)據(jù)庫(kù)的詳細(xì)介紹和使用可以查看官方文檔。
Employees 數(shù)據(jù)庫(kù)
Employees 示例數(shù)據(jù)庫(kù)包含了 6 個(gè)表(dept_emp、dept_manager、titles、salaries、employees 以及 departments),大約 400 萬(wàn)條數(shù)據(jù)(需要約 160 MB 磁盤空間)。Employees 數(shù)據(jù)庫(kù)的模式結(jié)構(gòu)如下圖所示:
Employees 數(shù)據(jù)庫(kù)支持分區(qū)表。另外,它還提供了一個(gè)數(shù)據(jù)測(cè)試的腳本,可以用于驗(yàn)證初始數(shù)據(jù)的完整性。
Employees 數(shù)據(jù)庫(kù)的初始化腳本可以點(diǎn)此下載,然后運(yùn)行以下命令進(jìn)行解壓縮:
shell> unzip test_db-master.zip
shell> cd test_db-master/
Employees 數(shù)據(jù)庫(kù)默認(rèn)使用 InnoDB 存儲(chǔ)引擎,如果需要使用其他引擎,可以修改 employees.sql 文件中的以下內(nèi)容:
/*!50503 set default_storage_engine = InnoDB */;
然后執(zhí)行以下命令創(chuàng)建數(shù)據(jù)庫(kù)并加載數(shù)據(jù):
shell> mysql -t < employees.sql
??如果想要使用分區(qū)表,可以執(zhí)行 employees_partitioned.sql 文件。
Employees 數(shù)據(jù)庫(kù)提供了 md5 和 sha 兩種驗(yàn)證數(shù)據(jù)的方法:
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 數(shù)據(jù)庫(kù)
world 數(shù)據(jù)庫(kù)包含了 country、countrylanguage 以及 city 表。
world 是一個(gè)小型的簡(jiǎn)單數(shù)據(jù)庫(kù),主要用于基礎(chǔ)查詢測(cè)試。
world 數(shù)據(jù)庫(kù)的初始化腳本可以點(diǎn)此下載,然后執(zhí)行以下命令進(jìn)行安裝:
shell> unzip world.sql.zip
shell> mysql -t < world.sql
執(zhí)行以下命令驗(yàn)證數(shù)據(jù)庫(kù)的安裝:
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 數(shù)據(jù)庫(kù)
world_x 是一個(gè)基于 world 修改后的數(shù)據(jù)庫(kù),主要用于測(cè)試 MySQL 5.7 之后提供的文檔存儲(chǔ)功能和 X DevAPI。
world_x 數(shù)據(jù)庫(kù)的初始化腳本可以點(diǎn)此下載,然后執(zhí)行以下命令進(jìn)行安裝:
shell> unzip world_x-db.zip
shell> cd world_x-db
shell> mysql -t < world_x.sql
執(zhí)行以下命令驗(yàn)證數(shù)據(jù)庫(kù)的安裝:
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 數(shù)據(jù)庫(kù)
menagerie 數(shù)據(jù)庫(kù)是一個(gè)小型的動(dòng)物數(shù)據(jù)庫(kù),包含 pet 和 event 表。
menagerie 數(shù)據(jù)庫(kù)的初始化腳本可以點(diǎn)此下載,然后執(zhí)行以下命令進(jìn)行解壓縮:
shell> unzip menagerie-db.zip
shell> cd menagerie-db
創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù):
mysql> CREATE DATABASE menagerie;
mysql> USE menagerie;
創(chuàng)建 pet 表并加載數(shù)據(jù):
mysql> SOURCE cr_pet_tbl.sql;
mysql> LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet;
mysql> SOURCE ins_puff_rec.sql;
創(chuàng)建 event 表并加載數(shù)據(jù):
mysql> SOURCE cr_event_tbl.sql;
mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;
總結(jié)
Sakila 是一個(gè)相對(duì)復(fù)雜和完整的示例數(shù)據(jù)庫(kù),可以用于測(cè)試 MySQL 中的各種功能;Employees 是一個(gè)經(jīng)典的員工管理數(shù)據(jù)庫(kù);world 是一個(gè)小型的數(shù)據(jù)庫(kù),world_x 是一個(gè)文檔數(shù)據(jù)庫(kù);menagerie 是一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)。這些示例數(shù)據(jù)庫(kù)可以滿足我們不同的學(xué)習(xí)和測(cè)試需求,也為數(shù)據(jù)庫(kù)設(shè)計(jì)提供了一定的參考價(jià)值。
你在學(xué)習(xí)和工作中還使用或參考過(guò)哪些經(jīng)典的 MySQL 示例數(shù)據(jù)庫(kù)?歡迎關(guān)注??、評(píng)論??、點(diǎn)贊??!