Skip to main content
  1. 经验技巧分享/
  2. thinking in SQL | 废话SQL,思维与实践/

安装示例数据库

··2875 字
sql 实践 有悟方法 howto

继上一篇文章 《如何快速设立一个可用的SQL环境》中介绍如何安装数据库软件用于练习,本文将介绍一些可用于测试的示例数据。将这些示例数据导入到数据库中,可用于 SQL 功能练习、数据库功能练习、程序演示等等。

文中所介绍的示例数据集,要求可被导入到数据库中,而不是简单介绍其表设计、表间关系。

在互联网上搜索,搜索引擎大概会给出这几个示例数据库(还好不卷,开发者也比较懒,都是拿现成的,不然又得挑花眼)。oracle数据库自带的员工示例 sample schemas 、mysql 中的雇员示例 Employees Sample Database 、 mysql DVD 租赁示例 sakila 、 postgres DVD 租赁示例 pagila 、mssql 办公雇员示例 AdventureWorks 、音乐光碟销售示例数据库 chinook 等。

这些示例库来自不同的团队和个人,风格迥异(大小写、驼峰下划线等),部分数据库还带有视图、函数、存储过程,非常容易造成使用上的困扰。

有悟选择较有代表性的示例数据库,制作表设计说明、数据导入说明等,以此方便大家选择。每个示例库,将尽可能包含表设计(ER图)说明、视图、数据导入脚本。因各数据库的差别,如表名、字段名大写小问题,标识符引号问题(mysql 默认会出现一个非常讨厌的反引号 “`”)。为了让脚本更通用化,在整理 sql 脚本时,遵照以下这个规范:

  1. 标识符一律采用 小写
  2. 视图名称前缀 v_
  3. 表中的数据按随机顺序入库
示例库 大小 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.

where-it-comes-from

数据模型 #

employees 表模型 er 图
employees 表模型 er 图

官方文档中的原版模型设计(英文) 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
  1. 下载本存储库
git clone https://github.com/lizhuoqi/db-sample-schemas
  1. 在命令行中进入存储库目录
cd DB_SAMPLE_SCHEMAS/employees
  1. 解压 csv 数据文件
unzip ./data/data.zip
  1. 按照实际使用的数据库服务执行对应的 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

CC BY-SA 3.0
CC BY-SA 3.0

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.

Introduction

与原版之间的差别 #

  • 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
  1. 下载本存储库

  2. 在命令行中进入存储库目录

cd PATH_TO_DB_SAMPLE_SCHEMAS/sakila
  1. 解压 csv 数据文件
unzip ./data/data.zip
  1. 按照实际使用的数据库服务执行 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.sqlsakila-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_dateemployee.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
  1. 下载本存储库

  2. 在命令行中进入存储库目录

cd PATH_TO_DB_SAMPLE_SCHEMAS/chinook
  1. 按照实际使用的数据库服务执行 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

CC BY-SA 3.0
CC BY-SA 3.0