在接下来的教程中,我们将会使用一个名为 BikeStores 的示例数据库,它的实体关系图(ERD)如下:


从上图可以看出,BikeStores 数据可靠包含两个模式(Schema),分别是 sales 和 production。这两个模式总共包含 9 个数据表。

数据表

sales.customers

sales.customers 表存储了客户的信息,包括名字、姓氏、电话、电子邮箱、街道、城市、州以及邮政编码。该表的创建语句如下:

CREATE TABLE sales.customers (
	customer_id INT IDENTITY (1, 1) PRIMARY KEY,
	first_name VARCHAR (255) NOT NULL,
	last_name VARCHAR (255) NOT NULL,
	phone VARCHAR (25),
	email VARCHAR (255) NOT NULL,
	street VARCHAR (255),
	city VARCHAR (50),
	state VARCHAR (25),
	zip_code VARCHAR (5)
);

sales.orders

sales.orders 表存储了销售订单的基本,包括客户、订单状态、订单日期、提货日期、发货日期。另外,它还存储了有关销售交易的创建位置(商店)和创建人(员工)的信息。

每个销售订单在 sales_orders 表中存在一条记录,一个销售订单在 sales.order_items 表中存在一个或多个订单项。该表的创建语句如下:

CREATE TABLE sales.orders (
	order_id INT IDENTITY (1, 1) PRIMARY KEY,
	customer_id INT,
	order_status tinyint NOT NULL,
	-- Order status: 1 = Pending; 2 = Processing; 3 = Rejected; 4 = Completed
	order_date DATE NOT NULL,
	required_date DATE NOT NULL,
	shipped_date DATE,
	store_id INT NOT NULL,
	staff_id INT NOT NULL,
	FOREIGN KEY (customer_id) 
        REFERENCES sales.customers (customer_id) 
        ON DELETE CASCADE ON UPDATE CASCADE,
	FOREIGN KEY (store_id) 
        REFERENCES sales.stores (store_id) 
        ON DELETE CASCADE ON UPDATE CASCADE,
	FOREIGN KEY (staff_id) 
        REFERENCES sales.staffs (staff_id) 
        ON DELETE NO ACTION ON UPDATE NO ACTION
);

sales.order_items

sales.order_items 表存储了订单的具体项目。每个订单项属于一个指定的销售订单,使用字段 order_id 表示。

订单项包含了产品、订单数量、标价以及折扣。该表的创建语句如下:

CREATE TABLE sales.order_items(
	order_id INT,
	item_id INT,
	product_id INT NOT NULL,
	quantity INT NOT NULL,
	list_price DECIMAL (10, 2) NOT NULL,
	discount DECIMAL (4, 2) NOT NULL DEFAULT 0,
	PRIMARY KEY (order_id, item_id),
	FOREIGN KEY (order_id) 
        REFERENCES sales.orders (order_id) 
        ON DELETE CASCADE ON UPDATE CASCADE,
	FOREIGN KEY (product_id) 
        REFERENCES production.products (product_id) 
        ON DELETE CASCADE ON UPDATE CASCADE
);

sales.stores

sales.stores 表包含了商店的信息。每个商店拥有一个商店名称、联系信息(例如电话和电子邮箱)以及地址(包括街道、城市、州和邮政编码)。该表的创建语句如下:

CREATE TABLE sales.stores (
	store_id INT IDENTITY (1, 1) PRIMARY KEY,
	store_name VARCHAR (255) NOT NULL,
	phone VARCHAR (25),
	email VARCHAR (255),
	street VARCHAR (255),
	city VARCHAR (255),
	state VARCHAR (10),
	zip_code VARCHAR (5)
);

sales.staffs

sales.staffs 表包含了员工的基本信息,包括名字和姓氏等。另外,它还包含了员工的联系信息,例如电子邮箱和电话。

一名员工只在一个商店工作,通过字段 store_id 表示。一个商店可以拥有一名或多名员工。

一名员工汇报给一名商店经理,使用字段 manager_id 表示。如果字段 manager_id 为空,表明该员工是最高管理者。

如果某名员工不再为任何商店工作,字段 active 的值就会设置为 0。

该表的创建语句如下:

CREATE TABLE sales.staffs (
	staff_id INT IDENTITY (1, 1) PRIMARY KEY,
	first_name VARCHAR (50) NOT NULL,
	last_name VARCHAR (50) NOT NULL,
	email VARCHAR (255) NOT NULL UNIQUE,
	phone VARCHAR (25),
	active tinyint NOT NULL,
	store_id INT NOT NULL,
	manager_id INT,
	FOREIGN KEY (store_id) 
        REFERENCES sales.stores (store_id) 
        ON DELETE CASCADE ON UPDATE CASCADE,
	FOREIGN KEY (manager_id) 
        REFERENCES sales.staffs (staff_id) 
        ON DELETE NO ACTION ON UPDATE NO ACTION
);

production.categories

production.categories 表存储了自行车的分类,例如儿童自行车、舒适性自行车和电动自行车。该表的创建语句如下:

CREATE TABLE production.categories (
	category_id INT IDENTITY (1, 1) PRIMARY KEY,
	category_name VARCHAR (255) NOT NULL
);

production.brands

production.brands 表存储了自行车的品牌形线,例如 Electra、Haro 和 Heller。该表的创建语句如下:

CREATE TABLE production.brands (
	brand_id INT IDENTITY (1, 1) PRIMARY KEY,
	brand_name VARCHAR (255) NOT NULL
);

production.products

production.products 表存储了产品的信息,例如名称、品牌、分类、车型年份以及标价。

每个产品属于一个指定的品牌,使用字段 brand_id 表示。因此,一个品牌可能包含零个或多个产品。

每个产品属于一个指定的分类,使用字段 category_id 表示。另外,一个分类可能包含零个或多个产品。

该表的创建语句如下:

CREATE TABLE production.products (
	product_id INT IDENTITY (1, 1) PRIMARY KEY,
	product_name VARCHAR (255) NOT NULL,
	brand_id INT NOT NULL,
	category_id INT NOT NULL,
	model_year SMALLINT NOT NULL,
	list_price DECIMAL (10, 2) NOT NULL,
	FOREIGN KEY (category_id) 
        REFERENCES production.categories (category_id) 
        ON DELETE CASCADE ON UPDATE CASCADE,
	FOREIGN KEY (brand_id) 
        REFERENCES production.brands (brand_id) 
        ON DELETE CASCADE ON UPDATE CASCADE
);

production.stocks

production.stocks 表存储了库存信息,例如某个商店中特定产品的数量。该表的创建语句如下:

CREATE TABLE production.stocks (
	store_id INT,
	product_id INT,
	quantity INT,
	PRIMARY KEY (store_id, product_id),
	FOREIGN KEY (store_id) 
        REFERENCES sales.stores (store_id) 
        ON DELETE CASCADE ON UPDATE CASCADE,
	FOREIGN KEY (product_id) 
        REFERENCES production.products (product_id) 
        ON DELETE CASCADE ON UPDATE CASCADE
);

安装示例数据库

点击该链接下载示例数据库的安装脚本。下载完成后解压 SQL-Server-Sample-Database.zip 文件,目录中包含三个 SQL 脚本:

  • BikeStores Sample Database - create objects.sql,这是用于创建数据库对象(模式和表)的脚本文件。
  • BikeStores Sample Database - load data.sql,这是插入示例数据的脚本文件。
  • BikeStores Sample Database - drop all objects.sql,这是删除模式和表的文件,删除后可以再次创建这些对象。

创建示例数据库

使用 SSMS 工具连接到服务器,在左侧“对象资源管理器”中右键点击“数据库”节点,选择“新建数据库(N)…”菜单。


在“数据库名称”后输入 BikeStores,点击“确定”按钮创建数据库。创建完成后,左侧“数据库”节点下将会出现一个新的数据库 BikeStores。

创建示例表

点击“文件”菜单,选择“打开”->“文件"菜单,查找到“BikeStores Sample Database – create objects.sql”文件后点击“打开”按钮导入该文件,然后点击“执行(X)”按钮允许该脚本创建模式和表。


左侧 BikeStores 数据库下可以看到已经创建的模式和数据表。

装载数据

使用相同的方法导入“BikeStores Sample Database – load data.sql”文件,点击“执行(X)”按钮允许脚本插入数据。


至此,我们已经完成了示例数据库和表的创建,以及示例数据的导入。接下来就可以正式开始学习 SQL 语句了。

更多推荐

《Microsoft SQL Server入门教程》第03篇 示例数据库和示例表