安装示例数据库
目录
继上一篇文章 《如何快速设立一个可用的SQL环境》中介绍如何安装数据库软件用于练习,本文将介绍一些可用于测试的示例数据。将这些示例数据导入到数据库中,可用于 SQL 功能练习、数据库功能练习、程序演示等等。
文中所介绍的示例数据集,要求可被导入到数据库中,而不是简单介绍其表设计、表间关系。
在互联网上搜索,搜索引擎大概会给出这几个示例数据库(还好不卷,开发者也比较懒,都是拿现成的,不然又得挑花眼)。oracle数据库自带的员工示例 sample schemas 、mysql 中的雇员示例 Employees Sample Database 、 mysql DVD 租赁示例 sakila 、 postgres DVD 租赁示例 pagila 、mssql 办公雇员示例 AdventureWorks 、音乐光碟销售示例数据库 chinook 等。
这些示例库来自不同的团队和个人,风格迥异(大小写、驼峰下划线等),部分数据库还带有视图、函数、存储过程,非常容易造成使用上的困扰。
有悟选择较有代表性的示例数据库,制作表设计说明、数据导入说明等,以此方便大家选择。每个示例库,将尽可能包含表设计(ER图)说明、视图、数据导入脚本。因各数据库的差别,如表名、字段名大写小问题,标识符引号问题(mysql 默认会出现一个非常讨厌的反引号 “`”)。为了让脚本更通用化,在整理 sql 脚本时,遵照以下这个规范:
- 标识符一律采用 小写
- 视图名称前缀 v_
- 表中的数据按随机顺序入库
示例库 | 大小 | postgres | sqlite | MySQL | 来源 |
---|---|---|---|---|---|
employees | 6 张表,约 160 M | ✔ | ✔ | ✔ | MySQL Employees Sample Database |
sakila | 16 张表 , 约 5 M | ✔ | ✔ | ✔ | Sakila Sample Database Version 1.2 |
chinook | 11 张表 , 约 500 K | ✔ | ✔ | ✔ | Chinook Database - Version 1.4 |
在安装示例数据库之前,先确保你拥有 postgres、mysql、sqlite3 其中之一的数据库服务。如何安装数据库服务,可看 《如何快速设立一个可用的SQL环境》
employees - 雇员示例数据库 #
版本: 1.1.0
这是一个以雇员为例子的示例数据库。它包含的表有部门、员工、员工所属部门、员工职位、员工薪酬等。
它来自哪里? #
原数据库来自于 Employees Sample Database ,它的代码在 test_db 公开。
The original data was created by Fusheng Wang and Carlo Zaniolo at Siemens Corporate Research. The data is in XML format. http://timecenter.cs.aau.dk/software.htm
Giuseppe Maxia made the relational schema and Patrick Crews exported the data in relational format.
The database contains about 300,000 employee records with 2.8 million salary entries. The export data is 167 MB, which is not huge, but heavy enough to be non-trivial for testing.
该数据库有六个表,包含约 300,000 条员工记录,其中 280 万条工资条目,总共包含 400 万条记录。 导出的数据是167MB,不算大,但是重到足以进行测试。
The data was generated, and as such there are inconsistencies and subtle problems. Rather than removing them, we decided to leave the contents untouched, and use these issues as data cleaning exercises.
数据模型 #
官方文档中的原版模型设计(英文) ER 图见 Employees Structure
employees 中的表 #
表名 | 注释 | 数据(行) |
---|---|---|
departments | 部门 | 9 |
dept_emp | 员工所属部门 | 331603 |
dept_manager | 部门主管 | 24 |
employees | 员工 | 300024 |
salaries | 员工薪酬 | 2844047 |
titles | 员工岗位 | 443308 |
视图 #
视图名 | 作用 |
---|---|
v_emp_latest_date | 查询员工最后状态的日期,包括在职或者离职 |
v_current_dept_emp | 根据员工最后状态查询部门员工 |
v_full_departments | 带有经理的所有部门 |
过程 #
name | postgres | mysql | sqlite3 |
---|---|---|---|
get_emp_dept_id | function | function | 不支持 |
get_emp_dept_name | function | function | 不支持 |
get_emp_name | function | function | 不支持 |
get_current_manager | function | function | 不支持 |
show_departments | function | procedure | 不支持 |
employees_usage | function | function | 不支持 |
show_employees_help | procedure | procedure | 不支持 |
与原版之间的差别 #
- 使用了 employees.sql
- 使用了 load_*.dump 文件中的数据
- 数据已按随机方式重新排序
- 暂未创建 objects.sql 中的视图与函数
- 原代码库中 test_*.sh 测试无法执行
在各数据库服务中安装示例数据库的准备工作 #
本例使用到的 SQL 脚本与示例数据,托管在 db-sample-schemas/employees 。国内无法访问 github.com 的用户,请访问仓库镜像 gitee db-sample-schemas/employees 。
数据库 | 脚本 |
---|---|
mysql 8 | import-mysql.sql |
postgres 14 | import-postgres.sql |
sqlite 3.37 | import-sqlite.sql |
- 下载本存储库
git clone https://github.com/lizhuoqi/db-sample-schemas
- 在命令行中进入存储库目录
cd DB_SAMPLE_SCHEMAS/employees
- 解压 csv 数据文件
unzip ./data/data.zip
- 按照实际使用的数据库服务执行对应的 SQL 脚本来创建表、导入示例数据
为了确保 SQL脚本 可以重复执行,SQL 脚本中在执行 create
操作前包含了视图、表的 DROP
操作 DDL,请忽略命令行终端如下这类的错误提示信息,它是在告诉你, “删除不存在对象” 。
类似于 “ERROR: view "v_current_dept_emp" does not exist”
在有悟个人的笔记本电脑,脚本的执行需要大约1分钟。
MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports
处理器 2.3 GHz 双核Intel Core i5
内存 8 GB 2133 MHz LPDDR3
在 postgres 中安装 #
首先,启动你的 postgres 数据库服务实例
pg_ctl -D [你的postgres示例已经初始化了的目录] start
在另一个命令行终端上执行
psql < import-postgres.sql
若已登录到 psql cli 下
➜ psql
psql (14.2)
Type "help" for help.
macbook=#\i import-postgres.sql
➜ psql < import-postgres.sql
DROP DATABASE
CREATE DATABASE
You are now connected to database "employees" as user "macbook".
start at 2022-05-17 12:43:38.591187+08
CREATING DATABASE STRUCTURE
psql:./sql/drop.sql:3: ERROR: view "v_current_dept_emp" does not exist
psql:./sql/drop.sql:4: ERROR: view "v_emp_latest_date" does not exist
psql:./sql/drop.sql:5: NOTICE: table "dept_emp" does not exist, skipping
DROP TABLE
psql:./sql/drop.sql:6: NOTICE: table "dept_manager" does not exist, skipping
DROP TABLE
psql:./sql/drop.sql:7: NOTICE: table "titles" does not exist, skipping
DROP TABLE
psql:./sql/drop.sql:8: NOTICE: table "salaries" does not exist, skipping
DROP TABLE
psql:./sql/drop.sql:9: NOTICE: table "employees" does not exist, skipping
DROP TABLE
psql:./sql/drop.sql:10: NOTICE: table "departments" does not exist, skipping
DROP TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE VIEW
CREATE VIEW
LOADING departments
COPY 9
LOADING employees
COPY 300024
LOADING dept_emp
COPY 331603
LOADING dept_manager
COPY 24
LOADING salaries
COPY 2844047
LOADING titles
COPY 443308
Ended at 2022-05-17 12:44:33.367527+08
It tooks 00:00:54.777496
Counting tables record
dept_emp | 331603
dept_manager | 24
titles | 443308
salaries | 2844047
employees | 300024
departments | 9
在 sqlite 中执行 #
在命令行终端执行
sqlite3 employees.sqlite < import-sqlite.sql
若你已经在 sqlite3 的提示符下
➜ sqlite3 employees.sqlite
SQLite version 3.37.0 2021-12-09 01:34:53
Enter ".help" for usage hints.
sqlite> .read import-sqlite.sql
如果 employees.sqlite 文件不存在,sqlite3 会自动创建。
CREATING DATABASE STRUCTURE
Error: near line 3: in prepare, no such view: v_current_dept_emp (1)
Error: near line 4: in prepare, no such view: v_emp_latest_date (1)
LOADING departments
LOADING employees
LOADING titles
LOADING dept_emp
LOADING dept_manager
LOADING salaries
It tooks 00:48.000
Counting tables record
dept_emp|331603
dept_manager|24
titles|443308
salaries|2844047
employees|300024
departments|9
在 mysql 服务中执行 #
首先,启动你的 mysql 数据库服务实例
mysqld --datadir=mysql数据库数据目录
在另一个命令行终端执行
mysql --user=root --force -sN < import-postgres.sql
若已登录到 mysql cli 下的,可以这样
➜ mysql --user=root -sN
mysql>\. import-mysql.sql
或者
mysql> source import-mysql.sql
➜ mysql --user=root --force -sN < import-mysql.sql
start at 2022-05-17 11:52:50
CREATING DATABASE STRUCTURE
Dropping everything
ERROR 1051 (42S02) at line 3 in file: './sql/drop.sql': Unknown table 'employees.v_current_dept_emp'
ERROR 1051 (42S02) at line 4 in file: './sql/drop.sql': Unknown table 'employees.v_emp_latest_date'
Creating tables
storage engine: InnoDB
Creating views
LOADING departments
employees.departments: Records: 9 Deleted: 0 Skipped: 0 Warnings: 0
LOADING employees
employees.employees: Records: 300024 Deleted: 0 Skipped: 0 Warnings: 0
LOADING dept_emp
employees.dept_emp: Records: 331603 Deleted: 0 Skipped: 0 Warnings: 0
LOADING dept_manager
employees.dept_manager: Records: 24 Deleted: 0 Skipped: 0 Warnings: 0
LOADING salaries
employees.salaries: Records: 2844047 Deleted: 0 Skipped: 0 Warnings: 0
LOADING titles
employees.titles: Records: 443308 Deleted: 0 Skipped: 0 Warnings: 0
Ended at 2022-05-17 11:53:58
It tooks 00:01:08.000000
Counting tables record
dept_emp 331603
dept_manager 24
titles 443308
salaries 2844047
employees 300024
departments 9
LICENSE #
employees 示例数据库在 署名-相同方式共享 3.0 未本地化版本 (CC BY-SA 3.0) 许可下许可。 要查看此许可证的副本,请访问 https://creativecommons.org/licenses/by-sa/3.0/deed.zh 。
sakila - DVD 租赁示例数据库 #
版本: 1.2.0
数据模型 #
这是一个 DVD 租赁的例子。它包含的表有影片、演员、库存、门店、出租、支付等表。
关于原版模型设计的说明(英文),可见 Structure
sakila 中的表 #
表名 | 注释 | 数据(行) |
---|---|---|
actor | 演员 | 200 |
address | 地址 | 603 |
category | 类别 | 16 |
city | 城市 | 600 |
country | 国家 | 109 |
customer | 顾客 | 599 |
film | 电影 | 1000 |
film_actor | 电影演员 | 5462 |
film_category | 电影类别 | 1000 |
film_text | 电影文本 | 1000 |
inventory | 存库 | 4581 |
language | 语言 | 6 |
payment | 支付 | 16049 |
rental | 出租 | 16044 |
staff | 职员 | 2 |
store | 门店 | 2 |
视图 #
视图名 | 注释 |
---|---|
v_customer_list | |
v_film_list | |
v_nicer_but_slower_film_list | |
v_staff_list | |
v_sales_by_store | |
v_sales_by_film_category | |
v_actor_info |
过程 #
名称 | postgres | mysql | sqlite3 |
---|---|---|---|
get_customer_balance | 函数 | 函数 | 不支持 |
inventory_held_by_customer | 函数 | 函数 | 不支持 |
inventory_in_stock | 函数 | 函数 | 不支持 |
rewards_report | 函数 | 过程 | 不支持 |
film_in_stock | 过程 | 过程 | 不支持 |
film_not_in_stock | 过程 | 过程 | 不支持 |
它来自哪里 #
sakila 示例数据库来自于 Sakila Sample Database Version 1.2 ,它的代码 sakila-db.zip 。
The Sakila sample database was initially developed by Mike Hillyer, a former member of the MySQL AB documentation team. It is intended to provide a standard schema that can be used for examples in books, tutorials, articles, samples, and so forth. The Sakila sample database also serves to highlight features of MySQL such as Views, Stored Procedures, and Triggers.
Additional information on the Sakila sample database and its usage can be found through the MySQL forums.
与原版之间的差别 #
- sakila-schema.sql 中全部 16 张表保留
- 字段数据类型调整,使得 postgres、sqlite3、mysql 中均可使用
- sakila-data.sql 的全部数据
- 数据已按随机方式重新排序
- 暂未创建视图与函数
为了 postgres、sqlite3、mysql 兼容所做的调整 #
序号 | 原脚本 | postgres | sqlite3 | mysql |
---|---|---|---|---|
1 | smallint, tinyint | int2 | int2 | int2 |
2 | mediumint | int | int | int |
3 | UNSIGNED | 去掉该关键字 | 去掉该关键字 | 去掉该关键字 |
4 | auto_increment | sequence | 无 | auto_increment |
5 | 可空字段的 default null | 去掉 | 去掉 | 去掉 |
6 | film.rating enum | varchar + check(rating in ('G','PG','PG-13','R','NC-17')) |
同 postgres | 同 postgres |
7 | film.release_year year | int2 + check(release_year >= 1901 and release_year <= 2155 ) |
同 postgres | 同 postgres |
8 | film.special_features set | varchar | varchar | set |
9 | staff.picture blob | bytea | blob | blob |
10 | language.name char(20) | varchar(20) | varchar(20) | varchar(20) |
11 | address.location GEOMETRY srid | to be done | to be done | to be done |
12 | 每个表中的 last_update, ON UPDATE CURRENT_TIMESTAMP | to be done | to be done | to be done |
13 | film_text 全文搜索 | to be done | to be done | to be done |
安装前准备 #
准备一个 postgres、sqlite、MySQL 数据库服务。如何安装数据库服务,可看 《如何快速设立一个可用的SQL环境》
本例使用到的 SQL 脚本与示例数据,托管在 db-sample-schemas/sakila 。国内无法访问 github.com 的用户,请访问仓库镜像 gitee db-sample-schemas/sakila 。
数据库 | 脚本 |
---|---|
mysql 8 | import-mysql.sql |
postgres 14 | import-pg.sql |
sqlite 3.37 | import-sqlite.sql |
-
下载本存储库
-
在命令行中进入存储库目录
cd PATH_TO_DB_SAMPLE_SCHEMAS/sakila
- 解压 csv 数据文件
unzip ./data/data.zip
- 按照实际使用的数据库服务执行 SQL 脚本来创建表、导入示例数据
为了确保 SQL脚本 可以重复执行,SQL 脚本中在执行 create
操作前包含了视图、表的 DROP
操作 DDL,请忽略命令行终端如下这类错误提示信息。它只是在告诉你, “删除不存在对象” 。
类似于 “ERROR: Table 'sakila.store' doesn't exist”
在我个人的笔记本电脑,脚本的执行在3秒钟以内完成。
MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports
处理器 2.3 GHz 双核Intel Core i5
内存 8 GB 2133 MHz LPDDR3
在 Postgres 服务中安装 #
首先,启动你的 postgres 数据库服务实例
pg_ctl -D [你的postgres示例已经初始化了的目录] start
在另一个命令行终端上执行
psql < import-pg.sql
若已登录到 psql cli 下
➜ psql
psql (14.2)
Type "help" for help.
macbook=#\i import-pg.sql
命令行终端执行脚本时打印的信息过长,下面使用 ... 🥱 ...
替代部分重复信息。
```
~/youwu.today/sqllab/sample/db-sample-schemas/sakila git:(develop)
➜ psql < import-pg.sql
ERROR: database "sakila" is being accessed by other users
DETAIL: There are 2 other sessions using the database.
ERROR: database "sakila" already exists
You are now connected to database "sakila" as user "macbook".
start at 2022-05-24 00:01:50.759986+08
CREATING DATABASE STRUCTURE
========================================
- Dropping everything
... 🥱 ...
- Patching
psql:./sql/pre-pg.sql:2: ERROR: type "datetime" already exists
- Creating tables
... 🥱 ...
- Creating views
LOADING Data
========================================
- LOADING actorCOPY 200
- LOADING categoryCOPY 16
- LOADING languageCOPY 6
- LOADING filmCOPY 1000
- LOADING film_actorCOPY 5462
- LOADING film_categoryCOPY 1000
- LOADING film_textCOPY 1000
- LOADING countryCOPY 109
- LOADING cityCOPY 600
- LOADING addressCOPY 603
- LOADING storeCOPY 2
- LOADING customerCOPY 599
- LOADING staff
INSERT 0 1
INSERT 0 1
- LOADING inventoryCOPY 4581
- LOADING rentalCOPY 16044
- LOADING paymentCOPY 16049
Post Install After Data Loaded
========================================
CREATE SEQUENCE
... 🥱 ...
COMMENT
Counting tables record
========================================
actor | 200
address | 603
category | 16
city | 600
country | 109
customer | 599
film | 1000
film_actor | 5462
film_category | 1000
film_text | 1000
inventory | 4581
language | 6
payment | 16049
rental | 16044
staff | 2
store | 2
--------------------------------------
Ended at 2022-05-24 00:01:52.074261+08
It tooks 00:00:01.31452
```
在 sqlite 中安装 #
在命令行终端执行
sqlite3 sakila.sqlite < import-sqlite.sql
若你已经在 sqlite3 的提示符下
➜ sqlite3 sakila.sqlite
SQLite version 3.37.0 2021-12-09 01:34:53
Enter ".help" for usage hints.
sqlite> .read import-sqlite.sql
如果 sakila.sqlite 文件不存在,sqlite3 会自动创建。
start at :2022-05-23 16:58:14
CREATING DATABASE STRUCTURE
========================================
Error: near line 26: in prepare, near "constraint": syntax error (1)
* Creating tables
* Creating views
* LOADING actor
* LOADING category
* LOADING language
* LOADING film
* LOADING film_actor
* LOADING film_category
* LOADING film_text
* LOADING country
* LOADING city
* LOADING address
* LOADING store
* LOADING customer
* LOADING staff
* LOADING inventory
* LOADING rental
* LOADING payment
Counting tables record
========================================
| tab | rows_count |
|---------------|------------|
| actor | 200 |
| address | 603 |
| category | 16 |
| city | 600 |
| country | 109 |
| customer | 599 |
| film | 1000 |
| film_actor | 5462 |
| film_category | 1000 |
| film_text | 1000 |
| inventory | 4581 |
| language | 6 |
| payment | 16049 |
| rental | 16044 |
| staff | 2 |
| store | 2 |
--------------------------------------
Ended at 2022-05-23 16:58:14
It tooks 00:00.000
在 mysql 服务中安装 #
首先,启动你的 mysql 数据库服务实例
mysqld --datadir=mysql数据库数据目录
在另一个命令行终端执行
mysql --user=root --force -sN < import-mysql.sql
若已登录到 mysql cli 下的,可以这样
➜ mysql --user=root -sN
mysql>\. import-mysql.sql
或者
mysql> source import-mysql.sql
➜ mysql --user=root --force -sN < import-mysql.sql
start at 2022-05-24 01:23:36
CREATING DATABASE STRUCTURE
========================================
* Dropping everything
* Creating tables
* Creating views
LOADING DATA
========================================
sakila1.actor: Records: 200 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.category: Records: 16 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.language: Records: 6 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.film: Records: 1000 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.film_actor: Records: 5462 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.film_category: Records: 1000 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.film_text: Records: 1000 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.country: Records: 109 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.city: Records: 600 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.address: Records: 603 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.store: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.customer: Records: 599 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.inventory: Records: 4581 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.rental: Records: 16044 Deleted: 0 Skipped: 0 Warnings: 0
sakila1.payment: Records: 16049 Deleted: 0 Skipped: 0 Warnings: 0
Post Install After Data Loaded
========================================
Counting tables record
========================================
actor 200
address 603
category 16
city 600
country 109
customer 599
film 1000
film_actor 5462
film_category 1000
film_text 1000
inventory 4581
language 6
payment 16049
rental 16044
staff 2
store 2
--------------------------------------
Ended at 2022-05-24 01:23:38
It tooks 00:00:02.000000
免责声明 #
示例中的数据是捏造的,它不对应于真实世界的任何人。如有类同,纯属巧合。
许可授权 #
原 sakila 示例数据库中 sakila-schema.sql、sakila-data.sql 的内容以 the New BSD license 授权,具体看,https://dev.mysql.com/doc/sakila/en/sakila-license.html。
本项工作按照原示例数据库的许可进行授权。
关于 the New BSD license,更多内容看 www.opensource.org/licenses/bsd-license.php
chinook - 专辑曲目销售示例数据库 #
版本: 1.0.0
数据模型 #
这是一个 音乐专辑销量 的示例。它包含的表有专辑、艺术家、顾客、员工、发票等表。
chinook 中的表 #
表名 | 注释 | 数据(行) |
---|---|---|
artist | 艺术家 | 275 |
album | 专辑 | 347 |
employee | 员工 | 8 |
customer | 顾客 | 59 |
genre | 音乐风格 | 25 |
invoice | 发票 | 412 |
media_type | 媒体文件类型 | 5 |
track | 曲目 | 3503 |
invoice_line | 发票行 | 2240 |
playlist | 播放列表 | 18 |
playlist_track | 播放列表曲目 | 8715 |
它来自哪里 #
sakila 示例数据库来自于 Chinook Database - Version 1.4 。
Chinook is a sample database available for SQL Server, Oracle, MySQL, etc. It can be created by running a single SQL script. Chinook database is an alternative to the Northwind database, being ideal for demos and testing ORM tools targeting single and multiple database servers.
与原版之间的差别 #
- Chinook_postgres.sql 中全部 11 张表和数据
- employee.birth_date、employee.hire_date 字段数据类型调整为
datetime
,为个别日期超过 mysql timestamp 类型的值范围。 - 数据已按随机方式重新排序
- 只使用了示例数据库中的 表、数据。其他 C# 应用程序不使用,未来也不会。
为了 postgres、sqlite3、mysql 兼容所做的调整 #
序号 | 原脚本 | postgres | sqlite3 | mysql |
---|---|---|---|---|
1 | employee.birth_date timestamp | timestamp | timestamp | datetime |
2 | employee.hire_date timestamp | timestamp | timestamp | datetime |
前提条件 #
准备一个 postgres、sqlite、MySQL 数据库服务。如何安装数据库服务,可看 《如何快速设立一个可用的SQL环境》
除 sqlite 外,使用 postgres、MySQL 的,至少需要这些权限。
SELECT, INSERT, UPDATE, DELETE,
CREATE, DROP, RELOAD, REFERENCES,
INDEX, ALTER, SHOW DATABASES,
CREATE TEMPORARY TABLES,
LOCK TABLES, EXECUTE, CREATE VIEW
一般地,若使用本地主机进行实验,我们使用的都是权限很高的用户,这些权限不需要你去特别的关心。
安装 postgres、mysql 数据库后,将这些数据库程序的 bin 目录配置到环境的 PATH
中。
sqlite 仅为一个可执行文件,可放在环境变量 PATH
包含的任何目录下。
安装示例数据库前的准备工作 #
本例使用到的 SQL 脚本与示例数据,托管在 db-sample-schemas/chinook 。国内无法访问 github.com 的用户,请访问仓库镜像 gitee db-sample-schemas/chinook
数据库 | 脚本 |
---|---|
mysql 8 | import-mysql.sql |
postgres 14 | import-pg.sql |
sqlite 3.37 | import-sqlite.sql |
-
下载本存储库
-
在命令行中进入存储库目录
cd PATH_TO_DB_SAMPLE_SCHEMAS/chinook
- 按照实际使用的数据库服务执行 SQL 脚本来创建表、导入示例数据
为了确保 SQL脚本 可以重复执行,SQL 脚本中在执行 create
操作前包含了视图、表的 DROP
操作 DDL,请忽略命令行终端如下这类错误提示信息。它只是在告诉你, “删除不存在对象” 。
类似于 “ERROR: Table 'chinook.album' doesn't exist”
在我个人的笔记本电脑,脚本的执行在3秒钟以内完成。
MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports
处理器 2.3 GHz 双核Intel Core i5
内存 8 GB 2133 MHz LPDDR3
命令行终端执行脚本时打印的信息过长,下面使用
... 🥱 ...
替代部分非关键信息。
本示例数据库提供了两种数据加载方式,使用数据库的文本文件加载工具或者 insert … values() 的纯sql方式,两种方式各有优缺点。
insert … values() 兼容性最好,postgres 、mysql、sqlite3 能用,但其效率比直接的文件加载的方式低。本例选择了折衷的方案:
数据库 | 加载方式 | 说明 |
---|---|---|
postgres | \copy |
csv 文本中的空值无须特别处理,如 “,,” |
mysql | insert ... sql |
默认方式 |
mysql | mysqlimport | 因 mysqlimport 会对空值进行“零值”转换, 字符类型的字段空值变成空字符串(’’),数字类型字段值置为“0”。 |
sqlite3 | .import | 默认方式,但由于空值问题,字段会被置为空字符串,is null 失效,而要用 = '' |
sqlite3 | insert ... sql |
效率要比 .import 的慢很多。 |
若想启动非默认方式,修改 import-*.sql 脚本中的 LOADING 部分。
如 import-sqlite.sql 中,默认使用 .import
命令,若注释掉 .import
行,反注释 .read
行,则会使用 insert ...
sql 加载数据。
-- .read ./data/artist.sql
.import --csv --skip 1 data/artist.csv artist
在 Postgres 服务中安装 #
首先,启动你的 postgres 数据库服务实例
pg_ctl -D [你的postgres示例已经初始化了的目录] start
在另一个命令行终端上执行
psql < import-pg.sql
若已登录到 psql cli 下
➜ psql
psql (14.2)
Type "help" for help.
macbook=#\i import-pg.sql
~/youwu.today/sqllab/sample/db-sample-schemas/chinook git:(develop)
➜ psql < import-pg.sql
ERROR: database "chinook" is being accessed by other users
DETAIL: There are 2 other sessions using the database.
ERROR: database "chinook" already exists
You are now connected to database "chinook" as user "macbook".
start at 2022-05-26 14:23:15.915499+08
CREATING DATABASE STRUCTURE
========================================
- Dropping everything
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
- Creating tables
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
- Creating views
LOADING Data
========================================
- LOADING artistCOPY 275
- LOADING albumCOPY 347
- LOADING employeeCOPY 8
- LOADING customerCOPY 59
- LOADING genreCOPY 25
- LOADING invoiceCOPY 412
- LOADING media_typeCOPY 5
- LOADING trackCOPY 3503
- LOADING invoice_lineCOPY 2240
- LOADING playlistCOPY 18
- LOADING playlist_trackCOPY 8715
Post Install After Data Loaded
========================================
COMMENT
... 🥱 ...
COMMENT
Counting tables record
========================================
artist | 275
album | 347
employee | 8
customer | 59
genre | 25
invoice | 412
media_type | 5
track | 3503
invoice_line | 2240
playlist | 18
playlist_track | 8715
--------------------------------------
Ended at 2022-05-26 14:23:16.373602+08
It tooks 00:00:00.458396
在 sqlite 中安装 #
在命令行终端执行
sqlite3 chinook.sqlite < import-sqlite.sql
若你已经在 sqlite3 的提示符下
➜ sqlite3 chinook.sqlite
SQLite version 3.37.0 2021-12-09 01:34:53
Enter ".help" for usage hints.
sqlite> .read import-sqlite.sql
如果 chinook.sqlite 文件不存在,sqlite3 会自动创建。
~/youwu.today/sqllab/sample/db-sample-schemas/chinook git:(develop)
➜ sqlite3 chinook.sqlite < import-sqlite.sql
start at :2022-05-26 06:20:39
CREATING DATABASE STRUCTURE
========================================
* Dropping everything
* Creating tables
* Creating views
LOADING Data
========================================
* LOADING artist
* LOADING album
* LOADING employee
* LOADING customer
* LOADING genre
* LOADING invoice
* LOADING media_type
* LOADING track
* LOADING invoice_line
* LOADING playlist
* LOADING playlist_trac
Counting tables record
========================================
| tab | rows_count |
|----------------|------------|
| artist | 275 |
| album | 347 |
| employee | 8 |
| customer | 59 |
| genre | 25 |
| invoice | 412 |
| media_type | 5 |
| track | 3503 |
| invoice_line | 2240 |
| playlist | 18 |
| playlist_track | 8715 |
--------------------------------------
Ended at 2022-05-26 06:20:39
It tooks 00:00.000
在 mysql 服务中安装 #
首先,启动你的 mysql 数据库服务实例
mysqld --datadir=mysql数据库数据目录
在另一个命令行终端执行
mysql --user=root --force -sN < import-mysql.sql
若已登录到 mysql cli 下的,可以这样
➜ mysql --user=root -sN
mysql>\. import-mysql.sql
或者
mysql> source import-mysql.sql
➜ mysql --user=root --force -sN < import-mysql.sql
start at 2022-05-26 14:21:46
CREATING DATABASE STRUCTURE
========================================
* Dropping everything
* Creating tables
* Creating views
LOADING DATA
========================================
* LOADING artist
* LOADING album
* LOADING employee
* LOADING customer
* LOADING genre
* LOADING invoice
* LOADING media_type
* LOADING track
* LOADING invoice_line
* LOADING playlist
* LOADING playlist_trac
Counting tables record
========================================
artist 275
album 347
employee 8
customer 59
genre 25
invoice 412
media_type 5
track 3503
invoice_line 2240
playlist 18
playlist_track 8715
--------------------------------------
Ended at 2022-05-26 14:21:52
It tooks 00:00:06.000000
免责声明 #
Media related data was created using real data from an iTunes Library
原示例数据库听音乐,是从 iTunes 的音乐中提取出来的。其中代表人的顾客、员工的姓名是捏造的,它不对应于真实世界的任何人。如有类同,纯属巧合。
许可授权 #
原 chinook 示例数据库作者允许其他人使用该项目下的内容,具体授权见 https://github.com/lerocha/chinook-database/blob/master/LICENSE.md 。
这项工作在 署名-相同方式共享 3.0 未本地化版本 (CC BY-SA 3.0) 许可下许可。 要查看此许可证的副本,请访问 https://creativecommons.org/licenses/by-sa/3.0/deed.zh 。