本专栏目录
第1课 SQL入门之了解SQL
第2课 SQL入门之检索数据
第3课 SQL入门之排序检索数据
第4课 SQL入门之过滤数据
第5课 SQL入门之高级数据过滤
第6课 SQL入门之用通配符进行过滤
第7课 SQL入门之创建计算字段
第8课 SQL入门之使用数据处理函数
第9课 SQL入门之汇总数据
第10课 SQL入门之分组数据
第11课 SQL入门之使用子查询
第12课 SQL入门之联结表
第13课 SQL入门之创建高级联结
第14课 SQL入门之组合查询
第15课 SQL入门之插入数据
第16课 SQL入门之更新和删除数据
第17课 SQL入门之创建和操纵表
第18课 SQL入门之使用视图
第19课 SQL入门之使用存储过程
第20课 SQL入门之管理事务处理
第21课 SQL入门之使用游标
第22课 SQL入门之高级SQL特性
附录A SQL入门之SQL样例表脚本
附录B SQL入门之SQL流行的应用程序
附录C SQL入门之SQL语句的语法
附录D SQL入门之SQL数据类型
附录E SQL入门之SQL保留字
前言
编写SQL语句需要良好地理解基本数据库设计。如果不知道什么信息存放在什么表中,表与表之间如何互相关联,行中数据如何分解,那么要编写高效的SQL是不可能的。
强烈建议读者实际练习本专栏的每个例子。所有课都共同使用了一组数据文件。为帮助你更好地理解这些例子、学好各课内容,本附录描述了所用的表、表之间的关系以及如何创建(或获得)它们。
A.1 样例表
本专栏中所用的表是一个假想玩具经销商使用的订单录入系统的组成部分。这些表用来完成以下几项任务:
- 管理供应商;
- 管理产品目录;
- 管理顾客列表;
- 录入顾客订单。
完成它们需要5个表(它们作为一个关系数据库设计的组成部分紧密关联)。以下各节给出每个表的描述。
说明:简化的例子
这里使用的表不完整,现实世界中的订单录入系统还会记录这里所没有的大量数据(如工资和记账信息、发货追踪信息等)。不过,这些表确实示范了现实世界中你将遇到的各种数据的组织和关系。读者可以将这些技术用于自己的数据库。
表的描述
下面介绍5个表及每个表内的列名。
- Vendors表
Vendors表存储销售产品的供应商。每个供应商在这个表中有一个记录,供应商ID列(vend_id)用于进行产品与供应商的匹配。
表A-1 Vendors表的列
列 | 说 明 |
---|---|
vend_id | 唯一的供应商ID |
vend_name | 供应商名 |
vend_address | 供应商的地址 |
vend_city | 供应商所在城市 |
vend_state | 供应商所在州 |
vend_zip | 供应商地址邮政编码 |
vend_country | 供应商所在国家 |
- 所有表都应该有主键。这个表应该用vend_id作为其主键。
- Products表
Products表包含产品目录,每行一个产品。每个产品有唯一的ID(prod_id列),并且借助vend_id(供应商的唯一ID)与供应商相关联。
表A-2 Products表的列
列 | 说 明 |
---|---|
prod_id | 唯一的产品ID |
vend_id | 产品供应商ID(关联到Vendors表的vend_id) |
prod_name | 产品名 |
prod_price | 产品价格 |
prod_desc | 产品描述 |
- 所有表都应该有主键。这个表应该用prod_id作为其主键。
- 为实施引用完整性,应该在vend_id上定义一个外键,关联到Vendors的vend_id列。
- Customers表
Customers表存储所有顾客信息。每个顾客有唯一的ID(cust_id列)。
表A-3 Customers表的列
列 | 说 明 |
---|---|
cust_id | 唯一的顾客ID |
cust_name | 顾客名 |
cust_address | 顾客的地址 |
cust_city | 顾客所在城市 |
cust_state | 顾客所在州 |
cust_zip | 顾客地址邮政编码 |
cust_country | 顾客所在国家 |
cust_contact | 顾客的联系名 |
cust_email | 顾客的电子邮件地址 |
- 所有表都应该有主键。这个表应该用cust_id作为它的主键。
- Orders表
Orders表存储顾客订单(不是订单细节)。每个订单唯一编号(order_num列)。Orders表按cust_id列(关联到Customers表的顾客唯一ID)关联到相应的顾客。
表A-4 Orders表的列
列 | 说 明 |
---|---|
order_num | 唯一的订单号 |
order_date | 订单日期 |
cust_id | 订单顾客ID(关联到Customers表的cust_id) |
-
所有表都应该有主键。这个表应该用order_num作为其主键。
-
为实施引用完整性,应该在cust_id上定义一个外键,关联到Customers的cust_id列。
-
OrderItems表
OrderItems表存储每个订单中的实际物品,每个订单的每个物品一行。对于Orders表的每一行,在OrderItems表中有一行或多行。每个订单物品由
订单号加订单物品(第一个物品、第二个物品等)唯一标识。订单物品用order_num列(关联到Orders表中订单的唯一ID)与其相应的订单相关
联。此外,每个订单物品包含该物品的产品ID(把物品关联到Products表)。
表A-5 OrderItems表的列
列 | 说 明 |
---|---|
order_num | 订单号(关联到Orders表的order_num) |
order_item | 订单物品号(订单内的顺序) |
prod_id | 产品ID(关联到Products表的prod_id) |
quantity | 物品数量 |
item_price | 物品价格 |
- 所有表都应该有主键。这个表应该用order_num和order_item作为其主键。
- 为实施引用完整性,应该在order_num和prod_id上定义外键,关联order_num到Orders的order_num列,关联prod_id到Products的prod_id列。数据库管理员通常使用关系图来说明数据库表的关联方式。要记住,正如上面表描述提到的,外键定义了这些关系。图A-1是本附录描述的五个表的关系图。
A.2 获得样例表
学习各个例子,需要一组填充了数据的表。所需要获得和运行的东西都可以从以下小节找到。
A.2.1 下载可供使用的数据文件
可从以下链接下载一个填充了数据的如下格式的文件:
- Apache Open Office Base database
- Microsoft Access 2000, 2003 database
- Microsoft Access 2007, 2010, 2013 database
- IBM DB2 SQL scripts
- Microsoft SQL Server (and SQL Server Express) SQL scripts
- MySQL (and MariaDB) SQL scripts
- Oracle SQL scripts
- Oracle Express SQL scripts
- PostgreSQL SQL scripts
- SAS scripts (tested with SAS 9.2) created by Peter Lumb
- SQLite database
如果使用这些文件,不需要执行任何SQL创建和填充脚本。
A.2.2 下载DBMS SQL脚本
大多数DBMS以不自己完成文件分布的格式存储数据(如Access、Open Office Base和SQLite那样)。对于这些DBMS,可以从上述链接下载SQL脚本。对于每个DBMS,有两个文件:
- create.text包含创建5个数据库表(包括定义所有主键和外键约束)的SQL语句。
- populate.txt包含用来填充这些表的SQL INSERT语句。
这些文件中的SQL语句依赖于具体的DBMS,因此应该执行适合于你的DBMS的那个。这些脚本为方便读者而提供,作者对执行它们万一引起的问题不承担任何责任。
附录B提供了在几个流行环境中执行脚本的说明。
说明:创建,然后填充
必须在执行表填充脚本前执行表创建脚本。应该检查这些脚本返回的错误。如果创建脚本失败,则应该在继续表填充前解决存在的问题。
说明:具体DBMS的设置指令
用于设置DBMS的具体步骤依使用的DBMS有很大不同。从本专栏下载脚本或数据库时,你会看到README文件,它提供了针对特定DBMS的具体设置和安装步骤。
上一篇:第1课 SQL入门之了解SQL
下一篇:附录B SQL入门之SQL流行的应用程序