T-SQL语法(4)

2019-06-30 10:48

GO

CREATE DEFAULT DF_date AS ‘Dec 12 2002 6:00 AM’ GO

CREATE DEFAULT DF_binary AS 0Xffffffffff GO

CREATE DEFAULT DF_money AS $1000 GO

CREATE DEFAULT DF_int AS 0 GO

3、默认的应用

在创建默认后,必须将它与列或用户定义数据类型关联起来才能使之发挥作用。

执行系统存储过程sp_bindefault在默认对象和列或默认对象和用户定义数据类型间建立关联。Sp_bindefault 的语法格式:

sp_bindefault [@defname] ‘default_name’ [@objname=] ‘object_name’

[,[@futureonly=] ‘futureonly_flag’] 说明:default_name为所关联的默认对象名称

object_name为默认对象所关联到的列名或用户定义数据类型名称。

Sp_bindefault只能将默认与当前数据库表中的列或用户定义的数据类型相关

联,在关联时,默认对象的数据类型必须与其所关联的列的数据类型相同或兼容。在未解除已有默认关联之前,可以将一个新的默认对象关联到该列,这时,旧的关联将自动解除,只有最近一次关联的默认对象起作用。

4、删除默认对象

在删除默认对象时,首先要执行系统存储过程sp_unbindefault解除默认对象与列和用户定义数据类型之间的关联,然后才能执行DROP DEFAULT语句删除默认对象,sp_unbindefault的语法格式:

sp_unbindefault [@objname=] ‘object_name’ [,[@futureonly]=] ‘futureonly_flag’

解除默认对象的关联后,该对象仍存在于当前数据库中,这时可执行DROP DEFAULT语句将其删除。DROP DEFAULT语句的语法格式为: DROP DEFAULT {default_name} [,?n] 六、索 引

如果对一个未建立索引的表执行查询操作,SQL Server将逐行扫描表数据页面中的资料行,并从中挑出符合条件的资料行。当一个表中有很多行时,执行一次查询将耗费大量的时间。然而,在建立索引后,SQL Server则根据索引指示,直接定位到所要查找的资料行,从而加快SQL Server的资料检索操作。此外,索引还能够加快ORDER BY和GROUP BY子句的执行、强制实施行的唯一性。

SQL Server中的索引类型包括以下几种: ? 唯一索引; ? 簇索引; ? 非簇索引。 1. 唯一索引

唯一索引要求所有资料行中的任意两行中的被索引列不能存在重复值(包括空值

NULL)。有以下两种方法建立唯一索引:

? 在CREATE TABLE或ALTER TABLE语句中设置列级或表级PRIMARY KEY约束或UNIQUE

约束时,SQL Server自动为这些约束建立唯一索引; ? 在CREATE INDEX语句中使用UNIQUE选项创建唯一索引。

使用CREATE INDEX语句对一个已存在的表创建唯一索引时,系统首先检查表中已有数据,如果被索引列存在重复键值,系统将停止建立索引。在这种情况下,只有删除已存在的重复行后,才能对这些列建立唯一索引。

表创建唯一索引后,SQL Server将禁止INSERT语句或UPDATE语句向表中添加重复的键值行。

2. 簇索引

在簇索引中,行的物理存储顺序与索引顺序完全相同,每个表只允许建立一个簇索引。由于在建立簇索引时要改变表中资料行的物理顺序,所以应在其它非簇索引建立之前建立簇索引,以免引起SQL Server重新构造非簇索引。

默认情况下,SQL Server为PRIMARY KEY约束所建立的索引为簇索引,但这一默认设置可以使用NONCLUSTERED关键词改变。在CREATE INDEX语句中,使用CLUSTERED选项建立簇索引。

3. 非簇索引

非簇索引不改变行的物理存储顺序。在非簇索引的叶级页面包含一个索引值和一个指针,指针指向资料页中的资料行,该行具有与索引键值相同的列值。在CREATE INDEX语句中,使用NONCLUSTERED选项建立非簇索引。

注意:一个表最多可以建立249个非簇索引,其中包括使用CREATE INDEX语句显式建

立的非簇索引,以及各种约束所建立的非簇索引。 4. 复合索引

复合索引是对一个表中的两列或多列的组合进行索引,复合索引的最大列数为16,且这些列必须位于同一个表中。复合索引值的最大长度为900字节,即复合索引列的定义长度之和不能超过900字节。在使用复合索引时,把被索引列(两列或多列)作为一个单位。

注意:复合索引中的列顺序可以与表中的列顺序不同,在复合索引中应首先定义最可能

具有唯一性的列。 在SQL Server中,有两种方法建立索引:第一,调用CREATE TABLE语句创建表或执行ALTER TABLE语句修改表时,建立PRIMARY KEY约束和UNIQUE约束,使SQL Server自动为这些约束建立索引;第二,使用CREATE INDEX语句对一个已存在的表建立索引。

CREATE INDEX语句的语法格式为:

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON table ( column [,...n] ) [ WITH

[ PAD_INDEX ]

[ [,] FILLFACTOR = fillfactor ] [ [,] IGNORE_DUP_KEY ] [ [,] DROP_EXISTING ]

[ [,] STATISTICS_NORECOMPUTE ] ]

[ ON filegroup ]

其中,UNIQUE、CLUSTERED和NONCLUSTERED指出所建立的索引类型,它们分别为唯一

索引,簇索引和非簇索引。省略CLUSTERED和NONCLUSTERED选项时,SQL Server所建立的为非簇索引。

index_name参数所建立的索引名称。在同一表中要保证索引名称的唯一性。

table和column说明被索引表及其列名,一个索引可以包含一列或多列(构成符合索引)。在建立索引时,不能对bit、text、ntext、image数据类型列和计算列建立索引。

FILLFACTOR 参数指出在创建索引时,每个索引页面的叶级填充度,它说明每次叶级索引页面填充多少时开始分页,从而在索引页面中保留一定的空间。索引页面中保留一定的空间是非常有用的,它可以存储以后所插入新行的索引值,从而避免在每次插入新行时使系统都必须将原索引页面重新分页,从而提高系统的运行效率。

用户定义的FILLFACTOR参数值为1到100(%),默认值为0。只有在不需要插入或修改资料的情况下,才将FILLFACTOR设为100。将FILLFACTOR设为100时,在插入和修改操作时都回导致索引页的分页,从而大量占用系统时间。所以对于非只读表和数据库,应根据索引建立后需要插入的资料量来估算FILLFACTOR 参数。

PAD_INDEX指出SQL Server在创建索引时,其内部节点页面是否也遵守FILLFACTOR 参数指定的填充度进行填充。所以,在使用PAD_INDEX选项时,必须同时设置FILLFACTOR 参数。默认时,SQL Server在索引节点上至少保留能够存储两个索引项的空间。

例如,对表spkfk建立索引,指定该索引的内部节点页面和叶级页面的填充度均为20%:

CREATE INDEX spkfk_index ON spkfk(spid) WITH PAD_INDEX, FILLFACTOR = 20 建立唯一索引后,每次使用INSERT语句或UPDATE语句向表中添加或修改资料时,系统将自动检查这些资料在索引列中是否存在重复键值。如果没有重复键值,资料将被成功地添加或修改;否则,系统将根据是否设置了IGNORE_DUP_KEY索引选项,对所执行的语句做以下两种不同的处理:

(1) 如果未设置IGNORE_DUP_KEY选项,系统将取消INSERT语句或UPDATE语句的执行。

对于影响多行的INSERT语句或UPDATE语句,在遇到重复的索引值时,所有已修改的行将被回滚,数据库中的其它修改(如索引页的改变等)也将被撤消,表中资料被恢复到语句执行前的状态。

(2) 如果设置了IGNORE_DUP_KEY选项,当INSERT语句或UPDATE语句影响多行时,所

插入的包含重复键值的资料行将被忽略,而修改时,所修改的行将被删除,而其它行则被正常插入或修改。

UPDATE语句的修改操作实际是先删除旧行,然后再插入新行。所以,如果所插入的行存在重复的键值,并且设置了IGNORE_DUP_KEY选项,那么SQL Server将取消UPDATE语句对该行的插入操作,并导致被修改行的删除。

注意:只有当INSERT语句和UPDATE语句一次操作多行时,IGNORE_DUP_KEY选项才有意义。

例如,对表spkfjc中的spid和spbh列建立复合式非簇索引index_spid,并使用PAD_INDEX和FILLFACTOR参数要求索引文件的节点页面和叶级页面的填充度均为30%:

CREATE NONCLUSTERED INDEX index_spid ON spkfjc(name, phone)

WITH PAD_INDEX, FILLFACTOR = 30

CREATE INDEX语句所创建的索引可以调用DROP INDEX语句删除,但是DROP INDEX语句不能删除SQL Server为PRIMARY KEY约束和UNIQUE约束所建立的索引,这些索引只能通过删除约束或删除表的方法删除。

DROP INDEX语句的语法格式为: DROP INDEX ‘table.index’ [,...n]

其中,INDEX为待删除的索引名称,table为索引所属表名。

在同一个数据库中可能存在多个同名约束,但是同一个表中的索引是唯一的,所以,在DROP INDEX语句中需要使用table参数限制索引所属表名。

例如,删除前面所建立的index_spid索引: DROP INDEX spkfjc.index_spid

通过执行系统存储过程sp_helpindex能够检索资料表目前所建立的索引(或约束)的索引类型、存储位置和被索引列。sp_helpindex的语法格式为:

sp_helpindex [ @objname = ] ‘name 其中,name为当前数据库中的表名称’。 七、视图:

定义:视图是用户查看数据库表中资料的一种方式,它相当于一个虚拟表,用户通过

它来浏览表中部分或全部资料。而数据的物理存放位置仍然在表中。视图可以基于一个或多个表。 优点:

1、 用户注意力聚焦在特定的资料上,并达到资料安全的目。因为表中通常存放着

整个对象的全部资料,而不同的用户只需要他们应该得到的资料。检索表时,用户则可能看到表中所有资料。而使用视图则能够限制用户从表中所检索的内容。

2、 简化资料查询和处理操作。能够使用户在处理资料时如同处理单表一样。 3、 有利于资料交换操作。在实际工作中,需要与其它数据库或电子表格软件之间

交换资料。如果资料存在于多个表中,使用视图简化资料交换操作。

语法:create view view_name [(column[,…n])] [WITH ENCRYPTION] as

select_statement [WITH CHECK OPTION] 说明:view_name:创建的视图名称

[WITH ENCRYPTION]:要求在存储CREATE VIEW文本时加密,这使任何人无法检

索视图的定义文本

select_statement:视图定义语句 限制条件:(1)用户必须具有查询语句所参照对象的SELECT权限。

(2)语句中不能含有ORDER BY、COMPUTE或COMPUTE BY关键词。 (3)不能包含INTO关键词。 (4)不允许参照到一个临表

(5)不能建立规则、默认和触发器,或构造索引。

一个视图最多只能参照1024列。

不能创建临时视图,也不能以临时表作基表建立视图

[WITH CHECK OPTION]:视图所执行的所有的资料修改操作必须遵守视图定义中 所设置的条件。从而保证修改后的资料通过视图仍能看到。 存储:视图名称存储在SYSOBJECTS系统表,列定义信息存储在SYSCOLUMNS系统表中, 视图的基表信息存储在SYSDEPEND表中,语句文本存储在SYSCOMENTS中。 例如:检索从供货商进货情况 create view count_je

as

select b.danwbh,b.dwmch,sum(a.hsje) as hsje from cwk a join mchk b on a.dwbh=b.dwbh where a.djbh like 'jha%'

group by a.dwbh,b.danwbh,b.dwmch 1、 通过视图修改资料:

(1) 在一个语句中,一次不能修改一个以上的视图基表

(2) 修改操作必须遵守视图基表中所定义的的各种资料完整性约束条件。 (3) 不允许对视图中的计算列(通过算术运算或内置函数生的列)进行修改,

也不允许对视图定义中包含有统计函数或GROUP BY子句的视图进行修改或插入操作。

2、 修改和删除视图:

(1) 修改视图:ALTER VIEW view_name其结构与CREATE VIEW语句完全相同。 (2) 删除视图:DROP VIEW view_name 八、触发器

定义:触发器是一种特殊的存储过程,它不允许带参数,也不能被直接调用,只能由系

统自动激活。

语法:

CREATE TRIGGER trigger_name On table_name [WITH ENCRYPTION] {

{FOR{[INSERT][[,]DELETE][[,]UPDATE]}} [NOT FOR REPLICATION] AS

Sql_statement[…n]

}| {

{FOR{[INSERT][[,]DELETE]}} [NOT FOR REPLICATION] AS {

IF UPDATE (column)

[{AND|OR} UPDATE (column)][...n]

}

sql_statement[]

}

说明:trigger_name为所建立的触发器的名称。

WITH ENCRYPTION:触发器定义文本加密后存储。

{FOR{[INSERT][[,]DELETE][[,]UPDATE]}}:定义触发器事件,一个触发器由表

中多个事件触发时,使用INSERT、DELETE、UPDATE的组合表示,它们之间用逗号分隔。

Sql_statements参数为单个Transact_SQL语句或语句块,它定义触发事件发生

时,触发器所执行的动作。


T-SQL语法(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:名校诊断学试卷

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: