配色: 字号:
第03章 SQL的数据定义和完整性约束
2022-12-24 | 阅:  转:  |  分享 
  
第3章 SQL的数据定义和完整性约束Structured Query Language本章要点 SQL概述SQL的发展历史SQL的特点S
QL数据库的体系结构 SQL Server介绍 数据定义 数据库的定义与删除 基本表的定义、修改和删除 索引的建立和删除 SQL的
数据操纵和完整性约束的作用插入数据和完整性约束的作用删除数据和完整性约束的作用修改数据和完整性约束的作用3.1 SQL概述3
.1.1 SQL的发展历史SQL(Structured Query Language)结构化查询语言1974年IBM圣约瑟实验室的
Boyce和Chamberlin为关系数据库管理系统设计的一种查询语言当时称为SEQUEL语言,后简称为SQL首先在IBM 公司的
关系数据库系统System R上实现。1986年被美国国家标准局(ANSI- American Natural Standard
Institute )批准为关系数据库语言的美国标准1987年国际标准化组织(ISO- International Organiz
ation for Standardization )通过这一标准SQL的发展历史(续)有关标准SQL/86:ANSI 和 ISO
的第一个标准,; SQL/89:定义了模式定义、数据操作和事务处理; SQL/92(也称为SQL2):描述了一种增强功能的SQL,
包括模式操作,动态创建和SQL语句动态执行、网络环境支持等增强特性。; SQL/99(也称为SQL3):主要特点在于抽象数据类型的
支持,为新一代对象关系数据库提供了标准。SQL/2003:包含了XML相关内容,自动生成列值(column values); SQ
L/2006:定义了SQL与XML(包含XQuery)的关联应用; 现状大部分DBMS产品都支持SQL,支持程度不同成为操作数据库
的主流语言3.1.2 SQL的特点1. 综合统一可以独立完成数据库生命周期中的全部活动定义关系模式、录入数据以建立数据库、查询、
更新、维护、数据库重构、数据库安全控制等一系列操作要求。集数据查询、数据操纵、数据定义和数据控制功能为一体语言风格统一,每种操作只
需一种操作符。SQL的特点(续)2.以同一种语法结构提供两种使用方式具有交互式(自含式)和嵌入式两种使用方式。交互式SQL用户可直
接键入SQL命令对数据库进行操作一般DBMS都提供联机交互工具适合非计算机专业人员使用 嵌入式SQL能将SQL语句嵌入到高级语言(
宿主语言)使应用程序充分利用SQL访问数据库的能力、宿主语言的过程处理能力适合程序员设计程序时使用 SQL的特点(续)3. 高度
非过程化高度非过程化的语言SQL只要提出“做什么”,无须了解存取路径。存取路径的选择以及SQL的操作过程由系统自动完成。减轻用户负
担,而且有利于提高数据独立性SQL的特点(续)4. 语言简洁、易学易用核心功能只有9个动词,语法简单,接近英语。SQL语言的动词
3.1.3 SQL数据库的体系结构 SQL语言支持关系数据库的三级模式结构SQL的基本概念(续)基本表基本表是模式的基本内容,是
实际存储在数据库中的表,对应一个实际存在的关系。 视图视图是外模式的基本单位 从一个或几个基本表导出的表数据库中只存放视图的定义而
不存放视图对应的数据视图是一个虚表存储文件存储文件 是内模式的基本单位 每个存储文件与外部存储器上一个物理文件对应。 物理结构是任
意的,对用户透明SQL的基本概念(续)基本表和存储文件的关系一个基本表对应一个或多个存储文件一个存储文件可以存放在一个或多个基本表
一个基本表可以有若干个索引,索引同样存放在存储文件中。 3.2 SQL Server介绍3.2.1 SQL Server的
发展历史最初是由Microsoft、Sybase 和Ashton-Tate三家公司共同开发的1988年,移植到OS/2上1992年
,移植到了Windows?NT平台上1993年,SQL Server 4.21995年,发布了SQL Server 6.01996
年,推出了SQL Server 6.51998年,发布 SQL Server 7.02000年,发布了第一个企业级数据库系统——S
QL Server 20002005年,发布了新一代数据库产品——SQL Server 20052008年,SQL Server
2008正式发布2012年,正式发布SQL Server 2012最新的版本为2014和即将发布的20163.2.2 Trans
act-SQL(T-SQL)1.数据类型3.3 数据定义数据定义语句 SQL语言的数据定义功能包括对数据库、基本表、视图、索
引等数据库对象的创建和删除。表3.8 SQL的数据定义语句 3.3.1 数据库的定义与删除一个SQL数据库由数据库名和数据库拥有
者的用户名或账号来确定,并包含数据库中每一个数据对象(基本表、视图、索引等)的定义。定义一个SQL数据库,就是定义一个存储空间。1
.数据库的定义语法CREATE DATABASE <数据库名> <其他参数>【例3.1】下面语句定义了一个SQL数据库。CREAT
E DATABASE SaleProduct2.数据库的删除语法DROP DATABASE <数据库名> <其他参数> 【例3.
2】删除SQL数据库SaleProduct。DROP DATABASE SaleProduct注意如果数据库当前正在使用,则无法删
除该数据库3.3.2 基本表的定义、删除与修改1. 基本表的定义语法CREATE TABLE <基本表名> (<列名1>
<列数据类型> [列完整性约束] [,<列名2> <列数据类型> [列完整性约束] …] [,表级完
整性约束])说明:其中,“<>”中的内容是必选项,“[ ]”中的内容是可选项。同一数据库中基本表名不重复同一基本表中列名不能重复
【例3.3】常用完整性约束 NULL |NOT NULL:该列值可以为空,或者不能为空。 UNIQUE:唯一性约束,说明该列取值
必须唯一。 PRIMARY KEY:主码约束,说明该列为基本表的主码。 FOREIGN KEY:外码约束,说明表之间的参照关系。
CHECK:域完整性约束,说明该列的取值需要满足的约束条件。 DEFAULT:默认值设置,表示该列在未定义时的默认取值。可用如下语
句创建客户表Customer。CREATE TABLE Customer( custID varchar(5) PRIMARY
KEY, custName varchar(20) NOT NULL UNIQUE, custCity varchar(10)
, custPhone varchar(13) ) 【例3.3】(续)也可为约束命名:CREATE TABLE Customer
( custID varchar(5) constraint PK_Customer PRIMARY KEY, custName
varchar(20) NOT NULL constraint UQ_Customer UNIQUE, custCity varc
har(10), custPhone varchar(13) ) 【例3.4】可用如下语句创建商品表Product。
CREATE TABLE Product( pdID varchar(5) constraint PK_Product PRIM
ARY KEY, pdName varchar(20) NOT NULL, pdSpec varchar(10), pdModel
varchar(10), pdSupplier varchar(20) NOT NULL, pdPrice numeric(10
, 2) DEFAULT 0 CHECK (pdPrice>=0), pdStockSize int DEFAULT 0 CHE
CK (pdStockSize>=0) )【例3.4】(续)Check约束也可以在定义基本表时定义成表级约束: CR
EATE TABLE Product( pdID varchar(5) constraint PK_Product PRIMARY
KEY, pdName varchar(20) NOT NULL, pdSpec varchar(10), pdModel va
rchar(10), pdSupplier varchar(20) NOT NULL, pdPrice numeric(10, 2
) DEFAULT 0, pdStockSize int DEFAULT 0 , CHECK (pdPr
ice>=0) , CHECK (pdStockSize>=0) )【例3.5】可用如下语句创建订单表
Orders。 CREATE TABLE Orders( orderID varchar(16) PRIMARY KE
Y, orderDate date NOT NULL, custID varchar(5) NOT NULL FOREIGN
KEY REFERENCES Customer(custID) ON DELETE cascade ON UPDA
TE cascade, orderAddress varchar(40) NOT NULL, orderAmount numeri
c(10, 2) NOT NULL)外码除了级联CASCADE之外,还可以选择如下处理方式。 NO ACTION:说明禁止删除或
更新被参照记录,这也是默认的处理方式。SET NULL:说明将参照记录的对应属性列值设置为空值NULL。SET DEFAULT:说
明将参照记录的对应属性列值设置为默认值。【例3.5】(续)外码约束还可以定义成表级约束: CREATE TABLE O
rders( orderID varchar(16) PRIMARY KEY, orderDate date NOT NULL,
custID varchar(5) NOT NULL , orderAddress varchar(40) NOT NULL, o
rderAmount numeric(10, 2) NOT NULL , FOREIGN KEY (cu
stID) REFERENCES Customer(custID) ON DELETE cascade ON UPD
ATE cascade)【例3.6】可用如下语句创建订单明细表OrderDetail。 CREATE TABLE Or
derDetail( orderID varchar(16) NOT NULL, pdID varchar(5) NOT NULL
, pdSellPrice numeric(10, 2) NOT NULL, quantity int NOT NULL,
PRIMARY KEY (orderID,pdID), FOREIGN KEY (orderID) REFERENCES
Orders (orderID), FOREIGN KEY (pdID) REFERENCES Product (pdID)
ON UPDATE cascade)2.基本表的修改一般格式:ALTER TABLE <表名>[ALTER COLUMN <列
名> <列参数> [,…]][ADD [ <新列名> <列数据类型> [列完整性约束] [,…]] | [新的完整性
约束][,…]][DROP [CONSTRAINT <完整性约束>][,…] |[COLUMN <列名>] [,…]]
【例3.7】将Product表中的属性列pdName的数据类型改为varchar(30)。ALTER TABLE Product
ALTER COLUMN pdName varchar(30)更改某些数据类型可能导致相关数据自动更改。【例3.8】将Prod
uct表中的属性列pdName的数据类型改为varchar(2)。ALTER TABLE Product ALTER COLU
MN pdName varchar(2)语句操作就会中止原因在于“将截断字符串或二进制数据”【例3.9】在Product表中增加一
个列:pdMemo(备注),数据类型为varchar(100)。ALTER TABLE Product ADD pdMemo
varchar(100)【例3.10】在Customer表中增加默认值约束:custCity(所在城市),其默认值为“北京”。AL
TER TABLE Customer ADD CONSTRAINT DF_custCity
DEFAULT ''北京'' for custCity【例3.11】删除Customer表中的完整性约束DF_custCit
y。ALTER TABLE Customer DROP CONSTRAINT DF_custCity 3.基本表的删除基本格式
为:DROP TABLE <基本表名1>[,……]说明只有在没有视图或约束引用该基本表时,才能删除【例3.12】 删除OrderD
etail表。DROP TABLE OrderDetail3.3.3 索引的建立和删除 建立索引的目的加快查询速度为表设置索引要
付出代价:增加了数据库的存储空间在插入和修改数据时要花费较多的时间索引分类聚集索引是指表中行的物理顺序与键值的逻辑(索引)顺序相同
一个表只能包含一个聚集索引 非聚集索引1. 建立索引的原则 在哪些列上可以创建索引 ?在经常需要搜索的列上,可以加快搜索的速度;
在作为主码的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外码,可以加快连接的速度;在经常
需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查
询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 1. 建立索引的原则(
续) 在哪些列上不能创建索引 ? 对于那些在查询中很少使用或者参考的列不应该创建索引。 对于那些只有很少数据值的列也不应该增加索引
。 对于那些定义为text, image和bit数据类型的列不应该增加索引。 当修改性能远远大于检索性能时,不应该创建索引。 2.
创建索引 语法格式:CREATE [UNIQUE] [CLUSTERED] INDEX <索引名> ON <
表名> (<列名>[<次序>][,<列名>[<次序>]]…)说明:UNIQUE:规定索引的每一个索引值只对应于表中唯一的记录CLU
STER:聚簇索引,<次序>:可选ASC(升序)或DESC(降序)。若不指定,默认为升序。索引的排列方式:先以第一个列名值排序;该
列值相同的记录,则按下一列名排序。【例3.13】 在Customer表的属性列custPhone上创建一个唯一索引。CREATE
UNIQUE INDEX idx_uq_custPhone on Customer(custPhone)唯一值索引对于已含重复
值的属性列不能建UNIQUE索引对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当
于增加了一个UNIQUE约束注意索引建立以后,系统在存取数据时会自动选择合适的索引作为存取路径,用户不必也不能显式地选择索引。3.
删除索引 一般格式:DROP INDEX <索引名> ON <基本表名>注意不适用于通过定义 PRIMARY KEY 或 UNI
QUE约束创建的索引。若要删除该约束和相应的索引,可使用带有 DROP CONSTRAINT 子句的 ALTER TABLE。【例
3.14】 删除Customer表的索引idx_uq_custPhone。DROP INDEX idx_uq_custPhone
ON Customer3.4 SQL的数据操纵和完整性约束的作用3.4.1 插入数据和完整性约束的作用插入单个元组的INSER
T的语句格式为:INSERT INTO <基本表名> [(<列名1>,<列名2>,…,<列名n>)] VALUES
(<列值1>,<列值2>,…,<列值n>)说明:<基本表名>指定要插入新元组的表的名字新元组的<列名1>,<列名2>,……,<列名
n>其值分别对应为<列值1>,<列值2>,……,<列值n>,其他列值为空。 若列名序列省略,则表示在VALUES后的元组值中提供插
入元组的每个分量的值,分量的顺序和关系模式中列名的顺序一致。 【例3.15】 向客户表中插入一个客户记录(''907'',''林巍'',''
北京'',''17705678942'')。INSERT INTO Customer VALUES (''907'',''林巍''
,''北京'',''17705678942'')说明:列名序列省略,则表示在VALUES后的元组值中提供插入元组的每个分量的值,分量的顺序
和关系模式中列名的顺序一致。 【例3.16】 向客户表中插入一个客户记录(''905'',''王力'',''大连'',''15903541236
'')。INSERT INTO Customer VALUES (''905'',''王力'',''大连'',''15903541236'')运行结
果:操作失败分析原因:违反了 PRIMARY KEY 约束【例3.17】 【例3.17】 向客户表中插入一个客户记录,客户编号为“
904”,客户名称为“张松林”。INSERT INTO Customer (custID,custName) VALUES (
''904'',''张松林'')运行结果:操作失败分析原因:违反了UNIQUE约束【例3.18】 在订单明细表OrderDetail中插入
一个订单明细记录(''D201508201002006'',''11205'', 47,2)。INSERT INTO OrderDetai
l VALUES(''D201508201002006'', ''11205'',47,2)运行结果:操作失败分析原因:违反了FOR
EIGN KEY 约束3.4.2删除数据和完整性约束的作用用来删除表中的一行或多行记录语法格式:DELETE FROM <表名>
[WHERE<条件>]【例3.19】 删除Customer中客户名称为“张小宁”的客户的基本信息。DELETE FROM Cust
omer WHERE custName= ''张小宁''【例3.20】 删除Product中商品编号为“11206”的商品信息。DE
LETE FROM Product WHERE pdID= ''11206''运行结果:操作失败违反参照引用关系3.4.3 修改数据
和完整性约束的作用用来对表中一行或多行中的某些值进行修改语法格式: UPDATE <表名> SET <列名>=<表达式
>[, <列名>=<表达式>] [WHERE<条件>]【例3.21】 将客户名称为“里奇”的所在城市改为“深圳”。UPDAT
E Customer SET custCity =''深圳'' WHERE custName=''里奇''【例3.22】 将商品表中所
有商品的价格调高10%。UPDATE Product SET pdPrice= pdPrice 1.1【例3.23】 将客户表
中客户编号为“902”的客户编号改为“910”。UPDATE Customer SET custID = ''910'' WHER
E custID = ''902''运行结果:Customer中客户编号为“902”的客户编号成功改为“910”。同时订单表Order
s中所有引用“902”的元组的custID也同时更新为“910”。【例3.24】 将订单表中订单编号为“D201007010916005”的订单编号改为“D201007010916009”。UPDATE Orders SET orderID = ''D201007010916009'' WHERE orderID = ''D201007010916005 ''运行结果:操作失败。分析原因:违反参照引用关系。【例3.25】 将商品表中商品编号为“11205”的商品编号改为“11210”。UPDATE Product SET pdID = ''11210'' WHERE pdID = ''11205''运行结果:操作失败。分析原因:违反了PRIMARY KEY约束更新操作与数据库的一致性更新语句一次只能操作一个表。这可能会带来一些问题 参照引用关系:级联更新更新操作与数据库的一致性更新语句一次只能操作一个表。这可能会带来一些问题 事务3.5 小结 需要了解SQL语言的发展的过程需要掌握掌握SQL语言的特点关系数据库系统为数据库应用系统的开发提供良好环境,减轻了用户负担,提高用户生产率的原因。小结需要举一反三熟练正确的使用SQL语言完成对数据库的操作操作失败时查找原因解难: 多练习 在RDBMS产品上进行实际运行,检查你的答案,你查询的结果是否正确。 通过大量练习才能真正达到举一反三的熟练程度。
献花(0)
+1
(本文系籽油荃面原创)