第1章 数据库系统概论
(一)数据管理技术的发展
1.
程序与数据是一个整体,一个程序中的数据无法被其他程序使用,因此程序与程序之间存在大量的重复数据。
特点:
? 人工重复输入数据,数据不保存;
? 无软件管理,由应用程序直接管理;
? 程序之间不能共享数据;
? 无独立性。
2.
20世纪50年代后期至60年代后期,计算机外存储器有了磁鼓和磁盘等直接存取设备;软件有了操作系统和文件系统;程序通过文件系统访问数据。 特点:
? 多个程序共享数据;
? 易于长期保存数据;
? 数据共享差、冗余(重复)度较大;
? 程序对数据依赖性较强;
3.数据库是在数据库管理系统的集中控制之下,按一定的组织方式存储起来的、相互关联的数据集合。
特点:
? ? ? ? 数据冗余度小; (二)数据库与数据库系统
1. 数据库(DB-Data Base)
DB是存储在计算机系统中,有组织、结构化的关联数据集合;以文件方式存储。 常见数据库文件扩展名:
MDF-SQL Server; MDB-Access; DBC-VFP(Visual FoxPro)
2. 数据库管理系统(Database Management System)
DBMS行和维护,有效地组织和存取数据、获取和管理数据并保证数据的安全性和完整性。 它是数据库系统的核心。
功能:
? ? ? ?
3. 数据库系统(Database System)
DBS指在计算机系统中引入数据库后构成的系统,一般由系统、应用系统、数据库管理员和用户构成。
它是把有关计算机硬件、软件、数据和人员组合起来为用户提供信息服务的系统。
数据库系统是由计算机系统、数据库及其描述机构、数据库管理系统和有关人员组成的具有高度组织性的总体。
优点:
? ?
? ? 4. 数据库管理员
DBA:负责数据库的规划、设计、协调、维护和管理等工作。
(三)数据库的三级模式结构
为了有效地组织、管理数据,提高数据库的逻辑独立性和物理独立性,人们为数据库设计了一个严谨的体系结构,数据库领域公认的标准结构是三级模式结构,它包括外模式、模式和内模式 。
1. 模式:
是整个数据库当中所有实体和关系的集合,是所有用户的公共数据视图,与应用无关。每个数据库中只有一个模式,也称概念模式或逻辑模式。对应于应用程序员的概念视图。
2. 外模式:
是模式的一个子集,或是模式的一个局部表现形态。对应于用户的外部视图。
3. 内模式:
也叫存储模式,是对模式的数据及数据的定义内容进行组织、存储的表达形式,在什么地方存储、如何存储是内模式要解决的内容。对应于系统程序员的内部视图。
(四)数据模型
1. 数据模型的组成要素
? )
? (对数据库中各种对象(型)的实例(值)允许执行的操作的集合,
属于系统动态特性。)
? (是一种完整性规则的集合,保证数据的正确、有效、相容。)
2. 实体
是客观事物的真实反映,并可相互区别的事物。可以是实际存在的对象、抽象概念或事件。
(1)属性:将事物特性称为实体属性。
(2)码:唯一标识实体的属性集合。
(3)域:属性的取值范围。
(4)实体型和实体值
实体型:就是实体的结构描述,通常是实体名和属性名的集合;具有相同属性的实体,有相同的实体型。
实体值:是实体的罗列,是属性值的集合。
(5)属性型和属性值
属性型:就是属性名及其取值类型。
属性值:就是属性在其值域中所取的具体值。
(6)实体集:性质相同的同类实体的集合称为实体集。
3. 实体间的联系
? ? ? 4. 概念模型 概念模型是反映实体之间联系的模型。
E-R模型:
? 实体:用矩形框表示,框内写入实体名。
? 属性:用椭圆形表示,属性的名称记入椭圆形内。
?
E-R图设计步骤:
(1)针对特定用户的应用,确定实体、属性和实体间的联系,画出用户视图的局部E-R图。
(2)综合各个用户的局部E-R图,产生反映数据库整体概念的总体E-R图。 ? 例1
某医院住院部用计算机管理需要如下信息: 科室:科室名,科地址,科电话,医生姓名 病房:病房号,床位号,所属科室名 医生:姓名,职称,所属科室名,年龄,工作证号 病人:病历号,姓名,性别,诊断,主管医生,病房号 若有如下语义:一个科室有多个病房、多个医生,一个病房只能属于一个 科室,一个医生只属于一个科室,但可负责多个病人的诊治,一个病人的主管 医生只有一个。
完成如下设计:
(1)设计该住院部计算机管理系统的E-R图;
(2)将该E-R图转换为关系模型;
(3)指出转换结果中每个关系模式的候选码。
5. 数据模型
概念模型只是将现实世界的客观对象抽象为某种信息结构,这种信息结构并不依赖于具体的计算机系统,而对应于数据世界的模型则由数据模型描述,数据模型是数据库中实体之间联系的抽象描述即数据结构。
(1) 层次数据模:通过树形结构表示实体及联系。适合表示实体的一对多联系。
(2) 网状数据模型:通过网状结构表示实体及联系。适合表示实体的多对多联系。
(3) 关系数据模型:关系模型与层次模型和网状模型相比有着本质的差别,它是用二维表格来表示实体及其相互之间的联系。
一个关系就是没有重复行和重复列的二维表,二维表的每一行在关系中称为元组,每一列在关系中称为属性。学生关系的每一行代表一个学生的记录,每一列代表学生记录的一个字段。属性个数(n)称为关系的元。
(五)数据库新技术
1. 分布式数据库
是地理上分布在计算机网络的不同结点,逻辑上属于同一系统的数据库系统。 主要特点:
? 数据是分布的
? 数据是逻辑相关的
? 结点的自治性
2. 多媒体数据库
能存储和管理多种媒体的数据库称为多媒体数据库。
对数据库管理系统的功能要求:
? 要求DBMS能方便地描述和处理具有内部层次结构的数据。
? 要求DBMS提供由用户定义的新的数据类型和相应操作的功能。
? 要求DBMS能够提供更灵活的定义和修改模式的能力。
? 要求DBMS提供对多媒体信息管理中特殊的事务管理与版本控制能力。
3. 工程数据库
所谓工程数据库是指在工程设计中,主要是CAD/CAM中所用到的数据库。由于在工程中的环境和要求不同,工程数据库与传统的信息管理中用到的数据库有着很大的区别。
4.
面向对象数据库系统(Object-Oriented Database System,OODBS)是将面向对象的模型、方法和机制,与先进的数据库技术有机地结合而形成的新型数据库系统。
它从关系模型中脱离出来,强调在数据库框架中发展类型、数据抽象、继承和持久性。
5.
数据仓库、联机分析处理( OLAP :online analytical processing)和数据挖掘是作为三种独立的信息处理技术出现的。数据仓库用于数据的存储和组织,OLAP集中于数据的分析,数据挖掘则致力于知识的自动发现。它们都可以分别应用到信息系统的设计和实现中,以提高相应部分的处理能力。
人们对数据的处理需求可以分为两种类型,操作型处理(OP)和分析型处理(AP),传统的数据库主要是面向OP,注重数据的计算、记录的插入、删除、与修改,以及简单的查询和统计。
联机事务处理(OLTP)
Moore定理: 计算处理能力每十八个月翻一倍。
Gilder定理: 全球通讯系统的带宽每12个月翻3倍。
Shugart定理: 磁存储器件的价格每18个月下降一半。
第2章 关系数据库基本原理
(一)关系模型的基本概念
1.关系
一个关系就是一张二维表,通常将一个没有重复行、重复列的二维表看成一个关系,每个关系都有一个关系名。系数据库是二维表的集合,这种表的列应满足原子特征,即列是不可分解的。
2.元组
二维表的每一行在关系中称为元组(Tuple)。一行描述了现实世界中的一个实体,或者描述了不同实体间的一种联系。
3.属性
二维表的每一列在关系中称为属性(Attribute),每个属性都有一个属性名,各个属性的取值称为属性值。每个属性有一定的取值范围,称为值域。
4.关键字
关系中能惟一区分、确定不同元组的属性或属性组合,称为该关系的一个关键字。关键字又称为键或码(Key)。
5.外部关键字
如果关系中某个属性或属性组合并非关键字,但却是另一个关系的主关键字,则称此属性或属性组合为本关系的外部关键字或外键(Foreign Key)。在关系数据库中,用外部关键字表示两个表间的联系。
(二)关系代数的基本原理
1. 并(union)
R ∪ S={t|t ∈Rν t ∈S}
R、S为同类关系(关系的度相同,且相应属性都来自相同的域),并的结果与R、S也是同类关系
2. 交(intersection)
R ∩ S ={t|t ∈RΛ t ∈S}
R、S为同类关系,交的结果与R、S也是同类关系
3. 差(difference)
R - S={t|t ∈RΛ ┐ t ∈S}= {t|t ∈RΛ t ∈S}
R、S为同类关系,差的结果与R、S也是同类关系
4. 广义笛卡尔积(extended cartesian product)
R × S ={trts|tr ∈RΛ ts ∈S}
R、S具有相同属性组,结果不为同类关系
5. 选择(selection)
对关系而言,选择是从行的角度取关系的子集
公式表示:R[F]或σF(R)={t|t∈R ΛF(t)=True}
公式的含义:R中使布尔函数为真的元组集,F为布尔函数,即限定条件
6. 投影(projection)
对关系而言,投影是从列的角度取关系的子集
公式表示:R[A]或∏A(R)={t[A]|t∈R}
公式的含义:包含A中各属性组的元组集
7. 连接(join)
公式表示:R ∞F S或R[F]S={trts|tr∈R Λts ∈S ΛF(tr,ts)=True}
或表示为:R ∞A θB S或R[F]S={trts|tr∈R Λts ∈S Λtr[A]θts[B])=True} 公式的含义:从两个关系的笛卡尔积中选取属性间满足一定条件的元组
(1)等值连接
等值连接中的θ即为“=”
从某种意义上说,连接与投影是相反的操作,即投影是减少属性,而连接是增加属性
(2)自然连接
自然连接是特殊的等值连接,它要求A和B是相同的属性组,且结果中去掉了相同的属性
公式表示:R*S={trts[Z]|Z=XAYΛtr ∈R Λts ∈S }
其中R(X,A),S(Y,A),A为公共属性
8. 除(division)
公式表示:R/S={tr[X]|tr∈R ΛYx∏Y(S) }
其中Yx为x在R中的象集,即Yx为属性X取值x时,相应的Y值集合
含义:R/S是关系R在X上的分量x的集合,且这些分量x在R中的象集应包含集合S在Y上的投影S[Y]
(三)关系模式的分解
1. 关系数据理论的目标就是通过规范化的设计解决或缓解以下问题:
? ? ? ? 2. 函数依赖的基本概念
(1) 定义1 对于R中属性X的任何一个具体值,Y仅有唯一的具体值与之对应,则称R的属性Y函数依赖于属性X。记为:X→Y,X称为决定因素。
设R(U)是一关系模式,U是R的属性集合,X和Y是U的子集,对于R(U)的任何一个可能的关系r,若果r中不存在两个元组,它们在X上的属性值相同,而在Y上的属性值不同,则称X函数决定Y,或Y函数依赖于X,记为:X→Y。
(2) 在关系模式R(U)中,对于U的子集X和Y,如果X→Y成立,但Y X,
则称X→Y 是非平凡函数依赖,若Y X,则称X→Y 是平凡函数依赖。 (3) 定义2 在R中,如果属性集Y函数依赖于属性集X,且不函数依赖于X的任意真子集,则称YX,记做: X Y, 否则,称YX,记做:X Y 。
(3) 定义3 设X,Y,Z是关系模式R的不同属性集,若X Y (并且Y ∈X) ,Y→Z,称X传递决定Z,或称ZX,记做X Z。
3. 码
(1)超级码
如果K →U,则K是关系模式R(U)的超级码
(2)候选码
K是关系模式R(U)的候选码当且仅当K →U且不存在α包含于K,使α →U成立即K U
(3)主码
若关系模式R有多个候选码,则选定其中一个作为主码
4. 范式
目前主要有六种范式,分别是第一范式(1NF)、第二范式(2NF)、第三范式(1NF)、第四范式(1NF)、第五范式(5NF)和BC范式(BCNF)
若R为第n范式,记做R ∈nNF 对关系模式的规范化要求分成从低到高不同的层次,分别称为第1范式、第2范式、第3范式、Boyce-Codd范式、第4范式和第5范式。
如何判断属于何种范式:
(1)当关系模式R的所有属性都不能分解为更基本的数据单位时,称R是满足第1范式的,则R ∈ 1NF。
第1范式要求一行中的每一列仅有唯一的值并且具有原子性。
(2)如果关系模式R满足第1范式,并且R的所有非主属性都完全函数依赖于R的码,称R满足第2范式,简记为R ∈ 2NF。
(3)如果R ∈ 2NF,且它的任何一个非主属性都不传递依赖于R的任意一个候选关键字,称R满足第3范式,简记为R ∈ 3NF 。
第三范式要求非主键列互不依赖,消除传递依赖。如果非主属性之间存在了函数依赖,就会存在传递依赖,这样就不满足第三范式。
定理 若关系模式R符合3NF条件,则R一定符合2NF条件。
(4)设R是一个关系模式,若R的每一个函数依赖关系的左部都是R的一个候选关键字,称R满足Boyce-Codd范式,简记为BCNF。即每个属性,包括主属性或非主属性,都完全依赖于候选键,并且不存在传递依赖情况。
可以证明,BCNF是比3NF更强的规范(证明略),即符合BCNF条件的关系模式一定符合3NF条件,但反过来却不成立。
(四)E-R模型到关系模型的转化
1.独立实体到关系模型的转化
将每个实体集转换为对应的一个关系模式,实体集的属性就是关系的属性。
2.1:1联系到关系模型的转化
对于一对一的两个实体集,将其中一个实体集的键及联系本身的属性加入到另一个实体中。
3.1:n联系到关系模型的转化
对于一对多的两个实体集,将 “一”方实体集的主键及联系本身的属性加入到“多”方实体集中。
4.m:n联系到关系模型的转化
对于多对多联系的两个实体集,就将联系本身也转换成一个关系模式,这个关系应包括本身的属性和两个实体集的主键。
5.多元联系到关系模型的转化
所谓多元联系,即是说该联系涉及两个以上的实体。
6.自联系到关系模型的转化
自联系指同一个实体类中实体间的联系。 (五)数据库的设计方法
1. 数据库应用系统开发有两个任务,一是数据库的设计,二是应用程序的开发。
2. 数据库设计过程一般包括:
(1)
(2)
(3) DBMS所支持的数据模型,并优化;
(4) 物理设计:选取一个最适合应用环境的物理结构(存取结构、存取方法);
(5) DDL)来严格定义数据库(创建表和表约束),另进行数据库运行后的评价、调整、修改等维护工作。
第5章 SQL Server表的管理
(一)数据类型
1.数值类型
? 整型数据类型
(1) bigint:占8字节的存储空间,存储数据范围为-263~263-1。
(2) int:占4字节的存储空间,存储数据范围为- 231~231-1。
(3) smallint:占2字节的存储空间,存储数据范围为-215~215-1。
(4) tinyint:占1字节的存储空间,存储数据范围为0~255。
? 实型数据类型
(1) decimal[(p[,s])]:小数类型。其中,p为数值总长度,包括小数位数,但不 包括小数点,范围1~38。s为小数位数。默认decimal(18,0)。
(2) numeric[(p[,s])]:与decimal[(p[,s])]等价。
(3) float[(n)]:浮点类型,占8字节的存储空间。
(4) real:浮点类型,占4字节的存储空间。
2.逻辑类型
只能存储0或1。当输入0和1以外的值时,系统自动转换为1。通常存储逻辑量, 表示真与假。
3.字符串类型
(1) char[(n)]:定长字符串类型,长度为n,n范围为1~8000。默认为char(10)。
(2) text:文本类型,实际也是变长字符串类型,存储长度超过char(8000)的字符串,最大长度231-1。实际上,text类型列中仅存储一个指针,数据本身存储在连接表中。 (3) varchar[(n)]:变长字符串类型,即自动删除字符串尾部空格后存储。长度为n,n范围为1~8000。默认为char(50)。
4.二进制类型
(1) binary[(n)]:定长二进制类型,占n+4字节的存储空间,n范围为1~8000。默 认为binary (50)。
(2) varbinary[(n)]:变长二进制类型,占n+4字节的存储空间,n范围为1~8000。 默认为binary (50)。
(3) image:大量二进制类型,实际也是变长二进制类型,通常用于以位字符串形式存储图形,最大长度为231 -1,约2 GB。
5.日期时间类型
(1)datetime:日期时间类型,占8字节的存储空间,范围为1753年1月1日-9999
年12月31日。 (2) smalldatetime:日期时间类型,占4字节的存储空间,范围为19xx年1月 1日-20xx年12月31日。
6.货币类型
(1) money:货币类型,4位小数,占8字节的存储空间。
(2) smallmoney:货币类型,4位小数,占4字节的存储空间。
注:货币类型常量应以美元符号“$”或所定义的金融单位符号作前缀。
(二)表结构的创建(DDL)
1. SQL Server 2000数据完整性约束包括:
(1) 主键完整性约束(primary):保证列值的惟一性,且不允许为NULL。
(2) 惟一完整性约束(unique):保证列值的惟一性。
(3) 外键完整性约束(foreign):保证列值只能取参照表主键或惟一键的值或NULL。
(4) 非空完整性约束(not null):保证列的值非NULL。
(5) 缺省完整性约束(default):指定列的默认值。
(6) 检查完整性约束(check):指定列取值的范围。
2. 创建表
CREATE TABLE [<数据库名>.]<表名>
(<列名> <数据类型> [<列级完整性约束>][,?n] [<表级完整性约束>])
3. 修改表
ALTER TABLE [<数据库名>.]<表名>
{[ALTER COLUMN
<列名> <数据类型> [<列级完整性约束 > ][,?n]]
|ADD <列名> <数据类型> [<列级完整性约束>][,?n]
|DROP COLUMN <列名> [,?n]
}
4. 删除表
DROP TABLE table_name
(三)表数据的管理(DML)
1. INSERT语句
格式一:
INSERT [INTO] <表名>[(<列名表>)] VALUES(<值列表>) 格式二:
INSERT [INTO] <目标表名>[(<列名表>)]
SELECT <列名表> FROM <源表名> WHERE <条件>
2. UPDATE语句
格式一:
UPDATE <表名> SET <列名>=<表达式>[,?]
[WHERE <条件>]
格式二:
UPDATE <目标表名> SET <列名>=<表达式>[,?]
FROM <源表名> [WHERE <条件>]
3. DELETE语句
DELETE [FROM] <表名>
[WHERE <条件>]
第6章 数据查询
(一)SQL的基本概念
1.SQL包含4个部分:
? 数据定义语言DDL(Data Definition Language )
? 数据查询语言DQL(Data Query Language)
? 数据操纵语言DML(Data Manipulation Language)
? 数据控制语言DCL(Data Control Language)
2.SQL 的数据定义功能包括:定义数据库、定义表、定义视图、定义索引。 ? 定义数据库: create database, drop database
? 定义表:create table, drop table ,alter table
? 定义视图:create view, drop view
? 定义索引:create index, drop index
3.Transact-SQL运算符
(1) 算术运算符:+、-、*、/、%
注:null与任何值运算结果为null;+、- 运算可用于datetime型数据。
(2) 字符串运算符:+
(3) 比较运算符:=、>、<、>=、<=、<>、!=、!>、!<
(4) 逻辑运算符:not、and、or、between(指定范围)、like(模糊匹配)、all(所有)、in(包 含于)、any(任意一个)、some(部分)、exists(存在)。
(5) 逻辑常量:ture、false。
(6) 赋值运算符:=
4.Transact-SQL函数
(1) 数学函数
sin(n)(正弦) asin(n)(反正弦) pi()(圆周率) abs(n)(绝对值) exp(n)(指数) log(n)(自然对数) power(n,m)(nm) sqrt(n)(平方根)sign(n)(符号) rand([n])(随机数) round(n,m)(四舍五入)
(2) 字符串函数
substring(s,n1,n2)(取子串) str(n,n1,n2)(数值转换为字符串) left(s,n)(左取子串) right(s,n)(右取子串)
lower(s)(转小写) upper(s)(转大写)
ltrim(s)(删除左空格) rtrim(s)(删除右空格)
space(n)(产生空格) reverse(s)(反转字符串)
len(s)(求串长) charindex(s1,s2)(s1在s2中的起始位置)
(3) 日期时间函数
getdate()、year(d)、month(d)、 day(d)
datepart(datepart,d)(日期的datepart部分, d为日期类型)
dateadd(datepart,n,d) (日期加,即日期d的datepart部分加数值n后的新日期) datediff (datepart,d1,d2) (日期减,即日期d1与d2的datepart部分相差的值)
(4) 类型转换函数
convert(data_type,expression[,style])
cast(expression as data_type)
(二)汇总和排序
1.
2. 分类
group by <列>
注:group by子句可以使用表达式,但不能使用text、image、bit类型数据。
3. 分类后过滤记录
having <条件>
注:having作用于分组,选择满足条件的分组,在group by后执行,可以使用聚 合函数。Where作用于整个基本表,选择满足条件的元组,不能用于选择分组,
不能使用集函数。
4. 排序
order by <列> [desc] (ASC: 升序, 默认 DESC: 降序)
注:如果元组中有空值存在,则在升序时,空值排在结果的最后;在降序时,空值 排在结果的最前。
(三)查询
? 查询是数据库管理的核心操作。
? Select语句的一般格式:
SELECT [ALL|DISTINCT]<目标列表达式>...
FROM <表名或视图名>[,<表名或视图名>] ...
[WHERE <条件表达式>]
[GROUP BY <列名1>[HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]]
? 用于查询的条件表达式使用的运算符
AND其次,OR 最后。可以使用括号来定义优先顺序。
1.单表查询
SELECT [DISTINCT] {*, 目标列表达式 [别名],...}
FROM 表名;
2.嵌套查询
在SQL语言中,一个select-from-where语句称为一个查询块。
一个查询块嵌套在另一个查询块的where子句或having短语中,称为嵌套查询。 嵌套查询使我们可以使用多个简单查询来构造复杂查询。
嵌套分类:
? 带有IN谓词的子查询
?
? 带有ANY或ALL的子查询
? 带有EXISTS谓词的子查询
3.多表查询
又称连接查询,其特点是在查询中使用了连接操作。
(1)用SELECT语句实现连接操作
使用WHERE 短句来说明连接条件。
(2)等值连接与非等值连接
当比较运算符使用‘=’时,称为等值连接;使用其它运算符则称为非等值连接。
(3)自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为自身连接。
例、查询每门课的间接先修课(即先修课的先修课)。
SELECT first.cno,second.cpno
FROM course first,course second
(4)内连接
inner join [on]
(5)外连接
外连接又可以分为左外连接(left outer join)、右外连接(right outer join)、全外连接(full outer join)。
(6)复合条件连接
当WHERE子句中出现多个条件的连接操作时,称为复合条件连接。
4.集合查询
? Select语句的查询结果是元组的集合,可以进行集合操作。
? Union操作符可以将多个查询结果合并成单个结果集,自动去除重复行。 ? 参加Union操作的各结果集必须:①列数相同、②对应项数据类型相同。 ? 标准SQL没有直接提供集合交操作和集合差操作,可以转换为其他方法来实
现。
第7章 索引和视图
(一)索引
1. 创建索引
Createindex<索引名> On <表名>[(<列名>,??)]
2. 查看索引
sp_helpindex <表名>
3. 编辑索引(改名)
sp_rename ‘<原名>’,’<新名>’,[,’<对象类型>’]
4. 删除索引
Drop index <表名.索引名>
(二)视图
视图是从一个或几个基本表中导出的虚拟的表。
1. 创建视图
Create view <视图名>
As
[Select – from – ]
2. 修改视图
Alter view <视图名>
As
[Select – ]
3. 删除视图
Drop view <视图名>
4. 查看视图
sp_helptext <视图名>
5. 重命名
sp_rename <原名>,<新名>,[,<对象类型>]
6. 视图的应用(通过视图添加、修改、删除表数据)与表类似。
第8章 数据完整性
(一)数据完整性有4种类型
?
?
?
? (二)完整性保障
在SQL Server中可以通过各种规则(Rule)、默认(Default)、约束(Constraint)和触发 器(Trigger)等数据库对象来保证数据的完整性。
1.使用规则实施数据完整性
? 规则(Rule)是数据库中对存储在表中列的值或用户定义数据类型的规定和限
制,它指定字段可接受哪些数据值。
? 规则是单独存储的独立的数据库对象。
? 规则和约束可以同时使用,表的列可以有一个规则及多个约束。规则与检查约
束在功能上相似,但在使用上有所区别。
? 检查约束是在CREATE TABLE或ALTER TABLE语句中定义的,嵌入了被定
义的表结构,即删除表的时候检查约束也就随之被删除。
? 而规则需要用CREATE RULE语句定义后才能使用,是独立于表之外的数据
库对象,删除表并不能删除规则,需要用DROP RULE语句才能删除。
? 相比之下,使用在CREATE TABLE或ALTER TABLE语句中定义的检查约束
是更标准的限制列值的方法,但检查约束不能直接作用于用户定义数据类型。
(1)创建规则
CREATE RULE <rule_name>
AS <condition_expression>
(2)查看规则
EXEC sp_helptext <rule_name>
(3)绑定规则
sp_bindrule [@rulename =] 'rule_name',
[@objname =] 'object_name'
[ , [ @futureonly=] 'futureonly' ]
(4)解除规则的绑定
sp_unbindrule [@objname =] 'object_name'
[ , [ @futureonly = ] 'futureonly' ]
(5)删除规则
DROP RULE rule_name [,...n] 注意:在删除一个规则前,必须先将与其绑定的对象解除绑定。
2.使用默认值实施数据完整性
? 默认值(Default)可以帮助处理不包括全部数据表字段的Insert操作。当在插入
记录没有指定字段的值时,将用默认值代替相应字段的值。
? 默认值对象可以用于多个列或用户定义数据类型。表的一列或一个用户定义数
据类型只能与一个默认值相绑定。
(1) 创建默认值
CREATE DEFAULT <default_name>
AS <constant_expression>
(2) 查看默认值
EXEC sp_helptext <default_name>
(3) 绑定默认值
sp_bindefault [@defname =] 'default',
[@objname =] 'object_name'
[ , [ @futureonly=] 'futureonly' ]
(4) 解除默认值的绑定
sp_unbindefault [@objname =] 'object_name' [ , [ @futureonly=] 'futureonly' ]
(5) 删除默认值
DROP DEFAULT default_name [,...n]
3.使用约束实施数据完整性
? 约束(Constraint)是SQL Server提供的自动保持数据库完整性的一种机制,它定
义了可输入表或表的单个列中的数据的限制条件。使用约束优先于使用触发器、规则和默认值。
? 约束独立于表结构,作为数据库定义部分在CREATE TABLE语句中声明,可
以在不改变表结构的基础上,通过ALTER TABLE语句添加或删除。当表被删除时,表所带的所有约束定义也随之被删除。
(1) 主键约束
? 表的一列或几列的组合的值在表中惟一地指定一行记录,这样的一列或多
列称为表的主键(Primary Key,PK),通过它可强制表的实体完整性。 ? 主键不允许为空值,且不同两行的键值不能相同。表中可以有不止一个键
惟一标识行,每个键都称为侯选键,只可以选一个侯选键作为表的主键,其他侯选键称作备用键。
? 如果一个表的主键由单列组成,则该主键约束可以定义为该列的列约束。
如果主键由两个以上的列组成,则该主键约束必须定义为表约束。
? 定义列级主键约束的语法格式如下:
[CONSTRAINT constraint_name]
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
? 定义表级主键约束的语法格式如下:
[CONSTRAINT constraint_name]
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
{ (column_name [, ? n ] )}
(2) 外键约束
? 外键约束定义了表与表之间的关系。当一个表中的一列或多列的组合与其
他表中的主关键字定义相同时,就可以将这一列或多列定义为外关键字,可以使数据更新同步,也可拒绝违背参照完整性的数据插入到数据表中。通过外键约束可以强制参照完整性。
? SQL Server提供了两种级联操作以保证数据完整性:
? 级联删除:确定当主键表中某行被删除时,外键表中所有相关行
将被删除。
? 级联修改:确定当主键表中某行的键值被修改时,外键表中所有
相关行的该外键值也将被自动修改为新值。
? 定义表级外键约束的语法格式如下:
[CONSTRAINT constraint_name]
FOREIGN KEY (column_name [, ? n ])
REFERENCES ref_table [(ref_column [, ? n] )]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ] ]
[ NOT FOR REPLICATION ]
注:CASCADE级连操作, NO ACTION:默认值,报错并回滚操作
? 定义列级外键约束的语法格式如下:
[CONSTRAINT constraint_name]
[FOREIGN KEY]
REFERENCES ref_table
[ NOT FOR REPLICATION ]
注: NOT FOR REPLICATION 插入从其他表复制的数据时,约束无效
(3) 惟一性约束
? 惟一性(Unique)约束指定一个或多个列的组合的值具有惟一性,以确保在
非主关键字段或字段组合中不输入重复的值,为表中的一列或者多列提供
实体完整性。
? 惟一性约束和主键约束的区别:
? 在一个表中只能定义一个主键约束,但可以定义多个惟一性约束
? 允许空值的字段上不能定义主键约束,但可以定义惟一性约束
? 定义列级惟一性约束的语法格式如下:
[CONSTRAINT constraint_name]
UNIQUE [CLUSTERED | NONCLUSTERED]
? 惟一性约束应用于多列时的定义格式:
[CONSTRAINT constraint_name]
UNIQUE [CLUSTERED | NONCLUSTERED]
(column_name [, ? n ])
(4) 检查约束
? 检查(Check)约束对输入列或整个表中的值设置检查条件,以限制输入值,
保证数据库的数据完整性。
? 当对具有检查约束列进行插入或修改时,SQL Server将用该检查约束的逻
辑表达式对新值进行检查,只有满足条件(逻辑表达式返回TRUE)的值才
能填入该列,否则报错。可以为每列指定多个CHECK约束。
? 定义检查约束的语法格式:
[CONSTRAINT constraint_name]
CHECK [NOT FOR REPLICATION]
(logical_expression)
(5) 默认约束
? 默认(Default)约束通过定义列的默认值或使用数据库的默认值对象绑定
表的列,以确保在没有为某列指定数据时,来指定列的值。
? 默认值可以是常量,也可以是表达式,还可以为NULL值。
? 定义默认约束的语法格式:
[CONSTRAINT constraint_name]
DEFAULT constant_expression [FOR column_name]
第9章 程序设计
(一)Transact-SQL编程语言
1. 定义批处理语句
? 批处理是一个或多个SQL语句的集合,从程序一次性发送到SQL Server 并编译为
一个可执行单元,一次性执行。如果一个批处理中任何一条语句有语法错误,则整个批处理将不能编译和执行。
? 语法格式: GO
2. 变量
(1)局部变量
? 局部变量是用户定义,必须以@开头,在程序内声明,并只能在该程序内使用。 ? 局部变量的声明
DECLARE @<局部变量名> <数据类型>[,…n]
? 局部变量的赋值
SET|SELECT @<局部变量名>=<表达式>
? 例9-1 声明一个datetime类型的局部变量。
DECLARE @date_var datetime
? 例9-2 声明两个局部变量。
DECLARE @var1 int , @var2 money
? 例9-3 用SET语句和SELECT语句为局部变量赋值。
DECLARE @var1 datetime,@var2 datetime
SET @var1 = getdate()
SELECT @var1 = getdate()
? 例9-4 用SET语句将查询结果赋给局部变量并用SELECT语句显示局部变量
的值。
declare @date_var datetime
set @date_var=(select min(birthday) from s)
select @date_var as max_birthday
(2)全局变量
? 全局变量是SQL Server
? 例9-5 用全局变量查看SQL Server的版本、当前所使用的SQL Server服务器
的名称以及所使用的服务名称等信息。
print '目前所用SQL Server的版本信息如下:'
print @@VERSION
print '目前SQL Server服务器名称为:'+@@SERVERNAME
print ‘目前所用服务名称 为:'+@@SERVICENAME
3. 注释语句
? 注释语句是对程序代码的说明或暂时禁用,是程序代码中不编译执行的语句。 ? 语法格式: --<注释文本> 或 /*<注释文本> */
4. 输出语句
?
? 语法格式: PRINT <表达式>
? 例9-6 输出变量的值。
脚本: declare @date_var datetime
set @date_var=(select min(birthday) from s)
print @date_var
5. 定义语句块语句
? 在控制流程中需要执行两条或两条以上的语句,应该将这些语句定义为一个语句块(称为复合语句)。
? 语法格式: BEGIN
<SQL语句>|<语句块>
END
(二)设计程序—流程控制语句
1. 选择结构
(1)选择结构可以使用条件语句来实现。
IF <布尔表达式>
<SQL语句>|<语句块>
[ELSE
<SQL语句>|<语句块>]
? 例9-7 查询学号为1001的学生。
if exists(select * from studinfo where sno='0001') print '找到' else print '未找到' if exists(select * from title where pub_id=‘5678')
begin print '该出版商包含如下书籍:' select * from title where pub_id='568' ? 例9-8 查询标识号为’568’的出版商出版的任何书的信息。
end
else
print '未找到'
(2)CASE函数
? CASE
? 简单CASE函数:将某个表达式与一组简单表达式进行比较以确定结果。
CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ELSE else_result_expression ] END
? CASECASE
CASE WHEN Boolean_expression THEN result_expression [ ... n ]
[ ELSE else_result_expression ]
END
? 例9-11 使用简单CASE函数将goods表中的商品分类重命名使之更易理解。
SELECT
CASE classification_id
WHEN 'P001' THEN '笔记本计算机'
WHEN 'P002' THEN '激光打印机'
WHEN 'P003' THEN '喷墨打印机'
WHEN 'P004' THEN '交换机'
ELSE '没有这种品牌'
END AS Classification,
goods_name AS 'Goods Name', unit_price AS Price
FROM goods
WHERE unit_price IS NOT NULL
? 例9-12 根据goods表中库存货物数量,使用CASE搜索函数判断该商品是否进货。
SELECT goods_name AS 商品名称,
CASE
WHEN stock_quantity<=3 THEN '紧急进货'
WHEN stock_quantity>3 and stock_quantity<=10 THEN '暂缓进货'
WHEN stock_quantity>10 THEN '货物充足'
END AS 进货判断
FROM goods
2. 循环结构
? 循环结构可以使用循环语句来实现。
? 语法格式:WHILE <布尔表达式>
<SQL语句>|<语句块>
? 中断语句:BREAK
? 短路语句:CONTINUE
3. 转移语句
? 转移语句将程序的执行流程无条件转移到指定的标号处。
? 语法格式: GOTO <标号>
? 。
? GOTO语句常用在循环语句和条件语句内,使程序跳出循环或进行分支处理。 ? 例9-15 求10的阶乘
DECLARE @s int,@times int
set @s=1
set @times=1
label1:
set @s=@s*@times
set @times=@times+1
if @times<=10
goto label1
print '结果为:'+str(@s)
4. 等待语句
? 等待语句挂起一个程序中语句的执行,直到指定的某一时间点到来或在一定的
时间间断之后才继续执行。
? 语法格式:
WAITFOR DELAY '<时间间隔>'|TIME '<时间>' 其中,时间间隔以及时间均为datetime类型,格式为“hh:mm:ss”,分别说明 等待的时间长度和时间点,在time内不能指定日期。
? 例9-16 设置等待一小时后执行查询。
begin
waitfor delay '1:00:00' select * from s
end
? 例9-17 设置到十点整执行查询。
begin
waitfor time '10:00:00'
5. 返回语句
? 返回语句结束执行,使程序无条件返回,其后面的语句不再执行。
? 语法格式: RETURN [<整数表达式>]
? 存储过程可以使用RETURN语句向调用者返回一个整数值。在SQL Server
2000中,存储过程返回值为0时,表示存储过程成功执行。 select * from s end
(三)分行处理程序—游标
?
? Transact-SQL游标是由DECLARE CURSOR脚本、存储过程和触发器中。Transact-SQL游标主要用在服务器上,由从客户端发送给服务器的Transact-SQL 语句或是批处理、存储过程、触发器中的Transact-SQL进行管理。Transact-SQL游标不支持提取数据块或多行数据。
? 使用游标的操作步骤:
?
? ? ? 1.声明游标 DECLARE <游标名> [INSENSITIVE] [SCROLL] CURSOR
FOR <SELECT语句>
[FOR {READ ONLY | UPDATE [OF <列名> [,...n]]}]
? 例 声明标准游标。
脚本:declare cur_c cursor
for
select cno,cname,credit from c
? 例 声明只读游标。
脚本:declare cur_c cursor
for
select cno,cname,credit from c
for read only
? 例 声明更新游标。
脚本:declare cur_c cursor
for
select cno,cname,credit from c
for update
2.声明游标变量
? 语法格式: DECLARE @<变量名> CURSOR
? 建立游标变量与游标之间的关联。
方法1:先声明游标和游标变量,然后用SET语句将游标赋给游标变量。
例:DECLARE c1 CURSOR
FOR SELECT * FROM s
DECLARE @cur_var CURSOR
SET @cur_var = c1
方法2:不声明游标,直接用SET语句将游标定义信息赋给游标变量。 例: DECLARE @cur_var CURSOR
SET @cur_var = CURSOR
FOR SELECT * FROM s
当游标变量和游标关联后,就可用游标变量代替游标名称。
3.打开游标
? 游标声明后,如果要从游标中读取数据,必须打开游标。
? 语法格式: OPEN [GLOBAL] <游标名>|<游标变量名>
其中,GLOBAL表示要打开的是一个全局游标。
4.读取游标中的数据
? 当游标被打开后,就可以从游标中逐行地读取数据。
? 语法格式:
FETCH
[[NEXT|PRIOR|FIRST|LAST|ABSOLUTE {n|@nvar}
|RELATIVE {n|@nvar}]
FROM ]
{{ [GLOBAL] <游标名>}|<@游标变量>}
[INTO @<变量名>[,...n]]
? @@fetch_status变量
5.关闭游标
(1) 使用CLOSE命令关闭游标
? ? 语法格式: CLOSE [GLOBAL] <游标名>|@<游标变量>
? CLOSE用OPEN命令重新打开。
(2) 自动关闭游标
? ? 避免自动关闭的方法是使用语句:
SET CURSOR_CLOSE_ON_COMMIT OFF
6.释放游标
? 用CLOSE命令关闭游标并没有释放游标占用的数据结构。使用DEALLOCATE命
令将释放游标占用的数据结构,游标使用的任何资源也随之释放。
? 语法格式:
DEALLOCATE [GLOBAL] <游标名>|@<游标变量>
?
资源,当然也包括结果集占用的资源。
7.游标应用实例
? 用于游标的UPDATE语句的语法格式:
UPDATE <表名>
SET<列名>={<表达式>|NULL|<select子句>}[,?n]
WHERE CURRENT OF <游标名>
? 用于游标的DELETE语句的语法格式:
DELETE FROM <表名> WHERE CURRENT OF <游标名>
(四)用户定义函数
? 根据函数返回值形式的不同将用户定义函数分为3种类型。
(1) 标量函数返回一个确定类型的标量值,其函数值类型为SQL Server的系 统数据类型(除text、ntext、image、cursor、timestamp、table类型外)。函数 体语句定义在BEGIN?END语句内。 (2) 内嵌表值函数返回的函数值为一个表。内嵌表值函数的函数体不使用 BEGIN?END语句,其返回的表是RETURN子句中的SELECT命令查询的结 果集,其功能相当于一个参数化的视图。 (3) 多语句表值函数可以看作标量函数和内嵌表值函数的结合体。其函数值也 是一个表,但函数体也用BEGIN?END语句定义,返回值的表中的数据由函 数体中的语句插入。
? 使用CREATE FUNCTION创建用户定义函数
(1)标量函数的语法格式:
CREATE FUNCTION [owner_name.] function_name
( [{ @parameter_name [AS] scalar_parameter_data_type[=default ] }
[ ,...n ] ] )
RETURNS scalar_return_data_type
[ WITH < function_option> [ [,] ...n] ]
[ AS ]
BEGIN
function_body RETURN scalar_expression
END
注:ENCRYPTION:加密函数;
SCHEMABINDING:不能更改或删除相关的数据库对象。
(2)内嵌表值函数的语法格式:
CREATE FUNCTION [owner_name.] function_name
( [{@parameter_name [AS] scalar_parameter_data_type [=default ] }
[ ,...n ] ] )
RETURNS TABLE
[ WITH < function_option > [ [,] ...n ] ]
[ AS ]
RETURN [ ( ] select_statement [ ) ]
? 例9-23 创建用户定义函数goodsq,返回输入商品编号的商品名称和库存量。
use employee
go
CREATE FUNCTION goodsq(@goods_id varchar(30))
RETURNS TABLE
AS
RETURN(SELECT goods_name,stock_quantity
FROM goods
WHERE goods_id =@goods_id)
调用函数
select * from employee.dbo.goodsq('1003')
(3)多语句表值函数的语法格式:
CREATE FUNCTION [owner_name.] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] }
[ ,...n ] ] )
RETURNS @return_variable TABLE < table_type_definition >
[ WITH < function_option > [ [,] ...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
? 例9-24 根据输入的订单编号,返回该订单对应的商品编号、名称、类别编号、
类别名称。
CREATE FUNCTION good_info(@in_o_id varchar(10))
RETURNS @goodinfo TABLE
(o_id char(6),
g_id char(6),
g_name varchar(50))
AS
BEGIN
DECLARE @g_id varchar(10),@g_name varchar(30)
SELECT @g_id=goods_id FROM sell_order1
WHERE order_id1=@in_o_id
SELECT @g_name=goods_name
FROM goods WHERE goods_id=@g_id
INSERT INTO @goodinfo
VALUES(@in_o_id,@g_id,@g_name)
RETURN
END
调用函数
select * from employee.dbo.good_info(‘0003')
第10章 存储过程与触发器
(一)存储过程
? 存储过程是SQL Server服务器上一组预编译的Transact-SQL语句,用于完成某项任务,它可以接受参数、返回状态值和参数值,并且可以嵌套调用。
? SQL Server存储过程的类型包括:
(1) (2) 用户定义存储过程
(3) (4) 扩展存储过程
? SQL Server的存储过程可实现以下功能:
(1)接收输入参数并以输出参数的形式为调用过程或批处理返回多个值。
(2)包含执行数据库操作的编程语句,包括调用其他过程。
(3)为调用过程或批处理返回一个状态值,以表示成功或失败(及失败原因)。
? 存储过程是存放在SQL Server中的特别快的数据库对象,当首次运行时按以下方式进行:
(1)该过程被划分成部件片段。
(2)检查引用数据库中其他对象(表、视图等)部件,确保引用的对象是存在的,称为分解。
(3)分解完成,该过程的名字被存放到sysobjects表中,而创建存储过程的代码存放在syscomments表中。
(4)然后编译,在编译过程中创建如何运行查询的蓝本,该蓝本通常被称为常规计划或查询树。
(5)存储过程首次运行时,读出查询计划并完全编译成执行计划,然后运行。在以后的每次执行时,将节约存储过程的语法检查、分解、编译的时间。
? 存储过程具有以下优点:
(1)
(2)
(3)
(4)
(5)
1.创建存储过程
? 使用CREATE PROCEDURE语句创建存储过程应该考虑以下几个方面:
(1)(2)数据库所有者具有默认的创建存储过程的权限,它可把该权限传递给其他的用户。
(3)(4)
创建存储过程语句的语法格式如下:
CREATE PROC[EDURE] procedure_name [; number ]
[{@parameter data_type }
[VARYING] [=default] [OUTPUT]] [, ...n ]
[WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [,...n ]
2.执行存储过程
[[EXEC[UTE]]
{[@return_status=]
procedure_name [;number]|@procedure_name_var} [[@parameter=]{value|@variable
[OUTPUT]|[DEFAULT]]
[ ,...n ]
[WITH RECOMPILE ]
3.修改存储过程
ALTER PROC[EDURE ] procedure_name [ ; number ]
[{@parameter data_type}
[VARYING][=default] [OUTPUT]] [ ,...n ]
[WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}]
[FOR REPLICATION ]
AS sql_statement [ ...n ]
4.删除存储过程
存储过程可以被快速删除和重建,因为它没有存储数据。
DROP PRO[CEDURE] {procedure_name} [ ,...n ]
(二)触发器
? 触发器是一种特殊类型的存储过程。
? 触发器主要是通过事件进行触发而被执行的,而存储过程可以通过过程名字直接调用。
当对某一表进行UPDATE、INSERT、DELETE操作时,SQL Server就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。 ? 触发器可以使用T-SQL语句进行复杂的逻辑处理,它基于一个表创建,但可以对多个
表操作,常用于复杂的业务规则,一般使用触发器完成如下功能:
(1)
(2) 执行比检查约束更为复杂的约束操作
(3) ? 创建触发器的规则
(1) Create Trigger 语句必须是批处理中的第一条语句,该批处理中随后出现的所有语句都将被解释为create trigger定义的一部分。
(2)
(3) 触发器只能在当前数据库中创建
(4) ? 创建触发器包含的要素
(1)
(2)
(3)
(4) 1.创建触发器
CREATE TRIGGER trigger_name
ON {table_name | view }
[ WITH ENCRYPTION ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ]}
AS sql_statement [ ... n ]
2.执行触发器
? 。
DELETE FROM employee
WHERE employee_name = '张三'
该语句要删除员工姓名为“张三”记录,由此激活了表employee 的DELETE类型的触发器tr_employee,系统执行tr_employee触发器中AS之后的语句,并显示以下信息:
1个员工被删除
? Deleted表和Inserted表
? 在触发器的执行过程中,SQL Server建立和管理两个临时的虚拟表:Deleted表和
Inserted表。这两个表包含了在激发触发器的操作中插入或删除的所有记录。
? 在执行INSERT之后所有被添加的记录都会存储在Inserted表中。
? 在执行DELETE语句时,从触发程序表中被删除的行会发送到Deleted表。
? 对于更新操作,SQL Server先将要进行修改的记录存储到Deleted表中,然后再将
修改后的数据复制到Inserted表以及触发程序表。
3.修改触发器
(1) 使用sp_rename系统存储过程修改触发器的名字:
sp_rename oldname, newname
(2) 使用ALTER TRIGGER语句修改触发器
ALTER TRIGGER trigger_name
ON {table | view}
[WITH ENCRYPTION]
{FOR | AFTER | INSTEAD OF}
{[DELETE] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
AS sql_statement [ ...n ]
4.删除触发器
DROP TRIGGER trigger_name [ , ...n ]
(三)事务
? 事务(Transaction)是SQL Server处理。
? 事务保证连续多个操作必须全部执行成功,否则必须立即回复到未执行任何操作的状态,即执行的事务要么全做,要么全部不做。
? 由于事务作为一个逻辑工作单元,当事务执行遇到错误时,将取消事务所做的修改。一
个逻辑单元必须具有4个属性:(这些属性称为ACID)
(1)
(2) :事务完成后,数据保持一致
(3)
(4)
? SQL Server以3种事务模式管理事务
(1) :每条单独的语句都是一个事务。在此模式下,每条Transact-SQL 语句在成功执行完成后,都被自动提交,如果遇到错误,则自动回滚该语句。该模式为 系统默认的事务管理模式。
(2) :该模式允许用户定义事务的启动和结束。事务以BEGIN TRANSACTION语句显式开始,以COMMIT或ROLLBACK语句显式结束。
(3) :在当前事务完成提交或回滚后,新事务自动启动。隐性事务不需要 使用BEGIN TRANSACTION语句标识事务的开始,但需要以COMMIT或ROLLBACK 语句来提交或回滚事务。
1.启动和结束事务
(1) 启动事务语句的语法格式如下:
BEGIN TRAN[SACTION ] [ transaction_name | @tran_name_variable
[ WITH MARK [ 'description' ] ] ]
(2) 结束事务语句的语法格式如下:
COMMIT [TRAN[SACTION] [transaction_name | @tran_name_variable] ]
2(1) 事务回滚使用ROLLBACK TRANSACTION语句实现,其语法格式如下:
ROLLBACK [TRAN[SACTION]
[transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable] ]
(2) 如果要让事务回滚到指定位置,则需要在事务中设定保存点(SavePoint)。所谓保存点是指定其所在位置之前的事务语句为不能回滚的语句即此语句前面的操作被视为有效。其语法格式如下:
SAVE TRAN[SACTION]
{savepoint_name | @savepoint_variable}
3.事务嵌套
和BEGIN?END语句类似,BEGIN TRANSACTION和COMMIT TRANSACTION语句也可以进行嵌套,即事务可以嵌套执行。
SqlServer数据库原理期末总结姓名:张全羚学号:1304091004班级:13软件工程(1)班一、知识点分析(举例)1、存储…
承德石油高等专科学校计算机与信息工程系岗前实训总结报告实训方向或岗位:软件工程师实训地点或单位:文理楼B518所属班级:软件090…
分布式数据库介绍自学、整理、备忘它和集中式操作系统的区别在于资源管理、进程通信和系统结构等方面。分布式程序设计语言用于编写运行于分…
1、查询数据库,将查询出来的内容加入数值中加入内容。其中列名也会改变。将会用到连接符,如果是orcale将用||连接符。这样列名也…
(一)E-R图1.学校中有若干系,每个系有若干班级和教研室,每个教研室有若干教员,其中有的教授和副教授每人各带若干研究生。每个班有…
20xx年XXX住建局保障性住房工作总结20xx年在县委、县政府的正确领导下,在市住建局的业务指导下,我们认真执行省、市住房保障制…
第三章金融市场1.金融市场的特性:1.交易对象具有特殊性.2.交易商品的使用价值具有同一性.3.交易价格具有一致性.4.交易活动具…
20xx年x月x日上午,区法院组织全体干警收看了党的十八大开幕盛况,认真聆听了xx在大会上作的工作报告。党的十八大是全党全国人民政…
三角函数知识要点1、角的表示2.角度与弧度3、弧长公式:l?|?|?r.扇形面积公式:s扇形?112lr?2|?|?r24、三角函…
第一周又这样的过去了,先说说在这个星期里我的总结。在这个星期当中我个人觉得应该是最忙碌的一周,但是跟我想象的完全不一样,没想到客流…