SQLServer总结
SQLServer总结
数据库的设计
一、数据库的设计过程1需求分析阶段
2概要设计阶段3详细设计阶段
二、无论数据库大小,在进行数据库的系统分析时,可以参考以下基本步骤1.收集信息创建数据库之前,必须充分理解数据库需要完成的任务和功能2.标识对象在收集需求信息后,必须标识数据库要管理的关键对象成实体3.标识每个对象需要储存的详细信息标识每个对象存储的详细信息,也成为该对象的属性,这些属性将组成表中的列4.标识对象(实体)之间的关系关系型数据库有一项非常强大的功能,它能够关联数据库中各个项目的相关信息三、映射基数
一对一:X中的一个实体最多与Y中的一个实体关联,并且Y中的一个实体最多与X中的一个实体关联
一对多:X中的一个实体可以与Y中的任意数量的实体关联。Y中的一个实体最多与X中的一个实体关联
多对一:X中的一个实体最多与Y中的一个实体关联,而Y中的一个实体可以与X中的任意数量的实体相关联多对多:X中的一个实体可以与Y中的任意数量的实体关联,反之亦然。四、实体关系图矩形表示实体集椭圆形表示属性
菱形表示关系集
直线用来连接属性和实体集五、范式设计1.第一范式:(1NF,NormalFormate)第一范式的目标是确保每列的原子性。2.第二范式:(2NF)
第二范式在第一范式的基础上,更进一层,其目标是确保表中的每列都和主键相关联。
3.第三范式:(3NF)
第三范式在第二范式的基础上,更进一层,第三范式的目标是确保每列都和主键列直接相关,而不是间接相关
在实际的数据库设计中,既要考虑三大范式,避免数据的冗余和各种数据操作异常,又要考虑数据反问性能,有时,为了减少表间连接,提高数据库的访问性能,允许适当的数据冗余列,可能是最适合的数据库设计方案
数据库的实现
一、Sql语句户回顾:
1.添加数据
语法:insert[into]表名(字段1,字段2,…..)values(值1,值2,…..)2.修改数据
3.语法:update表名set字段1=值1,字段2=值2,…where(条件)4.查询数据
语法:select字段1、字段2,….from表名where(条件)orderby字段名5.删除数据
语法:deletefrom表名where(条件)
二、创建数据库
a)数据库名:数据库的名称
b)PRIMARY:指定主文件组中的文件
c)LOGON:指明事务日志文件的明确定义d)NAME:指定数据库的逻辑名称
e)FILENAME:指定数据库所在文件的操作系统名称和路径,该操作系统名称应和逻
辑名一一对应
f)SIZE:指定数据库的初始大小
g)MAXSIZE:指定操作系统文件可以增长到的最大尺寸h)FILEGROWTH:指定文件每次增加容量的大小三、删除数据库
1.语法:
a)dropdatabase数据库名
b)应先用exists检测某个查询是否存在,如果查询结果为空,则表示存在。否则
表示不存在。
四、建表建约束Numeric(18,0)代表18位数字,小数位数是0Identity(1,1)自动编号,从1开始递增,增量是1某个数据库中标的清单存放在数据库系统表sysobjects中。1.添加约束
altertable表名addconstraint约束名约束类型具体的约束说明2.删除约束
dropconstraint约束名
四、账户
a)创建登陆账户
execsp_addlogin‘zhangsan’,’1234’b)创建数据库用户
execsp_grantdbaccess‘账户名\\密码’,‘数据库名’execsp_grantdbaccess‘账户名’,’密码grant权限[on表名]to数据库用户
T-SQL编程
一、使用变量
a)局部
declare@variable_nameDataType赋值:
set@variable_name=value
或select@variable_name=value
set赋值语句一般用于赋给变量指定的数据常量
select赋值语句一般用于从表中查询数据,然后再赋给变量b)全局变量
i.@@ERROR最后一个T-SQL错误的错误号ii.@@IDENTITY最后一次插入的标示符iii.@@SERVERNAME本地服务器的名称iv.@@SERVICENAME该计算机上的SQL的服务名称v.@@VERSIONSQLServer的版本信息c)输出语句
i.print局部变量或字符串ii.select局部变量as自定义列名查询语句的特殊应用iii.print‘当前错误号’+conver(varchar(2),@@ERROR)和字符串一起输出需要转换
二、逻辑控制语句
a)If-else
if(条件)begin语句1语句2…..endelse…….b)While
while(条件)语句或语句块[break]
使用break关键字从最内层的while循环中退出c)Case
case
when条件1then结果1when条件2then结果2[else其他结果]endd)批处理
i.go是批处理语句结束的标志ii.是一条或多条sql语句的集合,sqlserver将批处理语句变异成一个可执行单元,
此单元成为执行计划,每个批处理可以编译成单个执行计划,从而提高执行效率iii.Sqlserver规定:如果是创建库、创建表语句,以及创建视图和存储过程等,
则必须在语句末尾添加“GO”批处理标志
高级查询
一、子查询
a)一般子查询
一般来说,表连接都可以用字查询替换,但反过来说却不一定。有的子查询不能用表连接来代替,子查询比较灵活、方便、形式多样,适合于作为查询的筛选条件,而表连接更适合于查看多表的数据b)in和notin子查询
使用“=”、“>”等比较运算符时,要求子查询只能返回一条或空的记录,那么我们可以将“=”改为“in”c)exists和notexists子查询
从理论上讲,exists也可以作为where语句的子查询,但一般用于if语句的存在检测语法:ifexists(子查询)语句
如果子查询的结果非空,则exists(子查询)将返回真(true),否则返回假(false)
事务、索引和视图
一、事务
事务是一种机制、一个操作序列,它包含了一组数据库操作命令,并且所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元事务特性
1.原子性(Atomicity):事务是一个完整的操作2.一致性(Consistency):当事务完成时,数据必须处于一致状态3.隔离性(Isolation):对数据进行修改的所有井发事务是彼此隔离的4.持久性(Durability):事务完成之后,它对于系统的影响是永久性的
创建事务:开始事务:begintransaction提交事务:committransaction回滚(撤销)事务:rollbacktransaction三、索引.通过搜索索引找到特定的值,然后跟随指针到达包含该值的行.通过使用索引,可以大大提高数据库的检索速度,改善数据库性能
.创建了唯一索引约束,将自动创建唯一索引,尽管唯一索引有助于找到信息,但为了获得最佳性能,建议使用主键约束。
.在SQLServer中,一个表只能创建一个聚集索引,但可以有多个非聚集索引,设置某列为主键,该列就默认为聚集索引。1.如何创建索引
a)使用MicrosoftSQLServerManagementStudio创建索引b)使用T-SQL语句创建索引
i.UNIQUE指定唯一索引,可选ii.CLUSTERED、NONCLUSTERED指定是聚集索引还是非聚集索引,可选iii.FILLFACTOR表示填充因子,指定一个0~100的值,该值只是索引页填满的
空间所占的百分比
2.优点:
a)加快访问速度b)加强行的唯一性3.确定
a)带索引的表在数据库中需要更多的存储空间
四、视图
a)视图是另一种查看数据库中一个或多个表中的数据的方法,视图是一种虚拟表,通
常是作为来自一个或多个表的行或列的自己创建的。
b)理论上它可以向普通的物理表一样使用,例如增加、删除、修改、查询等,修改视
图实际上是修改原始数据表,因为修改视图有许多限制,所以在实际开发中一般视图仅用做查询使用
存储过程
存储过程优点:
a)允许模块化程序设计b)允许更快地执行c)减少网络流量
d)可作为安全机制使用存储过程可以分为两类:
1)系统存储过程
2)用户自定义的存储过程
一、常用的系统存储过程:
a)系统存储过程的名称都以”sp_”开头,并放在master数据库中。
sp_databases:列出服务器上的所有数据库
sp_helpdb:报告有关指定数据库或所有数据库的信息sp_renamedb:更改数据库的名称
sp_tables:返回当前环境下可查询的对象的列表sp_columns:返回某个列表的信息sp_help:查看某个表的所有信息
sp_stored_procedures:列出当前环境中的所有存储过程b)在MicrosoftSqlserverManagermentStudio中一般不能修改数据库的名称,但可以
通过在新建查询中调用sp_renamedb系统存储过程来修改execxp_cmdshelldos命令[NO_OUTPUT]
二、用户定义的存储过程
a)用于创建存储过程的T-SQL语句为createprocedure。b)语法:
createproc[edure]存储过程名字[
{@参数1数据类型}[=默认值][output],…..,
{@参数n数据类型}[=默认值][output]]
调用:
Exec存储过程名【参数】
三、处理错误信息
RAISERROR返回用户定义的错误信息时,可以指定严重级别,设置系统变量记录发生的错误语法:
raiserror({msg_id|msg_str}{,severity,state}[withoption[,…n]])msg_id:在sysmessage系统表中指定的用户定义错误信息msg_id:用户定义的特定信息,最长255个字符
severity:与特定信息相关联,表示用户定义的严重新级别。state:表示错误的状态
option:只是是否将错误记录到服务器错误日志中
扩展阅读:SQL Server知识点总结
第一章关系数据库管理系统基础知识
1.1数据库系统概述
数据:对客观存在的事物的一种描述。
数据库:长期存储在计算机内、与应用程序彼此独立的、以一定的组织方式存储在一起的、彼此相互关联的、具有较少冗余的、能被多个用户共享的数据集合。数据库体系结构:
(1)内模式:也称存储模式,是数据库全部数据的内部表示或者底层描述,用来定义数据的存储方式和物理结构。
(2)模式:也称逻辑模式,实际上是数据在逻辑级上的视图,是数据库中全体数据的逻辑结构和特征描述,即根据用户需求设计出的数据库模型。
(3)外模式:也称用户模式,是数据库用户能够看见和使用的数据视图。
数据库管理系统(DBMS)是位于用户与计算机操作系统之间的一个系统软件,由一组计算机程序组成。DBMS的功能:
数据定义功能:DDL
数据操作功能:DML分为:交互式命令语言、嵌入式语言。数据库的运行与管理,包括数据安全控制、数据完整性控制、数据库的恢复、并发控制。数据的建立和维护功能。初始数据的输入与数据转换等。数据通信接口:与其它软件系统通信的功能。
1.2数据模型
数据模型分三大类:
概念数据模型:独立于计算机系统的数据模型,完全不涉及信息在计算机系统中的表
示,只是用来描述所使用的信息结构。
逻辑数据模型:返回数据的逻辑结构,主要有层次数据模型、网状数据模型、关系数
据模型。
物理数据模型:反映数据在计算机中的存储结构。
1.2.1数据模型的组成要素:
数据结构数据操作
数据的完整性约束条件
1.2.2概念模型
(一)实体及其属性
(1)实体:现实世界客观存在并且可以相互区分的事物称为实体。(2)属性:实体所具有的某一特性称为属性。
(3)型与值:型,是结构,用实体名及属性名集合描述同类实体,称为实体型。值,是数据,不同的实体有不同的属性内容。
(4)实体集:具有相同实体型的实体值的集体合为实体集。
(5)关键字:能区别实体集合中不同个体的某一个或某几个属性的集合。(二)实体间的关系:(1)一对一(1:1)(2)一对多(1:N)(3)多对多(N:M)
(三)概念模型的表示方法
E-R图(1)实体型(2)属性(3)联系
1.2.5关系模型
(一)基本术语
(1)关系:一个关系模型的逻辑结构是二维表,它由行和列组成。(2)元组:表中的一行称为一个元组,也称为记录。(3)属性:表中的一列称为属性,用来描述事物的特征。(4)域:属性的取值范围。
(5)关系字/码:在关系中某一个属性或属性组的值唯一的决定其他所有属性。
(6)候选键/候选关键字/候选码:一个关系中有多个属性或属性组都能用来标识关系的元组。
(7)主键/关关系字/主码:在一个关系的多个候选码中指定其中一个作为该关系的关键字。(8)外键/外关系字/外码:(二)关系模型的三要素(1)数据结构关系(2)关系操作
(3)关系完整性约束(三)关系模型的特点(1)严格的理论基础(2)数据结构单一(3)存取简单
1.3关系数据库及其设计过程1.3.1关系与表格
表应该具有的性质:(1)必须是规范化的关系(2)表中的“行”是惟一的(3)行的次序可以任意
(4)表中的确良“列名”是惟一的(5)列的次序可以任意(6)必须满足完整性约束
1.3.3数据设计过程
(1)需要分析(2)概念结构设计
(3)逻辑结构设计(E-R模型到关系模型)
(4)物理结构设计(确定数据的存储结构、索引结构设计、数据存储位置的考虑、系统配置的优化)
(5)数据库实施(定义数据库结构、数据装载)(6)数据库的运行和维护(维护数据库的安全性和完整性、数据库的转储和恢复、临测并改善数据性能、数据库的重新组织)
1.4关系数据的规范化1.4.1数据库的三个规范化形式
(一)第一规范化形式1NF
在一个关系(数据表)中没有重复的数据项,每个属性都是不可分割的最小数据元素。即每列的列名都是惟一的,一个关系中不允许有两个相同的属性名,同一列的数据具有相同的数据类型,列的顺序交换不能改变关系的实际意义。没有相同的的列字段惟一。商品名称商品名进货数据数量单价销售数据数据单价库存数据备注数量数量(二)第二规范化形式2NF
在满足1NF的关系中,一行中所有非关键字数据元素都完全依整于关系字。即一个关系中不允许有两个相同的实体,行的顺序交换后不能改变数据表的实际意义。即数据表中没有相同的行
(三)第三规范化形式3NF
满足2NF的关系中,不存在传递依赖于关系字的数据项。传递依赖:指某些列的数据不是直接依赖于关键字,而是通过某个非关系字间接地依赖于关键字。将不依赖关键字的列删除,单独创建一个数据表存储。
1.4.2数据规范化设计的原则
(1)保证数据库中的所有数据表都满足2NF,力求绝大多烽数据表满足3NF(2)保存数据的完整性(3)尽可能减少冗余
1.5数据表的关联与数据的完整性1.5.1表的关系
(一)交叉连接
也称为非限制连接、无条件连接或笛卡儿连接。将两个表不加任何限制地组合在一起,其连接方法是将第一表中的每条记录分别与第二个表中每条记录连接成一条新记录,结果是具有两个记录数乘职的逻辑数据表。学号1001100210031004
姓名吕川页郑学敏于丽孙立华
学号100310041005成绩9278学号100110011001100210021002100310031003100410041004姓名吕川页吕川页吕川页郑学敏郑学敏郑学敏于丽于丽于丽孙立华孙立华孙立华学号100310041005100310041005100310041005100310041005成绩927885927885927885927885(二)内连接:也称为自然连接,只将两个表中满足指定条件的记录连接成一条新记录,舍弃所有不满足条件没有连接的记录学号10031004姓名于丽孙立华学号10031004成绩9278
等价于
学号10031004姓名于丽孙立华成绩9278(三)外连接
可以只限制一个表,对另外一个表不加限制(所有行都出现在结果集中),以便在结果集中保证该的完整性。
外连接分为左外连接、右外连接、全外连接
(1)左外连接:可以得到左表的全部记录及右表相关的记录信息。学号1001100210031004学号10031004Null学号1001100210031004Null姓名吕川页郑学敏于丽孙立华姓名于丽孙立华Null姓名吕川页郑学敏于丽孙立华Null学号NullNull10031004学号100310041005学号NullNull100310041005成绩NullNull9278成绩927885成绩NullNull927885等价于等价于
等价于
学号1001100210031004学号10031004Null学号1001100210031004Null姓名吕川页郑学敏于丽孙立华姓名于丽孙立华Null姓名吕川页郑学敏于丽孙立华Null成绩NullNull9278成绩927885成绩NullNull927885(2)右外连接:可以得到右表的全部记录信息及左表相关的记录信息。(3)全外连接:可以得到左表与右表的全部记录信息。1.5.2数据的完整性及约束(1)数据完整性
1)实体完整性:数据表中的所有行都是惟一的、确定的,所有记录都是可以区分的。表中的主键值惟一,主要属性不能为空,主键不能为空。
2)参照完整性:定义外键与主键之间的引用规则,确保数据库中不会含有无效外键。当一个表中的某列数据依赖引用另一个表的某列数据时,这两个表之间的相关数据必须保持一致。3)域完整性:表中每列的数据具有正确的数据类型、格式和有效的取值范围,保证数据的正确性。(2)约束
1)主键约束:每个表必须设计主键约束,主键的特点:不允许重复、不允许为空、只能有一主键,可以是联合主键。记录按主键值指定顺序存储。
2)惟一约束:一列数据或几列数据的组合值在数据表中是惟一不能重复的。保证主键外的字段值不能重复。一个表中可以定义多个惟一约束。可以允许为空值。
3)外键约束:如果一个表中某个字段的数据只能取另一个表中某个字段值之一,则必须为该字段设置外键约束,设置外键约束的表称为子表,它所引用的表称为父表。外键约束可以使一个数据库中的多个数据表之间建立关系。建立一对多的逻辑关系。外键约束可以保证数据的参照完整性和域完整性。
外键约束的特点:可以是单一字段,也可以是多个字段的组合;外键所引用父表中的字段必须是创建了主键约束或惟一约束的列;外键可以允许空值,可以有重复值,但必须是父表引用列中的数据之一;子表中外键字段添加的新数据,必须先在父表中添加,再在子表中添加;子表中引用父表数据的记录未删除,则父表中被引用的数据不能被删除。
4)检查约束:用指定的条件检查限制输入数据的取值范围是否正确,用以保证数据的参照完整性和域完整性。
5)默认值约束:指给某个字段一个默认的初始值,输入记录时若没有给出该字段的数据,则自动填入默认值以保证数据的域完整性。
6)空值约束:指不知道或不能确定的特殊数据,不等同于数据0和字符的空格。设置某个字段的值是否允许为空。用以保证数据的参照完整性和域完整性。
习题:
(1)关系数据模型中,实体用(巨型)来表示,实体间的联系用(菱形)来表示
(2)(DBMS)是位于用户与操作系统之间的一层数据管理软件。数据库在建立、使用和维护时是由其统一管理、统一控制。
(3)目前最常用的数据模型有(层次模型)、(网状模型)、(关系模型).20世纪80年代以来,(关系模型)逐渐占主导地位。
(4)数据模型的三要要素包括(数据结构)、(数据操作)和(数据的完整性约束条件).(5)关系的主键是()、外键是()
(6)数据库的实体完整性要求表中的所有(行)惟一,可以通过创建(主键约束)(惟一约束)(空值)等约束来实现
(7)数据的参照完整性要有关联的两个或两个以上数据表之间的数据(保持一致)数据库参照完整性可通过创建(外键约束)和(检查约束)约束来实现
(8)数据库域完整性可保证表中指定字段中数据的(正确性).要求表中指定列的数据具有正确的(数据类型)(格式)和(有效的取值范围).
(9)在一个表上能创建(一)个主键约束,主键值(不允许)为空,在一个表上能健(多)个惟一约束,惟一值(允许)为空
(10)外键约束来用创建立两个表之间的关联。外键列的取值可以(空),可以有(重复)值,但其值必须是引用列的值之一。引用列必须是创建了(主键)或(惟一)的列。
(11)若为某公司开发一个逻辑模型:公司有10个部门,每个部门有67个员工,但每个员工可能会在不止一个部门工作。下面所给的模型正确的是(B).A.部门和员工之间是一种确定的一对多的关系。
B.建立一个关联表,从该关联表到员工建立一个一对多的关系,然后再从该关联表到部门表建立一个一对多的关系。
C.建立一个关联表,从员工表到该关联建立一个一对多的关系,然后再从部门表到该关联表建立一个一对多的关系。
D.这种情况不能建立正常的数据库型。
(12)假设有一个学生信息表(StuInfo)的设计如下:StuId,Name,Address,Departmetn,DepartmentHead该最高满足第(2NF)范式。(13)指出下列关系各属第几范式。
(1)学生(学号,姓名,课程号,成绩)(2NF)(2)学生(学号,姓名,性别)(3NF)
(3)学生(学号,姓名,所在系另,所在系地址)(2NF)
(4)员工(员工编号,基本工资,岗位级别,岗位工资,奖金,工资总额)(2NF)(5)供货商(供货商编号,零件号,零件名,单价,数量)(2NF)
第二章SqlServer201*数据库管理系统
1.SQLServer201*的各种版本(1)SQLServer201*企业版(2)SQLServer201*标准版(3)SQLServer201*个人版(4)SQLServer201*开发版
(5)SQLServer201*WindowsCE版(6)SQLServer201*企业评估版2.SQLServer201*的用户帐号(1)使用本地系统帐号
(2)使用域用户帐号(必须是Administrators组的成员、有密码永不过期的属性、作为一个服务登录)
3.SQLServer201*的组件
(1)服务器组件(2)管理工具(3)客户端连接(4)联机丛书(5)工发工具(6)代码示例4.SQLServer提供的服务
(1)SQLServer服务:实现SQLServer数据库引擎,处理所有T-SQL语句,管理服务器上数据库的所有文件,在多个并发用户之间分配计算机资源,防止产生逻辑问题,保证数据的安全性、一致性和完整性。
(2)SQLServer代理服务:实现运行调度的SQLServer管理任务的代理程序。SQLServer代理是一个任务规划器和警报管理器。可以创建和管理作业、警报和操作员。
(3)Microsoft搜索服务:仅用于WindowsNT和Windows201*,实现全文本检索引擎。
(4)MSDTC(DistributedTransactionCoordinator)服务:仅用于WindowsNT和Windows201*,管理分布式事务。
2.4SQLServer201*的系统数据库及系统表(1)系统数据库
1)master数据库:记录了SQLServer系统级的信息,包括系统中所有登录帐号、系统配置信息、所有数据库的信息以及所有用户数据库的主文件地址等。Master数据库中还有很多系统存储过程和扩展存储过程。
2)tempdb数据库:用于存储所有连接到系统的用户临时表和临时存储过程以及SQLServer产生的其他临时性的对象。Tempdb是SQLServer中负担最重的数据库,因为几乎所有查询都需要使用它。关闭SQLServer时,tempdb数据库中所有对象会被删除。
3)model数据库:是系统所有数据库的模板,这个数据库相当一个模子,所有在系统中创建的新数据库的内容,在刚创建时都和model数据库完全一样。
4)msdb数据库:被SQLServer代理来安排报警、作业,并记录操作员。(2)系统表
1)Sysdatabases:记录系统数据库和用户自定义数据库,只在master表。2)Syslogins:只在mastetr表,记录每一个登录帐号
3)Syslanguages:只在master表,记录每种语言,美国英语不表中。
4)Sysobjects:在每个表中,记录创建的每一个对象。在tempdb表中,每个临时表被记录。5)Syscolumns:每个表中,对基表或者视图的每一个列和存储过程中的每个参数。
6)Sysindexes:每个表中,记录每个索引和没有聚簇索引的每个表含有的一行记录,还包括文本或图像数据。
7)Sysusers在每个表中,记录整个数据库中的每个NT用户,NT用户组、SQLServer用户或者SQLServer角色。
8)Sysdepends:记录表、视图、和存储过程之间每一个依赖关系。9)Sysforeignkeys:包含关系表中的外键约束。10)Sysfiles:记录每一个文件。
2.5SQL和T-SQL概述
T-SQL的分类:
(1)数据定义语句:用来定义和管理数据以及数据库中的各种对象的语句。Create,Aler,Drop.(2)数据操作语句:用来查询、添加、修改和删除数据库中的数据语句。Select,Insert,Update,Delete.
(3)数据控制语句:用来进行安全管理,以确保数据库中数据和操作不被未授仅用户使用和执行。Grant,Deny,Revoke.
(4)附加的语言元素:为了编写脚本而增加的语言元素,包括变量、运算符、函数,流程控制和注释。
习题:
(1)服务管理是用来(启动)(停止)和(暂停),SQLServer服务的。这些服务在WindowsNT或Windows201*下也可以通过控制面板的[服务]项来启动或停止。
(2)在[开始]菜单的MicrosoftSQLServer程序中选择EnterpriseManager即可启动(???)管理器
(3)在[查询]窗口中用户可以输入SQL语句,按(F5)键,或单击工具栏上的[运行]按钮,将其送到服务器执行。
第三章用户数据库的创建与操作
3.1SQLServer数据库的存储结构3.1.1SQLServer数据库
数据库名:
由字母、数字、汉字、下划线组成。不能以数字开头,不能是关键字不能超过128个字符
3.1.2数据库文件的分类
(1)数据库文件(课后题3,4)分三类:
主数据文件:.MDF有且只能一个。存储数据和启动信息。辅助数据文件:.NDF0或多个。存储数据
事务日志文件:LDF1或多个。存储对数据库的操作、修改信息。(2)文件组:将多个数据库文件组成一个文件组,整体管理。
无论一个数据库有多少个数据文件,也无论多少个文件组,主数据文件只能有一个。默认组名:Primary
数据文件和文件组的规则:
一个文件或文件组包括事务日志文件只能被一个数据库使用。一个数据文件只能属于一个文件组。事务日志文件不属于文件组。
3.1.3数据库对象
数据库对象没有对应的磁盘文件。
表、视图、存储过程、触发器、用户定义类型、用户定义函数、索引、规则、默认、全文目录、约束
3.2创建数据库3.2.1用企业管理器创建
文件大小:初始容量(MB),默认1MB
主数据库文件默认组primary不可更改(可修改系统设置)文件自动增加分为:按兆字节和按百分比
3.2.2用CreateDataBase语句
createdatabaseteacheron(name=teacherdate1,filename="F:\\SqlTest\\tdata1.mdf",size=1MB,--默认字节,可以省略,maxsize=10,--最大容量filegrowth=15%--增长量),(name=teacherdata2,filename="F:\\Sqltest\\tdata2.ndf",size=2MB,maxsize=15,filegrowth=2)logon(name=teacherlog,filename="F:\\Sqltest\\tlog.ldf",size=500MB,--初始容量,KB为单位,不能省略。maxsize=unlimited,--最大容量不受限制。filegrowth=500kb--增加量不能省略.)说明:路径必须得存在3.3.2用T-SQL查看数据库信息
(1)execsp_helpdb--显示所有数据库信息
(2)execsp_helpdbteacher--显示指定数据库信息
(3)execsp_databases所有数据库信息,没有sp_helpdb内容多。(4)execsp_helpfile--当前数据库信息(5)execsp_helpfilegroup文件组名
(6)sp_deoption:查看,设置修改数据库选项语法:sp_deoption[数据库名,[选项,值]]选项为:single单用户,readonly只读,autoclose自动关闭,autoshrink自动收缩如:sp_dboption"teacher","single","true"sp_dboption"teacher"--不给参数,为查询修改结果。(7)AlterDatabase设置、修改数据库语法:
alterdatabase数据库名addfile[tofilegroup文件组]addlogfileremovefile逻辑文件名addfilegroup文件组名removefilegroup文件组名modifyfilemodifyfilegroup文件组名,文件组属性示例:alterdatabaseteacheraddfilegroupteachergrouptgoalterdatabaseteacheraddfile(name=teacheradd,filename=’F:\\SqlTest\\tdata3.ndf’)go说明:文件正在使用时无法操作。3.4数据库的分离与删除
(1)分离:只是从SQLServer系统中删除数据库,组成数据库的数据文件和事务日务文件依然保存在磁盘上。
语法:sp_detach_db"数据库名","是否分离前更新数据库统计信息"如:sp_detach_db"teacher","true"说明:正在使用无法分离,分离后在SQLServer系统中无法看见。(2)删除
语法:dropdatabase数据库名如:dropdatabasetecher说明:正在使用无法分离.习题:
(1)在企业管理器中,右击要操作的数据库,在快捷菜单中选择(新建数据库)命令创建数据
库,选择(任务板)命令查看数据库定义信息,选择(属性)命令设置数据库选择,选择(属性)命令修改数据库结构,选择(属性)命令查看数据库结构,使用(删除)命令删除数据库。
(2)在查询分析中,使用(createdatabase)命令创建数据库,使用(sp_helpdb)命令查看数据
库定义信息,使用(sp_dboption)命令设置数据库选项,使用(alterdatabase)命令修改数据库结构,使用(dropdatabase)命令删除数据库.(3)在什么情况下不能删除数据库
dropdatabase可以一次删除多个数据库,但删除时不出现提示。正在被使用的数据库不能被删除。
第四章数据表的创建与操作
4.1数据类型4.1.1二进制数据
(1)定长二进制binary(n):按n个字节的固定长度存放二进制数据,最长为8KB.1(2)短整型数据:SmallInt:占2个字节,固定长度。-32768-32767(3)基本整型数据Int:占4个字节,最高位为符号位。(4)长整型整数:Bigint:占8节字,最高们为符号位。(5)近似值实型浮点数:Real,占4个字节固定长度。
(6)可变精度实型浮点数:Float(n)n值为124时,精度是7位。N值为2553时,精度为15位。
(7)精确小数型数据Numeric(p,s)p:总位数,不含小数点。取值范围1(3)Sql_variant:存储除文本、图像数据和Timestamp类型数据外的其他任务数据类型。(4)Table存储对表或视图处理后的结果集。
4.1.10局部变量的定义和输出
(1)批处理:以Go语句为结束标志。
(2)局部变量:用户自定义的变量。用于临时存储各种类型数据。语法:Declare@变量名数据类型(长度)赋值:Set@变量名=表达式输出:Print@变量名或表达式4.2运算符与表达式
(1)算述运算符与表达式+、-、*、/、%(2)逻辑运算符
逻辑值:True、False、Unknown:不确定,某个数据型与NULL比较的结果。比较运算符:>、>=、=、语法:select字符from表where字段like"字符转义字符其它"escape‘字符"示例:设tt表中字段tt值如下:t%%%%%tt%则语句:select*fromttwherettlike"c%%"escape"c",设置c后面的第一个字符为转义字符。即c后的%为转义字符,而第二个%仍为通配符。结果为:%%%tt%,即查以%开头的字符。4.3系统内置函数
示例:
printgetdate()--返回当前系统时间printyear("201*-01-01")--返回年份
printDateadd(dd,20,"201*-01-01")--201*-01-01加20天printDateadd(mm,10,"201*-01-01")--201*-01-01加10月printDateadd(yy,10,"201*-01-01")--201*-01-01加10年
printDatediff(dd,"201*-01-01",getdate())--当前天数减指定日期的天数据
printDatepart(mm,"201*-01-01")--指定日期的月份printDatepart(dd,"201*-01-01")--指定日期的日期
printdatename(mm,"201*-01-01")--返回字符串,指定日期的月份printcast(year("1979-02-26")aschar(4))+"年出生的人"+cast(datediff(yy,"1979-02-26",getdate())aschar(2))+"岁"
年龄是
4.5用T-SQL语句创建数据表及约束对象
在SQLServer201*中:
每个数据库最多有20亿个表每个表最多可以设置1024个字段
每条记录最多占8060个字节,不包括Text,NText,Image类型。
4.5.1用CreateTable语句创建表结构
CreateTable表名(字段名类型长度,字段名类型长度,….)说明:列定义必须放在括号里;参数顺序不能改动;最多可设置1024列。字段属性:Identity:自动编号。Null|notNull允许空或不允许为空字段约束:Constraint约束名primarykey(主健名)Constraint约束名unique(惟一列名)Constraint约束名foreignkey(外键名)references(引用表名)Constraint约束名check(检查表达式)Constraint约束名default默认值示例:createtableprovider(PIDchar(4)notnullprimarykeycheck(PIDlike"[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]"),--只允许输入4位英文或数字PNameNvarchar(15)notnullunique,PAddressNvarchar(20)notnullunique,PAccountChar(15)notnullunique,PLinkNanvarchar(8))4.5.2用AlterTable语句修改表结构
语法:AlterTable表名Add列名,数据类型(长度)default’默认值’notnull--添加新列Dropcolumn列名数据类型(长度)notnull--删除列Addconstraint--添加约束Dropconstraint约束名--删除列约束Nocheckconstraint约束名--设置列约束无效Checkconstraint约束名--设置列约束有效Disabletrigger触发器名禁用触发器Enabletrigger触发器名重新启用触发器说明:AlterTable语句中只能使用单个子句,即各个子句不能组合使用。(1)使用add子句添加列altertableprovideraddLinkTelchar(15)notnulldefault"00000000000"说明:可以同时设置空值约束、默认值约束;若不允许为空则必须给新增加的列指定默认值,否则出错。(2)使用altercolumn修改字段属性altertableprovideraltercolumnLinkTelchar(20)说明:将一个原来允许为空值的列为不允许为空时,必须保证表中已有记录中没有空值,而且该列没有创建索引;改变数据类型时,如果原来设置默认值约束,一般应先触除或删除约束后再修改,否则容易出错。(3)使用addconstraint子句添加列约束altertableprovideraddconstraintuniqueProviderunique(PName)说明:约束必须指定约束名,而且必须是惟一的,不能与数据库已定义的其他规则对象、默认值对象同名;若约束类型及定义没有指定列名时,必须用for指定列名;若约束类型及定义中已包含了列名,则不允许使用for子句;如果只允许有一个约束列已经设置了(检查约束除外),则原有约束未触除时不能添加新的约束;altertableprovideraddconstraintTelConstraintunique(LinkTel),default"0431-123456789"forLinkTel/*unique(LinkTel)后面叵使用forLinkTel是错误的*//*而default后面省略for也是错误的*//*默认值只能有一个,固无法执行*/(4)用nocheck|checconstraint子句设置约束无效、恢复有效altertableprovidernocheckconstraintuniqueProvideraltertableprovidercheckconstraintuniqueProvideralter(5)用dropcolumn删除字段dropconstraint删除约束altertableproviderdropconstraintTelConstraintaltertableproviderdropcolumnLinkTel说明:删除列时必须先删除该字段上创建索引和索引后,才能删除。4.5.3
用T-SQL语句、绑定、解除约束对象
(1)创建、绑定或解除规则对象语法:Createrule规则名称as条件表达式说明:规则名称必须符合标识符的构成规则;条件表达式不能包含任何字段或其他数据库对象名,可以用@开头的局部变量代表自己表中被绑定的字段;createrule不能与其他语句组合使用,必须单独作为一个批处理语句。语法:用存储过程绑定Sp_bindrule‘规则名称’‘表名.字段名’|‘自定义数据类型名’语法:用存储过程解除绑定Sp_unbindrule‘表名.字段名’|’自定义数据类型名’说明:规则不能梆定在系统的基本数据类型上。规则必须与绑定字段的数据类型相匹配,不能绑定在text,image字段上;若被绑定字段上已有绑定的规则对象,则绑定新规则时原有规则被自动替换;当一个字段同时绑定规则和默认值时,默认值必须满足规则的要求。示例:createrulePAccount--前8个字符只允许数字和-as@xlike"[-0-9][-0-9][-0-9][-0-9][-0-9][-0-9][-0-9][-0-9]"execsp_bindrule"PAccount","provider.PAddress"--绑定execsp_unbindrule"provider.PAddress"--解除绑定(2)使用SQL语句创建、绑定和解除默认值对象语法:Createdefault默认值名称as常量表达式说明:必须单独作为一个批处理语句。用存储过程绑定和解除语法:Sp_bindefault‘默认值名称’,’表名.字段名’|自定义数据类型名Sp_unbindefault‘表名.字段名’|自定义数据类型名说明:不能将默认值对象绑定到标认列(indentity自动编号),不能绑定到在企业管理创建表时已设置默认值字段,也不能绑定到基本数据类型上;若被绑定字段上原有绑定的默认值对象,则绑定新默认值对象时原有默认值对象被自动替换。若绑定成功则sp_bindefault返回0,失败返回1.createdefaultdefaultAccountas"0000-000-0000"execsp_bindefault"defaultAccount","provider.PAccount"4.6查看表信息、输入数据、编辑和删除记录(1)显示表结构及相关性Sp_help表名(2)插入记录语法:Insert[into]表名[字段列表]Values[值列表]说明:只参添加一条记录;顺序可以任意,但个数、顺序和类型必须一致;字段列表可以省略,但顺序必须与表中字段顺序一致,自动编号标识列不允许提供数据(直接省略,也不能使用逗号),允许为空的字段不提供数据时必须使用null;只有允许为null的列才能省略不提供数据,自动编号字段必须省略;字符型与日期类型用单引号括起来;默认值用default代理默认值;可以嵌套使用子查询的数据,但必须使用圆括号括起来。示例:insertintoprovidervalues("SDLC","山东省浪潮集团","济南市大山路15号","1002-305-5","赵群","0431-2569874")语法:Insert目标表名字段列表select字段列表from源表名where条件示例:inserttProviderselectPId,Pname,Paddress,PAccount,PlinkNanfromprovider4.6.3向表中插入文本或图像数据
使用企业管理器或Insert语句可以直接向text,ntext字段的行内输入添加数据,但数据最大长度不能超过对应的char,nchar数据类型允许的长度。语法:WriteText表名.列名指针数据库说明:对现有text,ntext或image列进交互或更新,原有数据将被完全覆盖。默认状态下,不被记录入事务日志;指针表示指向text,ntext或image数据的指针,其数据类型必须为binary(16);最大长度为120K.不能用在视图中的text,ntext和image列上。执行WriteText语句必须用TextPTR指针获取有效的文本指针。示例:inserttProviderselectPId,Pname,Paddress,PAccount,PlinkNanfromprovidersp_dboptionDianNaoXS,"selectinto/bulkcopy","true"--允许大容易复制updateEmployeesetDescription=nullwhereid="11001"--执行更行,以获得指针declare@ptrtextbinary(16)--定义变量select@ptrtext=textptr([Description])fromEmployeewhereid="11001"--获得文本指针writetextEmployee.Description@ptrtext"201*毕业于清华大学"--复制大容量数据sp_dboptionDianNaoXS,"selectinto/bulkcopy","false"--取消允许大容量复制语法:TextCopy[/s服务器名][/U登录名][/P登录密码][/D数据库名][/T表名][/C列名][/Wwhere(条件){/i|/o}]/i:指定的图像或文本输入保存到数据表中。/o:把图像或文本从字段输出保存为指定磁盘。安装时不在目录中,从安装盘上x86文件中获取,拷贝到\\80\\Tools\\Binn文件夹内。updateEmployeesetPhoto=0xwhereid="11001"--执行更行,以获得指针declare@svarchar(200)set@s="textcopy/Usa/Psa/DDianNaoXS/TEmployee/CPhoto/Wwhere(id=11001)/FF;\\f.jpg/i"execmaster..xp_cmdshell@s4.6.3数据表的复制
语法:Select字段列表into新表from源表where条件说明:源表上绑定的约束不能被复制。4.6.5更新、编辑或删除
语法:Update表名Set列名=值,列名=值…from表名UpdateText表名.列名指针null|位置null|长度数据Delete表名from表名Where条件TrunCateTable表名快速永久删除全部记录。只保留表结构。4.6.2DropTable删除数据库及约束
DropTable表名说明:一次可以删除多个表,但不能删除系统表;不能删除有外键约束的表;数据、结构、约束、索引都将同时被删除。习题:
1.SQLServer提供的系统数据类型有(二进制)(数值)Unicode数据、(字符)(日期)和货币数据,也可以使用用户定义的数据类型。
2.文本和图像数据在SQLServer中是用text,ntext和image数据类型来表示的,由于它们的数据量一般较大,所以经常被存储在专门页中,在数据行的相应位置处只保存储指向这些数据存储位置的(指针).SQLServer201*中,使用(sp_tableOption)可用于指定表中文本和图像数据是否在(表中的行)中存储。
3.创建表用(createtable)语句,向表中添加记录用(insertinto)语句,查看表的定义信息用(sp_help)语句,删除表用(droptable)语句。4.规则的作用是(用于字段的检查约束,限制该字段的输入范围).创建规则有(createrule)语句,删除规则用()语句。在列或自定义数据类型上绑定规则用(sp_bindrule)语句。解除绑定的规则用(sp_unbindrule)语句。再次向已经绑定了规则的列上绑定规则,将会(原有规则被自动替换)。
5.默认值的作用是()。创建默认值用(createdefault)语句。删除默认值用()语句。绑定默认值用(sp_bindefault)语句。解除绑定的默认值用(sp_unbindefault)语句。
6.如果当前日期为201*/9/17,下面可以返回17函数是(datepart(day,getdate()));7.执行下面语句;结果是:1,2,1.40
createtablenumbers(n1int,n2numeric(5,0),n3numeric(4,2))goinsertnumbersvalues(1.7,1.6,1.4)select*fromnumbers
8.若想删除orders表中所有超过3年的老定单,可以使用的SQL语句是(deletefromorderwhereorderTime[记录范围]-->字段列有[into][From][where][Groupby]Having[Orderby]Compute
(2)Compute子句不能与into或groupby子句同时使用。
5.1.2无数据检索
select"helloword"select256*256select你好="helloword"select计算=256*256select@@versionselect@@language5.1.3指定字段列表及列别名
*:全部数据表字段表名.*:多表查询时指定表的全部字段语法:Select字段From表where条件说明:多表查询时同名字段必须加表名前缀;可以有计算列。别名相当于字段变量。别名不允许出现在其他表达式中。5.1.4指定范围
ALL|Distinct[Row]|Topn[percent]ALLDistinctTop三项参数必须单独使用,不能同时出现在一个select语句中。selectall*fromsale--表中所有数据selectdistinct*fromsale--去掉重复项selecttop5*fromsale--前5条数据selecttop20percent*fromsale--前20%条数据select商品信息=id+","+name,每件毛利=PurchasePrice*0.1,30*2+5as字段外数据,256*256fromGoods5.1.5使用Where子句
说明:where必须在from后面。selectid,name,spec,原参考价格=PurchasePrice,下浮后价格=PurchasePrice*0.75fromGoodswherePurchasePrice*0.75="201*-2-1"anddateTime名.列名”,不允许使用”表名.列名”5.2.3外连接left|right|full|join
(1)左外连接Select字段列表From表1leftjoin表2on表1.列名=表2.列名说明:默认按左表的主键顺序排序(2)右外连接Select字段列表From表1rightjoin表2on表1.列名=表2.列名(3)全外连接
返回左表与右表的全部记录。Select字段列表From表1fulljoin表2on表1.列名=表2.列名(4)自内连接join是一张表自己对自己的内连接,即在一张表的两个副本之间进行内连接。使用自连接时,必须为两个副表指定别名。
Select字段列表From表as别名1join表as别名2on别名1.列名=别名2.列名5.2.5使用Into子句创建新表
Select字段列表into新表名from源表名where条件说明:into子句必须是select语句的第一个子句。新表名可以是以#开头的临时表,也可以记录表,新表中没有原表字段上绑定的约束对象。用户必须有创建表的权限。Into子句不能与compute子句一起使用。5.3用select语句对数据进行统计汇总5.3.1集合函数不清
Avg([ALL|Distinct]列名)Sum([ALL|Distinct]列名)Max([ALL|Distinct]列名)Min([ALL|Distinct]列名)Count([ALL|Distinct]列名)Count(*)说明:Count(*)可以包括空值记录,其他函数均不统计空值记录。集合函数使用Distinct时则不允许使用计算列或字段列名。集合函数将查询结果集统计为单一数据,即汇总为一条记录,在select中使用了集合函数就不允许再指定字段名,用Groupby指定的字段除外。5.3.2用Groupby子句对记录分类统计汇总
按某一字段的数据值进行分类之后再进行统计格式:Groupby分组字段Having条件说明:使用Groupby子句时,select指定的字段必须包含且只能包含Groupby子句中指定的分组字段,其他必须是由集合函数组成的一个或多个计算列。Groupby子句不允许使用字段或计算的别名,可直接使用表达式。Groupby子句指定表达式时,select指定的字段中可以不包括该表达式。Having子句用于指定统计结果所要满足的条件,表达式中可以直接使用计算列的表达式而不允许使用别名。Having子句必须配合Groupby子句使用,且设置的条件必须与Groupby子句指定的分组字段有关。使用Groupby的Select语句仍然可以使用Orderby子句统计结果排序,但必须在Groupby之后,可以使用别名但不允许对select没指定的列Having子句是对分组统计后的查询结果进行筛选,在统计结果中选择满足条件的记录作为统计汇总后的结果集。使用Groupby的select语句仍可使用where子句指定条件,但where子句是在分组前对原表记录进行筛选,使满足条件的记录参加分组统计。分组字段会过滤null,null被忽略selectname,商品数量=count(id),平均价格=avg(purchasePrice)fromgoodsgroupbynameselect职工人数=count(*),平均年龄=Cast(avg(year(getdate())-year(brithday))asvarchar(2))+"岁",最大年龄=max(year(getdate())-year(brithday)),最小年龄=min(year(getdate())-year(brithday)),平均工龄=Cast(avg(year(getdate())-year(WorkTime))asvarchar(2))+"年",最长工龄=max(year(getdate())-year(worktime)),最短工龄=min(year(getdate())-year(worktime))fromemployeeselectGoodId,销售总量=sum(num),平均价格=avg(SalePrice),销售总额=sum(SalePrice)fromSalewhereGoodname"计算机"groupbyGoodIdselectGoodId,销售总量=sum(num),平均价格=avg(SalePrice),销售总额=sum(SalePrice)fromSalegroupbyGoodIdHavingGoodname"计算机"--出错,因为在分组结果没有Goodname5.3.4用Compute子句显示参加统计的清单及统计结果
语法:Compute集合函数(列名)说明:Compute子句可以指定多个集合函数,但不允许指定别名。Select指定的字段列表是显示详细使用的字段,必须包含Compute子句集合函数使用的列名1,与by分组字段列名2无关,也可以使用(*)表示全部字段。Compute子句不带by表示对全部记录统计,相当于在select查询结果后面带一个统计值的后缀.Compute子句带by表示对全部记录统计,必须配合orderby排序子句使用,且紧跟orderby之后。By后的列名2是要分组的字段(相当于groupby),可以不在select指定的字段中,但必须包含在orderby子句中,而且必须是第一顺序。By指定多个字段分组时,也必须与orderby的第一顺序一致。Compute子句不能与into子句或groupby子句同时使用。一个select语句中可以使用多个compute子句,一个子句显示一个附加行,多个子句时by分组字段必须一致,且与orderby一致,子句之间不能使用逗号。select*fromsaleorderbyHandlers,DateTimecomputesum(Price)byhandlers5.4Select合并结果集与子查询5.4.1合并查询结果集
UNION关键了可以把两个以上的查询结果合并为一个结果集。语法:Select语句1UNION[ALL]select语句2说明:Union所合并的是两个select的查询结果集而不是合并被查询的数据表,两个结果集必须具有相同的列数、相同的对应数据类型。合并后结果集中的列名来自第一个select语句任一个select中若包含orderby子句都将被对最后的结果集排序。使用All关键字则不删除重复行,保留两个结果集的全部,若不指定ALL则默认在合并后的结果集中删除重复行。selectDateTime,Customer,GoodName,numfromSaleAwherePrice>=1000UnionselectDateTime,Customer,GoodName,numfromSaleBwherePrice(selectavg(price)fromsale)(2)使用子查询的一列值进行列表包含in运算select*fromgoodswhereidin(selectgoodidfromsale)(3)使用子查询的一列值进行列表比较ANY/ALL运算只要有一个比较成立:ANY结果为true只有全部比较都成立:ALL结果为true.select*fromgoodswhereid=ANY(selectgoodidfromsale)(4)相关子查询及记录的存在性[not]exists
相关子查询就是子查询的执行依赖于外部查询,子查询根据外部查询提供的数据得到结果,再将结果返回给外部查询。
外部查询可以使用存在逻辑运算[not]exists检查相关子查询返回的结果集中是否包含有记录。若子查询结果集包含记录,则exists为true,否则为false.存在性的逻辑值没有UnKnown.相关子查询引用外部查询的表时可以使用该表的别名。select*fromGoodswhereexists(select*fromsalewheregoods.id=sale.goodid)5.6视图的基本概念
视图:就是基于一个或多个表的动态数据集合,是一个逻辑上的虚拟数据表。可以直接在视图在对数据进行编辑修改删除更新数据表中的数据。Select,Insert,update语句都可以直接对视图进行操作。
使用视图的优点:1)为用户集中数据、简化查询和处理2)屏蔽数据库的复杂性3)简化用户权限的管理4)实现真正意义上的数据共享5)重新组织数据。
5.7视图的创建和使用。5.7.1对创建视图的限制和要求
创建视图只能在当前数据库中进行,创建视图不能引用临时表。视图的命名不必须遵循标识符命名规则,在一个数据库中对每个用户所定义视图名必须
是惟一的,也不能与表同名。
一个视图最多只能有1024个字段。
可以引用其他视图或被其他视图引用,但视嵌套引用不能超过32层。不能把规则、默认值或触发器绑定在视图上。不能在视图上建立任何索引。
定义视图的select查询不能包含以下子句:into,orderby,compute。使用视图时,如果它引用基本表添加了新字段,则必须重新创建或修改视图才能查询使
用新字段。
如果与视图相关联的表或视被删除,则视该视图不能再使用。
5.7.3使用SQL语句创建和使用视图
语法:Createview视图名[withEncryption]asselect查询[withcheckoption]说明:Encryption:要求系统存储时对该createview语句进行加密,不允许另人查看和修改CheckOption:与定义视图中的select语句的where子句配合使用,指定对视图中数据的修改必须遵守where子句设置的条件,不满足条件的数据不允许修改,保证修改后的数据能通过视图查看,省略时可以不违反约束前提示任意修改,但修改后不满足条件记录不再出现在视图。5.8.2用SQL语句查看编辑删除视图
Sp_help视图名Sp_helptext视图名Sp_depents视图名AlterView视图名[withEncryption]asselect查询[withcheckoption]DropView视图名习题
(1)select语句使用(ALL)(Topn)(Distinct)指定查询的显示范围,使用(into)子句创建新表,使用(orderby)子句指定排序字段,使用(where)指定查询条件,使用(groupby)指定分组条件,使用(compute)指定分组后的查询条件。
(2)select语句对查询结果排序时,使用(orderby)子句指定排序字段,使用(asc)指定升序,使用(desc)指定降序.
(3)select语句对多表查询可以使用(交叉连接)(内连接)(外连接)(自连接)连接方式,子查询分为(嵌套子查询)(相关子查询)两种
(4)视图是由()构成的而不是由()构成的虑表。视图中的数据存储在(数据表)。对视图更新操作时实际操作的是(基表)中的数据。
(5)创建视图用(createview)语句,修改视图用(alterview)语句,删除视图用(dropview)语句。查看视图中的定义数据用(select)语句。查看视图的基本信息用(sp_help)存储过程。查看视的定义信息用(sp_helptext)存储过程。查看视图的依赖关系用(sp_depends)存储过程.
(6)创建视图带(Encryption)参数使视图的定义语句加密。带(CheckOption)参数对视图执行的修改操作必须遵守定义视图时Where子句指定的条件。(7)更新视图中的数据进,应该注意()()().
(8)下列可用于创建一个新表,并用已存在的表的数据填充到新表中的是(selectinto)(9)(comoute)子句为聚合函数生成汇总值,并作为一个附加的行显示在结果集中。(10)有关comoute子句说法正确的是:(A)?
A.compute子句为聚合函数生成汇总值B.compute子句必须包括orderby子句C.compute子句只在控制中断时会给出汇总。D.compute子句对排序进行筛选.(11)(exists)可以与子查询一起使用检查行或是否存在。(12)子查询可以返回()行而不产生错误。
A.仅一行B.如果不以ANY,ALL,Exists或IN开头,则仅一行。C.无限多行D.如果不以ANY,ALL,Exists或IN开头,则为无限行。
13)使用子查询时爱一定的限制,下列说明正确的有(包括Groupby的子查询不能使用Distinct关键字)(如果外部查询的Where子包括某个列名,则该子句必须与子查询选择列表中的该列在联接上兼容)两项。
14)当子查询使用来自父查询的参数,我们称之为(相关子查询).15)我们将调用另一个子查询的子查询称为(嵌套子查询);16)从“产品”表里查询出价格高于产品名称为“海天酱油”的产品记录,此SQL语句为(select*from产品where价格>(select价格from产品where产品名称=’海天酱油’)).17)为数据库中一个或多个表提供另一种查看方式的逻辑表被为(视图)18)SQLServer最多允许视图嵌套(32)级。19)SQLServer的视图最多可包括(1024)列
20)在SQL数据库中,要得到Products表中最贵的产品的产品名称productname和产品价格price应该使用的查询是:
A.selecttop1productname,pricefromproductsorderbyprice出错,procutname不在groupby分组中。
B.selectprocuctname,max(price)fromproducts出错,procutname不在groupby分组中。C.selectproductname,max(price)fromproductsgroupbyproductname各种产品中价格最价的。
D.selectproductname,PricefromproductwherePrice=(selectmax(Price)fromproduct)
第6章数据库索引
6.1索引概述6.1.1什么是索引
索引是一个在表或视图上创建的对象,当用户查询索引字段时,它可以快速实施数据检索操作。
索引提供指针以指向存储在表中指定字段的数据值。借助索引,执行查询时不必扫描整个表就能快速找到所需要的数据。
索引字段,创建索引的字段。索引列是一个字段,称为简单索引。由多个字段组合的索引,称为复合索引。索引列的值可以设置为唯一,称为唯一索引。也可以把索引设置为有重复值,称为非惟一索引。
6.1.2索引的分类:
(1)簇索引:簇索引对表的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上,即簇索引与数据是混为一体的。由于簇索引对表中的数据一一进行了排序,因此用簇索引查找数据很快。但由于簇索引簇索引将表所有数据完全重新排序了,它所需要空间大,大概相当于表中数据所占空间的120%。表的数据行只能以一种排序方式存储在磁盘上,所有一个只能有一个簇索引。
(2)非簇索引:具有与表的数据完全分离的结构,使用非簇索引不用将物理数据页中的数据按列排序。非簇索引中存储了组成非簇索引的关键字的值和行定位器。行定位器的结构和存储内容取决地数据的存储方式,如果数据是以簇索引方式存储的,则行定位器中存储的是簇索引的索引键。如果数据不是簇索引方式存储的,这种方式又称为堆存储方式,则行定位器存储的是指向数据行的指针。非簇索引将行定位器按关键字的值用一定的方式排序,这个顺序与表的行在数据页中排序是不匹配的。由于非簇索引使用索引页存储,因此它比簇索引需要更多的存储空间,且检索效率较低。但一个表最多可以建249个非簇索引。(3)性能比较簇索引每个表只能有一个快速快,取出一个范围时更快。非簇索引一个表可以有多个,最多249快速慢需要大量的硬空间和内存。可以提高从表中取数据的速度,但会降低向表中插入数据的速度。6.2创建索引
6.2.1用CreateIndex命令创建索引语法:Create[Unique][Clustered|NoNClustered]Index索引名on{表|视图}列名[ASC|DESC][with[PAD_INDEX][FillFactor=fillfactor][Ignore_Dup_Key][Drop_Existing][Statistics_Norecompute][Soort_In_Temped]][On文件组]说明:Unique:创建惟一索引,索引键值不重复。在列包含重复值时,不能创建。列不能包含null索引。Clustered:创建簇索引。默认创建非簇索引。NONClustered:创建非簇索引。一个索引中最多可以指定16个列,但列数据类型的长度不能超过900个字节。PAD-Index:指定填充索引的内部节点的行数至少应大于等于两行。只有在FillFactor选项指定后才起作用。因为PAD-Index与FillFactor使用相同的百分比。FillFactor:填充因子,它指定创建索引时每个索引页的数据占索引页大小的百分比。值为1100。Ignore_Dup_key:控制了当往包含一个惟一索引中的列中插入重复数据,SQLServer所作的反应。Drop_Existing:指定要删除并重新创建簇索引。StatisTisc_Norecompute:指定过期的索引统计不会自动重新计算。Sor_in_tempdb:指定用于创建索引的分类排序结果,将被存储到tmpdeb数据库中。OnFilegroup:指定存放的文件组说明:数据类型textntext,image或bit的列不能作为索引列。数据类型char,varchar,binary,varbinary的列宽超过900节字,或数据类型nchar,nvarchar的列宽超过450个字节时也不能作为索引列。在创建向导中不能将计算列包含在索引中。但在直接创建或使用createindex命令创建索引时,则可以对计算列创建索引。createuniqueclusteredindexPk_goods--惟一簇索引ongoods(id)withpad_index,fillfactor=10,drop_existingcreateindexindex_goods--非簇索引ongoods(id,Spec)withpad_index,fillfactor=50on[primary]6.3查询索引
Sp_helpindex表名--返回表的所有索引信息Sp_rename‘旧名’,’新名’,’index’--改名6.4删除索引
Dropindex‘表名.索引名’说明:不能删除由Createtable或Altertable命令创建的primarykey或unique约束索引,也不能删除系统表中的索引。6.5设计索引
创建索引的思路:
(1)主键时常作为where子句的条件。
(2)有大量重复值且经常有范围查询和排序、分组发生的列。非常频繁被访问的列。可以建立簇索引。
(3)经常同时存取多列,且每列都含有重复值。
(4)如果知道索引键所有值都有是惟一的,可以定义惟一索引.
(5)在一个经常做插入操作的表上建索引是,使用fillfactor来减少页分裂,可以提高并发度降低列锁发生。
(6)设法选择那些采用小数据类型列作为索引列。(7)下面情况不应该使用索引
1)索引总是不能被优化程序使用。
2)返回的记录数高于总记录10%20%。3)该列只有一个、两个或三个不同的值。4)被索引的列较长工
5)维护索引的开销超过了建立索引的价值。
6.6索引的维护
(1)重建索引
下面需要重建索引:
1)数据和使用模式大幅度变化。2)排序的顺序发生改变。
3)要进行大量插入操作或已经完成
4)使用大块I/O的查询的磁盘读次比预料的要多.
5)由于大量数据修改,使得数据页和索引页没有充分使用而导致空间的使用超出估算。(2)索引统计信息的更新
下面情况需要运行updatestatistics命令:1)数据行的插入和删除修改了数据上的分布
2)对用truncatetable删除数据的表上增加数据行。3)修改索引列的值。
习题:
1)在SQLServer的数据库中按存储结构的不同将索引分为两类:(簇索引)和(非簇索引);2)在使用Createindex语句创建簇索引时使用关键字(Clustered);建立惟一索引的关键字是()3)查看索引使用的系统存储过程(sp_index),为索引更改名称使用系统存储过程(sp_rename)4)下列(A)类型的索引总要对数据进行排序
A.聚集索引B.非聚集索引C.组合索引D.惟一索引5)一个表最多允许有(249)个非聚集索引6)一个组合索引最多可包含(16)列
第七章T-SQL程序设计、自定义类型、函数和游标
7.1批处理、脚本、注释与变量7.1.1批处理的概念
批处理就是一个或多个相关SQL语句的集合,用GO语句作为批处理的结束标志。若没有GO语句,默认所有的语句属于一个批处理。
SQLServer的程序发送和编译以批处理为一个程序执行单元。如果一个批处理中任何一个语句有语法错误,则整个批处理都不能执行,若只是批处理中的某个语句有很执行错误,则该语句不能执行,其他语句仍可以正常执行。编写SQL语句注意事项:
1)CreateDefault,Createrule,Createview,CreateProcedure,CreateTrigger,都必须单独作为一个批处理,不能与其他语句放在一个批处理中。
2)不能创建定义check检查索引后在同一个批处理中马上使用这个约束。
3)不能把默认值或规则对象绑定到字段或自定义类型以后,在同一个批处理中马上使用它们。
4)在一个批处理中定义的局变量只在该批处理中有效,不能用于其他批处理。5)批处理结束语句GO必须单独一行,可在其后使用注释。
6)如果批处理第一个语句是执行存储过程,则语句开头的execute关键字可以省略,否则不允许省略。
7.1.2SQL脚本文件
脚本就是包含一个或多个批处理的程序文件。
7.1.3SQL注释
(1)行内注释:--(2)块注释:/**/
7.1.4局部变更和全局变量
分为两类:局部变量和全局变量(1)局部变量1)声明定义语法:Declare@变量类型(长度)说明:局部变量必须以@开头以区别字段名变量。变量名必须符合标识符的构成规则。变量的数据类型可以是系统类型,也可以用户自定义类型,但不允许是text,ntext和image类型2)赋值Set@变量名=表达式Select@变量名=表达式说明:Set只能给一个变量赋值,而select可以给多个变量赋值。表达式中可以包含select语句子查询,但只能是集合函数返回的单值。且必须用圆括号括起来。Select也可以直接使用查询的单值结果给局部变量赋值。Select@变量=表达式或字段from表3)用print、select显示变量的值语法:Print表达式Select表达式说明:使用print必须有且只能有一个表达式,其值在查询分析器的消息窗口显示。Select可以有多个表达式,结果以数据表的格式在查询分析器的栅格显示。4)作用域
在一个批处理、一个存储过程或一个触发器内,其生命周期从定义开始到它遇到第一个GO语句或者到存储过程、触发器结尾结束。即只在当前批处理、存储过程或触发器内有效。(2)全局变量:系统定义的无参函数
全局变量是由系统提供的有确定值的变量,用户不能自定义全局变量,也不能用Set语句业修改全局变量的值,只可使用全局变量的值。全局变量都是以@@开头的。@@error@@max_connections:@@connections:@@version@@cursor_rows@@fetch_status最后一次执行错误的SQL语句产生的错误代码SQLServer允许多用户同时连接的最大数最近一次启动后已连接或尝试连接的次数本地SQLServer服务器的版本信息得到已打开的游标中当前存在的记录行数游标的当前状态7.2T-SQL流程控制语句7.2.1Begin..End
语法:Begin语句1语句2End说明:无论多少个语句,放在Begin..end中间就构成一个独立的语句块,被系统当作一个整体单元来处理。条件的某个分支或循环体语句,如果要执行两个以上的复合语句,则必须将它们放在Beign..end中间作为一个单元来执行。7.2.2IF/Else条件语句
语法:IF条件表达式语句块1Else语句块2说明:条件表达式中可包含select子查询,但必须用圆括号括起来。ifexists(select*fromgoodswherestock提示信息=casewheng.Stock>=50then"货源充足,不需考虑"wheng.Stock>=20then"可以维护,以后再说"wheng.Stock>=10then"已经不多,准备进货"wheng.Stock>=0then"马上缺货,抓紧进货"wheng.Stock=0then"已经缺货,马上进货"endfromgoodsgleftjoinV_providervong.id=v.货号7.2.4WaitFor暂停语句
语法:WaitForDelay‘时间’|Time‘时间’功能:使程序暂停指定时间后再继续执行。Delay:指定暂停时间长短相对时间。Time:指定暂停到什么时间再重新执行程序绝对时间。‘时间’参数必须是datatime类型的时间部分,格式为”hh:mm:ss”,不能含有日期部分select程序开始时间=getdate(),开始的时间秒数=Datepart(second,getdate())gowaitfordelay"00:00:20"--延迟20秒select延迟以后的时间=getdate(),延迟后的时间秒数=datepart(second,getdate())go7.2.5While循环语句
语法:While逻辑条件表达式Begin循环体语句系列[break][continue]Enddeclare@iint,@sumintselect@i=1,@sum=0while@i7.3.2创建自定义类型
语法:Sp_addtype数据类型名,系统数据类型名,Null|NotNull,所有者说明:凡是包含带有长度的系统数据类型,如char(5)必须使用括号括起来用户自定义类型的命名必须惟一,不同名字可以定义相同的类型。execsp_addtypeteletephone,"varchar(24)","notnull"execsp_addtypefax,"varchar(24)","null"7.3.3删除自定义类型
Sp_dropType自定义数据类型名--删除自定义数据类型execsp_droptypefax7.4用户自定义函数
SQLServer201*支持三种用户自定义函数,即标量函数、内嵌表值函数和多语句表值函数。
7.4.1创建自定义函数
语法:CreateFunction所有者.函数名[@参数名as数据类型[=默认值]]returns返回值类型[as]Begin函数体SQL语句Return数值表达式End说明:自定义函数必须在当前数据库中定义。函数名:必须符合标符构成规则,必须惟一,所有者默认系统管理员dbo.@参数名:用局部变量定义的形式参数,用于接收调用函数时传递过来的参数。调用与系统标准函数调用相同,但必须写出“所有者名称.函数名”并在圆括内给出参数createfunction相对年龄(@出生年月datetime,@defyearint)returnsintasbeginreturn@defyear-year(@出生年月)endgoselectname,brithday,到201*的年龄=dbo.相对年龄(brithday,201*)fromemployeewheredbo.相对年龄(brithday,201*)7.5游标的创建与使用7.5.1游标的概念
游标的主要用途是在T-SQL脚本程序、存储过程和触发器中对Select语句返回的结果集进行逐行逐字段处理,把一个完整的数据表按行分开,一行一行地逐一提取记录,并从这一记录中逐一提取各项数据。
游标与变量类似,必须先定义后使用。
游标的使用过程:定义声明游标>打开游标从游标中提取记录并分离数据关闭游标释放游标.
7.5.2定义游标
语法:Declare游标名Cursor[Forward_only|Scroll][Static|KeySet|Dynamic|Fast_ForWard][Read_Onley|Optimistic][Type_Warning]froselect语句[forUpdate[Of字段]]说明:Forward_only:指定该游标的顺序结果集,只能用next语向后方式顺序提取记录。SCRoll:滚动结果集可以使用向前、向后或定位方式提取记录。Static与Insensitive含义相同:在系统Tmepdb数据库中创建临时表存储游标使用的数据,即游标不会随基本表内容而变化,同时也无法通过游标来更新基本表。KeySet:指定游标中列的顺序是固定的,并且在tempdb内建立一个KeySet表,基本表数据修改时能返回到游标中。如果基本表添加符合游标的新记录时该游标无法读取。如果游标中的一行被删除掉,则用游标提取时@@Fetch_status返回-2。Dynamic:游标中的数据将随基本表而变化,但需要大量的游标资源。Fast_ForWard指定ForWard_Only而且Read_only类型游标。使用Fast_Forward参数则不能同时使用ForWard_only、Scroll、Optimistic或ForUpdate参数.Optimistic指明若游标中的数据已发生变化,则对游标数据进行更新或删除时可能会导致失败。Type_Warning:游标中的数据类型被修改成其他类型时,给客户端发送警告。7.5.3打开游标
语法:Open[Global]游标名说明:Global:打开全局游标。打开游标后,可以使用全局变量@@Error判断该游标是否打开成功。0成功@@Cursor_Rows可得到打开的游标中当前存在的记录行数。其返回值为:0:无符合条件的记录或该游标已经关闭或翻译。-1:该游标为动态的,记录行经常变动无法确定。n:指定的结果集已从表中全部读入,总共n条记录。-m:指定的结果集还没有全部读入,目前游标中有m条记录。7.5.4用Fetch语句从游标中提取数据语法:Fetch[next|prior|first|last|absolute{n|@nvar}|relative{n|@nvar}]From[Global]游标名[into@变量名]说明:在游标内有一个游标指针Cursor指向游标结果集的某个记录行称为当前行,游标刚打开时Cursor指向游标结果集第一行之前。Fetch之后的参数为提取记录的方式,可以是以下方式之一:Next:顺序向下提取当前行的下一行。处理完最后一行,再用FetchNext则Cursor指向结果集最后一行之后,@@Fetch_status的值为-1.Prior:顺序向前提取当前记录的前一行,并将其作为当前行。第一次用FetchPrior对游标操作时,没有返回记录返回,游标指针Cursor为指向第一行之前。First:提取第一条。Last:提取最后一条。Absolute{n|@nvar}:按绝对位置提取游标结果集的第n或第@nvar条记录。n为负提取结行之前。n为整数。Relative{n|@nvar}:按相对位置提取当前记录之后(正数)之前(负数)的第n或@nvar条记录。打开游标后用@@Fetch_Status检测游标的当前状态:0:Fetch语句提取记录成功:-1:失败或提取记录不在结果集内-2:被提取的记录已被删除或根本不存在。@@Fetch_Status只能检测游标提取记录后的状态,若用循环条件输出多条记录时,必须在循环之前先用Fetch提取一条记录。7.5.5关闭游标语法:Close[Global]游标名作用:翻译游标中结果集,解除游标记录行上的游标指针。当游标提取记录完毕后,应及时关闭该游标释放结果集的内存空间。游标关闭后,其定义结构仍然存储在系统中,但不能提取记录和定位更新,需要时可以和Open再次打开7.5.6释放游标语法:Deallocate[Global]游标名作用:删除指定的游标,释放该游标所占用的所有系统资源。declareCsEmployeecursorkeyset--定义游标forselectname,sex,age=datediff(yy,brithday,getdate()),departmentfromemployeewheredatediff(yy,brithday,getdate())0beginprint"游标记录数为:"+convert(varchar(2),@@cursor_rows)declare@xmvarchar(8),@xbnchar,@nlint,@bmnvarchar(5),@rsint,@pjnlintfetchabsolute2fromCsEmployeeinto@xm,@xb,@nl,@bm--提取记录print"第2条记录:"+@xm+@xb+@bmfetchrelative2fromCsEmployeeinto@xm,@xb,@nl,@bmprint"后移2条记录:"+@xm+@xb+cast(@nlaschar(2))+@bmset@rs=0;set@pjnl=0;print"全部记录为:"fetchfirstfromCsEmployeeinto@xm,@xb,@nl,@bm--先提取第一条记录while@@fetch_status=0beginprintcast(@rs+1aschar(2))+":"+@xm+@xb+cast(@nlaschar(2))+@bmfetchnextfromCsEmployeeinto@xm,@xb,@nl,@bmset@rs=@rs+1set@pjnl=@pjnl+@nlendprint"实际统计记录数为"+cast(@rsaschar(2))+"平均年龄为:"+cast(@pjnl/@rsaschar(6))endendelseprint"游标打开失败!"closeCsEmployeedeallocateCsEmployee习题:
1.什么是批处理批处理用()作结束樗,建立批处理有哪些注意事项?2.什么是脚本?脚本文件的扩展名是(),执行脚本的方法是()、()。3.注释是程序中不被执行的正文,其作用是(),SQLServer中的注释语句有()和()。4.T-SQL的局部变量用()声明,给变量赋值的语句是()、(),输出语句是()、()。5.局部变量的作用域是(),从()开始,到()结束。6.CASE表达式用于(),它可以用在()地方并根据条件的不同而返回()。CASE表达式它不能单独执行,而只能作为()来使用。CASE表达式分为()和()两种类型。7.执行WHILE语句时,当条件成立时(),当条件不成立时()。在循环体内使用BREAK或CONTNUE,可以()。
8.用户自定义数据类型的作用是(),用户自定义数据类型用()语句创建,用()语句删除。
9.用()语句创建自定义函数,函数参数的作用是(),用()指定返回类型,用()指定返回值。
10.定义游标用()语句,打开游标用(),提取数据用(),关闭用(),释放删除用()。11.下列语句能否正确执行?为什么?DECLARE@assvarchar(50)SET@ass=’sadfasf’GO
PRINT@ass
12.SQLServer提供的注释类型有()两项。
13.@n是使用Declare语句声明的一个局部变量,能对变变量赋值的语句是()。14.阅读下面T-SQL语句,对变量赋值时存在错误的是()两项。15.下列()语句可以用来从WHILE语句块中退出。
16.要将一组语句执行10次。下列()结构可以用来完成此项任务。17.有以下代码:Declare@xintSet@x=1While@x语法:Createprocedure存储过程名[;整数][@形参数据类型][Varying][=默认值][output][withrecompile|encryption|{recompile,encryption}][forreplication]AsSQL语句系列遵守规则:名称标识符的长度最大为128个字符,且必须唯一。每个存储过程最多可以使用1024个参数。存储过程的最大容量有一定的限制。存储过程支持多达32层嵌套。在对存储过程命锂最和系统存储过程区分。说明:可以创建永久存储过程,也可以创建一个在一个会话中临时使用的局部存储过程(名称前加#),还可以创建一个在所有会话中临时使用的全局存储过程(名称前加##)整数:可作为同名过程分组的后缀序号。同组的过程将来可以用一条dropproedure全部删除@形参:所有数据类型都可以作为参数类型。Varying:仅适用于游标参数,指定形参变量可作支持结果集返回参数。Recompile:执行完存储过程后不保留存储过程的备份,每次执行都需要对存储过程重新编译。Encryoption:存储过程作为数据库对象在系统的syscomments表中留下完整的代码信息,并对访问这些数据的入口进行加密。createprocgood_pro1@goodnamenvarchar(8)asselects.datetime,p.pname,g.Name,s.num,s.receivepricefromGoodsgjoinstocksons.goodid=g.Idjoinproviderponp.pid=s.provideridwhereg.name=@goodnameexecgood_pro1"计算机"8.1.3用execute执行存储过程语法:Execute@整型变更=存储过程名[参数列表]8.1.4用execute执行SQL语句Execute(@字符串变量|[n]’SQL语句字符串’)exec(N"select*fromgoods")exec("select*fromgoods")8.2.2查看存储过程定义查看存储过程的定义Sp_helptext存储过程名加密看不到查看参数及一般信息sp_help存储过程名查直相关信息sp_depends存储过程名8.2.3修改、删除存储过程修改存储过程Alterproc存储过程名asSQL语句重命名Sp_rename原名,新名删除Dropproe存储过程名8.3触发器的创建和使用8.3.1触发器的概念(1)触发器
是一段自动执行的程序,是一种特殊的存储过程,其特殊在于:1)不允许使用参数,没有返回值;2)不允许用户调用,当对表进行插入、删除和修改操作时由系统自动调用并执行。
触发器可以实现复杂的完整性约束:1)扩展约束、默认值的规则对象的完整性检查。2)自动生成数据。3)检查数据的修改,防止对数据不正确的修改,保证数据表之间数据的正确性和一致性。4)自定义复杂的安全权限(2)用途和优点
实现数据库中多个表的级联修改;检查数据输入的正确性;检查数据修改的正确性。(3)触发器的触发方式
在数据表中某个字段设置触发器后,当该字段的数据被插入、删除或修改更新时,触发器便被激活并自动执行。
SQLServer按触发器被激活的时机分为“后触发”“替代触发”两种。
1)后触发:或引发触发器执行的语句通过了各种约束检查,成功执行后才激活并执行触发器程序。特点:若引发触发器执行的语句违反了某种约束,该语句不会执行,则后触发方式的触发也不会被激活;只能创建在数据表上,不能创建在视图上;一个表可以有多个后触发触发器。
2)替代触发:若激活触发器的语句仅仅起到激活触发器的作用,一旦激活触发器后该语句即停止执行,立即转去执行触发器的程序逻辑激活触发器语句并不被执行,相当于禁止某种操作。特点:保以创建在表上,也可创建在视图上。一个表只能有一个替代触发的触发器。(4)临时表
无论后触发或替代触发,每个触发器被激活时,系统都自动为它们创建两个临时表inserted和deleted表。
两个表的结构与激活触发器的原数据表结构相同。
用Insert语句插入记录激活触发器时,系统在原表中插入记录的同时,也自动把插入的记录插入到inserted临时表。
用delete语句删除记录激活触发器时,系统在原表中删除记录的同时,会自动把删除的记录添加到deleted临时表。
有update语句修改数据激活触发器时,系统在先原的表中删除其有的记录,删除的记录被添到deleted临时表,然后再插入新数据记录,新插入的记录同时被插入到inserted临时表。
用户可用select语句查询这个临时表,但不允许进行修改。触发器一旦执行完成,这个表将被自动删除。8.3.2创建触发器语法:CreateTrigger[拥有者.]触发器名On[拥有者.]表名|视图名{fro|after|insteadof}[inset,update,delete][withencryption][notfromreplication]As[setnocunot]不返回给变更赋值的结果SQL语句系统[RollbackTransaction]--事务回滚说明:For与alter:相同,创建后触发触发器Insteadof:创建替代触发触发器.Withencryption:对触发器文本进行加密,禁止查阅修改。Notforreplication:在复制过程中,不激活触发器操作。Setnocount:触发器一般不能有返回值,所以也不应该用select语句进行查询或给变量赋值,如果必须使用变量赋值语句,可能在开头使用该语句避免返回结果。SQL语句:即可以包含获得被操作的select语句。后触方式被操作数据一定在inserted或deleted临时表中。如果被操作的数据是多值的,可用in判断是否被包含在其中:被操作数据in(select被操作字段from临时表)如果被操作的数据是单值,可用下面语句Select@变量=被操作字段from临时表``说明:Createtrigger语句必须是一个批处理的第一条语句。创建触发器的权限默认属于表的所有者,而且不能授权给其他人。触发器不能在临时表或系统一是创建,后触发也不能创建在视图上。一个触发器只能创建在一个表上;一个表可以有有一个替代触发器和多个后触发器(可以是同一种操作类型,可同时触发)由于TruncateTable语句删除记录时不被记入事务日志,所以该该语句不能激活deleted删除操作的触发器如果外键所引用的父表已创建了对子表级联修改或删除的触发器,则子表不允许创建具有相同动作的替代触发器。触发器的定义中不能有任何create,alter语句。也不允许使用drop删除语句,也不允许使用下列语句:Grant/restoredatabase/restorelogrevoke/truncatetablecreatetriggerDelGoodsongoodsfordeleteasdeleteSalewheregoodidin(selectidfromdeleted)8.3.4禁用/启用触发器禁用:altertable表名disabletrigger触发器名启用:altertable表名enabletrigger触发器名8.4触发器的查看、编辑、重命名与删除查看触发器基本信息:Sp_help触发器名查看触发器定义:sp_helptext触发器名查看依赖关系:sp_depends触发器名查看指定表指定类型的触发器信息Sp_helpTrigger表名,[insert|update|delete]8.4.3修改和删除触发器修改AlterTrigger[拥有者.]触发器名On[拥有者.]表名|视图名{fro|after|insteadof}[inset,update,delete][withencryption][notfromreplication]As[setnocunot]不返回给变更赋值的结果SQL语句系统[RollbackTransaction]--事务回滚删除Droptrigger触发器名第九章SQLServer的权限管理与代理服务台9.1SQLServer的安全机制
SQLServer201*的安全性管理是建立在认证和访问许可两者机制上的。
在SQLServer的安全模型中包括几个部分:SQLServer登录,数据库用户,权限,角色。9.1.1SQLServer登录认证简介
SQLServer参在两种安全模式下运行:Windows认证模式和混合混式。
SQLServer认证模式下,用户在SQLServer时必须提供登录名和登录密码,SQLServer自己执行认证处理,它将会与存储在系统表syslogins中的登录信息验证。9.2.2使用T-SQL管理SQLServer登录(1)sp_addlogin创建新的使用SQLServer认证模式登录帐号:Sp_addlogin‘登录名’,’登录密码’,’默认数据库’,’默认语言’其中登录名和密码可包含1128个字符,由字母、汉字和数据组成。不能包含\\,保留的登录名称sa或已存在的登录名,也不能是空字符串或null.execsp_addlogin"User1","User1","pubs","us_english"(2)sp_droplogin删除登录帐号,禁止防问SQLServerSp_droplogin‘登录名称’execsp_droplogin"User1"不能删除系统管理者sa以及当前连接到SQLServer的登录;如果与登录相匹配的用户仍存在sysusers表中,则不能删除该登录帐号;sp_addlogin和sp_droplogin只能在用SQLServer认证模式下。(3)sp_grantLogin设WindowsNT用户或用户组为SQLServer登录者Sp_grantlogin‘登录名称’(4)sp_denylogn拒绝NT用户或用户组连接到SQLServer。Sp_grantlogin‘登录名称’(5)sp_revokelogin删除NT用户或用户组在SQLServer上的登录信息。Sp_revokelogin‘登录名称’(6)sp_helplogins显示SQLServer所有登录者的信息,包括每一个数据库里与该登录者相对应的用户名称。Sp_helplogins‘登录名’9.3数据库用户
数据库用户用来指出哪一个人可以访问哪一个数据库。在一个数据库中用户ID惟一标识一个用户,用户对数据的访问权限以及对数据库对象的所有关系都是通过用户帐号来控制的。用户帐号总是基于数据库的,即两个不同数据库中可以有两个相同的用户帐号。
在数据库中用户帐号与登录登录是两个不同概念。一个合法的登录帐号表明该帐号通过了NT认证或SQLServer认证,但不能表明其可以对数据库数据和数据对象进行某种或某些操作,所以一个登录帐号总是一个或多个数据库用户帐号相对尖,这样才可以访问数据库。通过,数据库用户帐号总是与某一登录帐号相关联,但有一个例那guest.在安装系统时guest用户被加入到master,pubs,tempdb和northwoind中。
用户通过NT或SQLServer认证成功登录到SQLServer之后,SQLServer又做了哪些事呢?1)SQLServer检查该登录用户是否有合法的用户名,如果有合法的用户,则允许其以用户名访问数据库;否则,执行第二步。2)SQLServer检查是否有guest用户,如果有,则允许登录用户以guest用户来访问数据库,如果没有,则该登录用户被拒绝。
Grust用户主要是让那些没有属于自己的用户帐号的SQLServer登录者把其用为默认用户,从而使该登录者能够访问具有guest用户的数据库。9.3.2管理数据库用户1)创建新的数据库用户Sp_grantdbaccess‘登录帐号名’,’用户帐号名称’2)删除数据库用户]Sp_revokedbaccess‘用户帐号名称’3)查看数据库用户信息Sp_helpuser‘用户帐号名称’9.4权限管理
T-SQL命名规则
1表名
XXX相关表以r_作为前缀,YYY相关表以t_作为前缀。如r_acc、t_bcc。后台表名尽量与前台表名相同,后台独有的表应以_b作为后缀。如r_gggd_b。
命名应尽量反映存储的数据内容。
2视图名
视图以v_作为前缀。由于前台无视图,故不需加_b。命名应尽量体现各视图的功能。3触发器名
触发器名为相应的表名加上后缀,Insert触发器加"_i",Delete触发器加"_d",Update触发器加"_u",如:r_bch_i,r_bch_d,r_bch_u。
4存储过程名
存储过程应以"sp_"开头,后续部分主要以动宾形式构成,并用下划线分割各个组成部分。如增加BSC机架的DRT单板的存储过程为"sp_ins_board_drt"。5变量名
变量名采用小写,若属于词组形式,用下划线分隔每个单词,如@my_err_no。6命名中其他注意事项
以上命名都不得超过30个字符的系统限制。变量名的长度限制为29(不包括标识字符@)。
数据对象、变量的命名都采用英文字符。禁止使用中文命名。
编程结构和描述
SQLSERVER系统中,一个批处理是从客户传给服务器的一个完整的包,可以包含若干条SQL语句。批处理中的语句是作为一组去进行语法分析、编译和执行的。触发器、存储过程等数据对象则是将批处理永久化的方法。
注释:注释可以包含在批处理中。在触发器、存储过程中包含描述性注释将大大增加文本的可读性和可维护性。本规范建议:
1、注释以英文为主。实际应用中,发现以中文注释的SQL语句版本在英文环境中不可用。为避免后续版本执行过程中发生某些异常错误,建议使用英文注释。
2、注释尽可能详细、全面。
创建每一数据对象前,应具体描述该对象的功能和用途。
传入参数的含义应该有所说明。如果取值范围确定,也应该一并说明。取值有特定含义的变量(如boolean类型变量),应给出每个值的含义。
3、注释语法包含两种情况:单行注释、多行注释
单行注释:注释前有两个连字符(--),最后以行尾序列(CR-LF)结束。一般,对变量、条件子句可以采用该类注释。多行注释:符号/*和*/之间的内容为注释内容。对某项完整的操作建议使用该类注释。4、注释简洁,同时应描述清晰。
函数注释:编写函数文本--如触发器、存储过程以及其他数据对象--时,必须为每个函数增加适当注释。该注释以多行注释为主,主要结构如下:
/*************************************************************************name:--函数名*function:--函数功能*input:--输入参数*output:--输出参数*author:--作者*CreateDate:--创建时间*UpdateDate:--函数更改信息(包括作者、时间、更改内容等)*************************************************************************/
CREATEPROCEDUREsp_xxx
条件执行语句ifelse
条件语句块(statenemtblock,以beginend为边界)仅在if子句的条件为真时才被执行。为提高代码的可读性,建议嵌套不多于5层。还有,当嵌套层次太多时,应该考虑是否可以使用case语句。重复执行while和跳转语句goto
需要多次执行的语句,可以使用while结构。其中,控制while循环的条件在任何处理开始之前需要先执行一次。循环体中的保留字break无条件的退出while循环,然后继续处理后续语句;保留字continue重新计算while条件,如果条件为真,则从循环开始处重新执行各语句。
使用跳转语句goto和标签label也可以方便地实现循环和其他更灵活的操作。SQLSERVER仅具有单通道语法分析器,因此不能解析对尚未创建的对象所做的前向参考。换言之,跳转到某标签的后续语句应该是可执行的(如不存在可能尚未创建的数据对象)。书写格式
数据库服务器端的触发器和存储过程是一类特殊的文本,为方便开发和维护,提高代码的易读性和可维护性。规范建议按照分级缩进格式编写该文本。顺序执行的各命令位于同一级;条件语句块(statenemtblock,以beginend为边界)位于下一级,类推。
SQL语句是该文本的主体。为适应某些教复杂的用户需求,SQL语句可能比较庞大。为方便阅读和维护,规范建议按照SQL语句中系统保留字的关键程度再划分为三级。具体分级请参照下表。其中,非系统保留字(如字段名、数据表名、标点符号)相对本级保留字再缩进一级。多个连续的非保留字可以分行书写,也可以写在同一行。当WHERE包含的条件子句教复杂时,应该每行只写一个条件分句,并为重要的条件字句填写单行注释。
在保证基本缩进格式的前提下,可以通过对齐某些重要关键字(如条件关键字AND、OR,符号=、等)来进一步提高文本的易读性和可维护性。相邻两级的缩进量为10个空格。这也是ISQL编辑器默认的文本缩进量。另外,在ISQL编辑器中,一个TAB键也相当于10个空格。注:按照功能,四类SQL语句(SELECT、INSERT、UPDATE、DELETE)的关键字可以划分为三类:主关键字、次关键字、一般关键字。如下表所示:主关键字次关键字一般关键字
SELECTINSERT(INTO)UPDATEDELETE
FROMWHEREVALUESINSERTSELECTFROM语句中的SELECT和FROMANDORBETWEENINLIKE字体
系统保留字应大写,包括系统公共变量等。其他字符(如用户自定义变量、用户自定义数据对象名)小写。需要特殊强调的部分可以大写。一条完整注释语句的首字符应大写。对某变量、某条件字句的注释可以全部使用小写。
SQLServer单词表
单词Primarykey主键含义单词Identity含义自动编号
友情提示:本文中关于《SQLServer总结》给出的范例仅供您参考拓展思维使用,SQLServer总结:该篇文章建议您自主创作。
来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。