您的位置:新葡亰496net > 网络数据库 > 新葡亰496net基础加强,数据库设计

新葡亰496net基础加强,数据库设计

发布时间:2019-10-20 23:49编辑:网络数据库浏览(104)

    需要学习的朋友可以通过网盘下载: 内容简介  · · · · · ·

    本书通过大量的实例,详细说明了为提高 SQL编程技术而必须面对的思想方法上的根本转变 ——由以过程式编程方式思考转变为以数据集的方式来思考。此外,本书还讨论了关于 SQL编程中查找表、视图、辅助表、虚拟表的应用,并独到地阐明了如何在 SQL系统中正确地处理时间值以及 SQL编程中的其他技术难点。

    本书适合广大数据库编程人员和 SQL程序员学习参考。

    短评  · · · · · ·  ( 全部 5 条 )

    热门 / 最新 / 好友

    • ### 0 有用远東新君 2012-02-14

      一本类cookbook的sql丛书

    • ### 0 有用泡咖啡的棉花糖  2016-04-10

      好多专业词没听过,看完后得上网再搜搜。用了一些时间大致浏览一下,等我再了解了解数据库,应该会再回来看看这本书。我还是太年轻了。

    • ### 0 有用caff  2010-04-13

      太专业,不实用

    • ### 0 有用颤抖的小赤佬  2011-09-21

      简单过了一遍,DBA绝对是个神奇的职业!

    • ### 0 有用人生短短幾個秋  2016-10-20

      这个作者写的好几本关于SQL的书都是大同小异,而且有些重复的内容

     

    对于设计和创建数据库完全是个新手?没关系,Joe Celko, 世界上读者数量最多的SQL作者之一,会告诉你这些基础。和往常一样,即使是最专业的数据库老手,也会给他们带来惊喜。Joe是DMBS杂志是多年来最受 读者喜爱的作者。他在美国、英国,北欧,南美及非洲传授SQL知识。他在ANSI / ISO SQL标准委员会工作了10年,为SQL-89和SQL-92标准做出了杰出贡献。

    一、视图

    一、数据库存储结构          SQL Server 7.0中的每个数据库有多个操作组成,数据库的所有资料、对象和数据库操作日志均存储在这些操作中。根据这些的作用不同,可以将它们划分为以下三类:
    ?        主数据文件:每个数据库有且只有一个主数据文件,它是数据库和其它数据文件的起点。主数据文件的扩展名一般为.mdf;       
    ?        辅数据文件:用于存储主数据文件中未存储的剩余资料和数据库对象,一个数据库可以没有辅数据文件,但也可以同时拥有多个辅数据文件。辅数据文件的多少主要根据数据库的大小、磁盘存储情况和存储性能要求而设置。辅数据文件的扩展名一般为.ndf;
    ?        日志文件:存储数据库的事务日志信息,当数据库损坏时,管理员使用事务日志恢复数据库。日志文件的扩展名一般为.ldf。
    每个数据库中至少两个文件:主数据文件和日志文件。
    SQL Server数据库文件除操作系统所赋予的物理文件名称外,还有一个逻辑名称。数据库的逻辑名称应用于Transact-SQL语句中。例如,对于 master系统数据库,master为其逻辑名称,使用Transact-SQL语句操作数据库时,均使用该名称。而对应的物理文件名称为 master.mdf、其日志文件名称为master.ldf。
    为了管理方便,可将多个数据库文件组织为一组,称作数据库文件组。文件组能够控制 各个文件的存放位置,其中的每个文件常建立在不同的驱动器上,这样可以减轻每个磁盘驱动器的存储压力,提高数据库的存储效率,从而达到提高系统性能的目 的。SQL Server采用比例填充策略使用文件组中的每个文件提供的存储空间。

    作者简介  · · · · · ·

    Joe Celko,世界著名的数据库专家,曾担任ANSI SQL标准委员会成员达10年之久,他也是世界上读者数量最多的SQL图书作者之一。他曾撰写过一系列专栏,并通过他的新闻组支持和推动了数据库编程技术以及ANSI/ISO标准的发展。除本书外,他还撰写了多部SQL经典著作,包括《SQL编程风格》、《SQL解惑》和《SQL权威指南》,上述作品的中文版均已经或即将由人民邮电出版社出版。


      视图是数据库中的一个虚拟表,其内容由查询语句查询出来的。就像真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。它的行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。

    在SQL Server中建立文件和文件组时,应注意以下两点:
    ?        每个文件或文件组只能属于一个数据库,每个文件也只能成为一个文件组的成员,文件和文件组不能跨数据库使用;
    ?        日志文件是独立的,它不能成为文件组的成员。也就是说,数据库的资料内容和日志内容不能存入相同的文件或文件组。

    目录  · · · · · ·

    第1章 SQL是声明式语言,不是过程式语言 1
    1.1 不同的编程模型 1
    1.2 不同的数据模型 3
    1.2.1 “列”不是“字段” 4
    1.2.2 行不是记录 6
    1.2.3 表不是文件 9
    1.2.4 关系键不是记录定位器 11
    1.2.5 键的类型 12
    1.2.6 关系键的理想属性 14
    1.2.7 唯一,但并非不变 15
    1.3 表作为实体 15
    1.4 表作为关系 16
    1.5 语句不是过程 16
    1.6 分子、原子和亚原子型数据元素 17
    1.6.1 分割表 17
    1.6.2 分割列 18
    1.6.3 时间值的分割 19
    1.6.4 假造的非第一范式数据 19
    1.6.5 分子型数据元素 21
    1.6.6 异构数据元素 21
    1.6.7 检验分子型数据 22
    第2章 硬件、数据量和维护数据库 23
    2.1 并行处理技术 23
    2.2 廉价的主存储器 25
    2.3 固态磁盘 25
    2.4 更廉价的二级存储器和三级存储器 25
    2.5 数据也在改变 26
    2.6 思维方式并未改变 26
    第3章 数据访问和记录 29
    3.1 顺序访问 29
    3.2 索引 30
    3.2.1 单表索引 31
    3.2.2 多表索引 31
    3.2.3 索引的类型 32
    3.3 散列 32
    3.3.1 数字选择 33
    3.3.2 除法散列 33
    3.3.3 乘法散列 33
    3.3.4 合并 33
    3.3.5 表的查找 33
    3.3.6 冲突 34
    3.4 位向量索引 34
    3.5 并行访问 34
    3.6 行和列存储 35
    3.6.1 基于行的存储 35
    3.6.2 基于列的存储 35
    3.7 联结算法 36
    3.7.1 嵌套循环联结算法 37
    3.7.2 排序合并联结算法 37
    3.7.3 散列联结算法 37
    3.7.4 Shin算法 38
    第4章 查找表 39
    4.1 数据元素的名称 40
    4.2 多参数查找表 42
    4.3 常量表 43
    4.4 OTLT或MUCK表问题 45
    4.5 正确表的定义 48
    第5章 辅助表 49
    5.1 序列表 49
    5.1.1 创建序列表 51
    5.1.2 序列构造器 51
    5.1.3 替换迭代循环 52
    5.2 排列 54
    5.2.1 通过递归进行排列 54
    5.2.2 通过CROSS JOIN进行排列 55
    5.3 函数 57
    5.4 通过表实现加密 59
    5.5 随机数 60
    5.6 插值 63
    第6章 视图 66
    6.1 Mullins视图使用原则 66
    6.1.1 高效访问和计算 67
    6.1.2 重命名列 68
    6.1.3 避免增生 68
    6.1.4 视图同步原则 68
    6.2 可更新视图和只读视图 69
    6.3 视图的类型 71
    6.3.1 单表投影和限制 71
    6.3.2 计算列 71
    6.3.3 转换列 72
    6.3.4 分组视图 72
    6.3.5 联合视图 73
    6.3.6 视图的联结 74
    6.3.7 嵌套视图 75
    6.4 用表构建类模型 76
    6.4.1 SQL中类的层次结构 77
    6.4.2 通过ASSERTION和TRIGER工作的子类 79
    6.5 数据库系统如何处理视图 79
    6.5.1 视图列的列表 79
    6.5.2 视图的物化 80
    6.6 嵌入式文本扩展 80
    6.7 WITH CHECK OPTION子句 81
    6.8 删除视图 86
    6.9 过时的视图用法 87
    6.9.1 域的支持 87
    6.9.2 表表达式视图 88
    6.9.3 表级CHECK()约束的视图 88
    6.9.4 每个基表一个视图 88
    第7章 虚拟表 90
    7.1 派生表 90
    7.1.1 列的命名规则 91
    7.1.2 作用域规则 91
    7.1.3 公开的表名 93
    7.1.4 LATERAL()子句 94
    7.2 CTE 96
    7.2.1 非递归CTE 96
    7.2.2 递归CTE 97
    7.3 临时表 98
    7.3.1 ANSI/ISO标准 99
    7.3.2 厂商的模型 99
    7.4 信息模式 99
    7.4.1 INFORMATION_SCHEMA声明 100
    7.4.2 视图及其用途的快速列表 101
    7.4.3 域的声明 102
    7.4.4 定义模式 102
    7.4.5 INFORMATION_SCHEMA断言 105
    第8章 用表实现的复杂函数 106
    8.1 没有简单公式的函数 106
    8.2 用表实现校验位 107
    8.2.1 校验位的定义 107
    8.2.2 检错与纠错的对比 108
    8.3 算法的分类 109
    8.3.1 加权和算法 109
    8.3.2 幂和校验位 111
    8.3.3 Luhn算法 112
    8.3.4 Dihedral Five校验位 113
    8.4 声明不是函数,不是过程 114
    8.5 用于辅助表的数据挖掘 118
    第9章 时态表 120
    9.1 时间的本质 120
    9.1.1 时间段,不是时间子 121
    9.1.2 细分程度 122
    9.2 ISO半开放时间模型 123
    9.2.1 用NULL表示永远 125
    9.2.2 单时间戳表 125
    9.2.3 重叠的时间间隔 127
    9.3 状态转换表 134
    9.4 合并时间间隔 138
    9.4.1 游标和触发器 139
    9.4.2 OLAP函数解决方案 140
    9.4.3 CTE解决方案 141
    9.5 Calendar表 142
    9.5.1 用表提供星期值 142
    9.5.2 节假日列表 143
    9.5.3 报告期 145
    9.5.4 自更新视图 145
    9.6 历史表 147
    第10章 用非第一范式表清理数据 149
    10.1 重复的组 149
    10.2 设计清理表 155
    10.3 清理操作使用的约束 157
    10.4 日历清理 158
    10.5 字符串清理 159
    10.6 共享SQL数据 161
    10.6.1 数据的发展 162
    10.6.2 数据库 162
    10.7 提取、转换和加载产品 163
    10.7.1 加载数据仓库 164
    10.7.2 全部用SQL来完成 165
    10.7.3 提取、转换并加载 166
    第11章 以SQL的方式思考 168
    11.1 热身练习 168
    11.1.1 整体,不是部分 169
    11.1.2 特征函数 169
    11.1.3 尽早锁定解决方案 171
    11.2 启发式方法 172
    11.2.1 将规范表达为清晰的语句 172
    11.2.2 在名词前面添加“所有……的集合”几个字 172
    11.2.3 删除问题语句中的行为动词 173
    11.2.4 仍然可以使用存根 173
    11.2.5 不要担心数据的显示 174
    11.2.6 第一次尝试需要专门处理 175
    11.2.7 不要害怕抛弃自己在DDL中的首次尝试 175
    11.2.8 克制使用DML的冲动 176
    11.2.9 不要以方框和箭头的方式思考 176
    11.2.10 画圆和数据集示意图 177
    11.2.11 学习具体的产品 178
    11.2.12 把WHERE子句看做“超级变形虫” 178
    11.2.13 使用新闻组、博客和因特网 178
    11.3 不要在SQL中使用BIT或BOOLEAN标记 179
    11.3.1 标记位于错误的层 179
    11.3.2 标记使用不当使正确属性难以理解 181
    第12章 组特征 184
    12.1 并不是按是否相等来分组 185
    12.2 使用组,不看里面是什么 186
    12.2.1 半面向数据集的方式 187
    12.2.2 分组的解决方案 188
    12.2.3 解决方案总结 189
    12.3 根据时间分组 190
    12.3.1 渐进式解决方案 190
    12.3.2 整体数据解决方案 192
    12.4 其他使用HAVING子句的技术 192
    12.5 GROUPING、ROLLUP和CUBE 194
    12.5.1 GROUPING SET子句 194
    12.5.2 ROLLUP子句 195
    12.5.3 CUBE子句 196
    12.5.4 关于超级组的脚注 196
    12.6 WINDOW子句 196
    12.6.1 PARTITION BY子句 197
    12.6.2 ORDER BY子句 198
    12.6.3 RANGE子句 198
    12.6.4 编程技巧 199
    第13章 将技术规范变为代码 200
    13.1 不良SQL的标志 200
    13.1.1 代码的格式是否像另一种语言 200
    13.1.2 顺序访问假设 201
    13.1.3 游标 201
    13.1.4 糟糕的内聚度 201
    13.1.5 表值函数 202
    13.1.6 同一数据元素有多个名称 202
    13.1.7 数据库中的格式 202
    13.1.8 将日期保存到字符串中 203
    13.1.9 BIT标记、BOOLEAN及其他计算列 203
    13.1.10 跨列的属性分割 203
    13.1.11 跨行的属性分割 203
    13.1.12 跨表的属性分割 203
    13.2 解决方法 204
    13.2.1 基于游标的解决方案 204
    13.2.2 半面向数据集的解决方案 205
    13.2.3 完全面向数据集的解决方案 207
    13.2.4 面向数据集代码的优点 207
    13.3 解释含糊的说明 207
    13.3.1 回归到DDL 209
    13.3.2 修改问题说明 211
    第14章 使用过程及函数调用 213
    14.1 清除字符串中的空格 213
    14.1.1 过程式解决方案#1 213
    14.1.2 函数解决方案#1 214
    14.1.3 函数解决方案#2 217
    14.2 聚合函数PRD() 218
    14.3 在过程和函数中使用长参数列表 220
    第15章 对行编号 223
    15.1 过程式解决方案 223
    15.2 OLAP函数 226
    15.2.1 简单的行编号 226
    15.2.2 RANK()和DENSE_RANK() 227
    15.3 节 228
    第16章 保存计算数据 231
    16.1 过程式解决方案 231
    16.2 关系式解决方案 232
    16.3 其他种类的计算数据 233
    第17章 约束类触发器 234
    17.1 计算类触发器 234
    17.2 通过CHECK()和CASE约束实现的复杂约束 235
    17.3 通过视图实现复杂约束 237
    17.4 用约束实现视图操作 239
    17.4.1 3个基本操作 239
    17.4.2 WITH CHECK OPTION子句 240
    17.4.3 WITH CHECK OPTION与CHECK()子句 243
    17.4.4 视图的行为 244
    17.4.5 联合视图 246
    17.4.6 简单的INSTEAD OF触发器 247
    17.4.7 关于INSTEAD OF触发器的告诫 250
    第18章 过程式解决方案和数据驱动的解决方案 251
    18.1 删除字符串中的字母 251
    18.1.1 过程式解决方案 252
    18.1.2 纯粹的SQL解决方案 252
    18.1.3 不纯粹的SQL解决方案 253
    18.2 数独的两种求解方法 254
    18.2.1 过程式解决方案 254
    18.2.2 数据驱动的解决方法 254
    18.2.3 处理已知数字 255
    18.3 数据约束方法 257
    18.4 装箱问题 261
    18.4.1 过程式解决方法 261
    18.4.2 SQL方式 262
    18.5 库存成本随时间的变化 264
    18.5.1 库存中使用的UPDATE语句 267
    18.5.2 回到装箱问题 268

     介绍完表,Joe Celko会谈下如何把它们放一起作为数据库,还有什么是实体关系和视图。

      视图优点如下:

    SQL Server中的数据库文件组有以下三种类型:
    ?        主文件组:其中包数据库的主数据文件和不属于其它文件组的数据库文件,数据库系统表的所有页面存储在主文件组中;
    ?        用户定义文件组:数据库创建语句(CREATE DATABASE)或修改语句(ALTER DATABASE)中使用FILEGROUP关键词所指定的文件组;
    ?        默认文件组:在创建数据库对象时,如果没有为它们指定文件组,它们将被存储在默认文件组中。可以使用ALTER DATABASE语句修改数据库的默认文件组设置,但每个数据库同时最多只能有一个默认文件组。当数据库没有指定默认文件组时,主文件组将被作为默认文件 组使用。
    由于默认文件组的特殊作用,所以在创建数据库对象时,即使不指定用户文件组,SQL Server也能照常执行。

    在第一篇,我们因它们是什么并区分它们命名数据元。在第二篇,我们用SQL里给我们的数据类型和简单的行或列约束来模型化数据元。在第三篇,我们把这些行放入表成为实体,关系和辅助数据。

    • 视点集中

    1.使用Transact-SQL语句建立数据库
      CREATE DATABASE 语句的语法格式为:

    现在我们有了基表,是时候把它们放一起作为数据库,增加其它的架构对象混合一起。这需要我们从比一次一个表或多个表更高的层级来看。对这个一个有用的工具是实体关系图(E-R (Entity-Relationship) diagram)。不好的消息是有很多风格的实体关系图,其中一些变得非常复杂。这个工具的第一个版本应归于Peter Chen在他1976年的论文里,它还是一个很好开始的地方。每个系统认同实体表表现为一个在它里面有表名的矩形。但一些系统会放入所有列名,对于主键标上特殊符号作为不同等等。

      视图集中即是使用户只关心它感兴趣的某些特定数据和他们所负责的特定任务。这样通过只允许用户看到视图中所定义的数据而不是视图引用表中的数据而提高了数据的安全性。

    新葡亰496net 1CREATE DATABASE database_name
    新葡亰496net 2[ ON [PRIMARY]
    新葡亰496net 3        [ <filespec> [,新葡亰496net 4n] ]
    新葡亰496net 5        [, <filegroup> [,新葡亰496net 6n] ]
    新葡亰496net 7]
    新葡亰496net 8[ LOG ON { <filespec> [,新葡亰496net 9n]} ]
    新葡亰496net 10[ FOR LOAD | FOR ATTACH ]
    新葡亰496net 11<filespec> ::=
    新葡亰496net 12  ( [ NAME = logical_file_name, ]
    新葡亰496net 13  FILENAME = 'os_file_name'
    新葡亰496net 14  [, SIZE = size]
    新葡亰496net 15  [, MAXSIZE = { max_size | UNLIMITED } ]
    新葡亰496net 16  [, FILEGROWTH = growth_increment] ) [,新葡亰496net 17n]
    新葡亰496net 18<filegroup> ::=
    新葡亰496net 19FILEGROUP filegroup_name <filespec> [,新葡亰496net 20n]
    新葡亰496net 21

    Chen最先使用方块牌(diamond)作为关系表。这是个很好的主意,在它里面很容易画n元关系,你可以快速看到交替的模式框和方块牌。如果一个表同时使用,会有一些结论。例如,婚姻是丈夫和妻子之间的关系,但也有婚姻日期的数据,登记号,证婚人(presiding official)等等。

    • 简化操作

    其中,database_name为新建数据库的逻辑名称,在一个SQL Server上,必须保证各数据库名称是唯一的。
    ON 子句显示指定存储数据库资料部分所使用的数据文件和文件组列表,PRIMARY关键词说明其后的数据文件属于主文件组。如果PRIMARY关键词未被指 定,则关键词CREATE DATABASE后的第一个文件列表将成为主数据文件。<filespec>定义数据文件列表中各数据文件项,有多个数据文件项时,相互之间 以逗号分隔。
    其中,logical_file_name参数指出数据文件的逻辑名称,数据文件的逻辑名称应用在Transact-SQL语句中。在同一个数据库中,必须保持数据文件的逻辑名称是唯一的。
    os_file_name参数说明数据文件对应的操作系统文件名称,即数据文件的物理文件名称及其路径。
    size 参数指定数据文件的初始长度,其单位为MB或KB,默认时为MB。对于主数据文件,其size参数的最小值应等于model数据库中主数据文件的长度。对 于其它数据文件,其长度最小为512KB。size参数默认时,对于辅数据文件和日志文件,SQL Server将其长度设置为1MB,而对于主数据文件,SQL Server将其长度设为model数据库中主数据文件的长度。
    SQL Server中,如果打开数据库的autoshrink选项,当数据库文件空间用尽时,系统将自动增加数据文件的大小。max_size参数定义数据文件 可以增加到的最大尺寸,其单位为MB或KB。如果未定义max_size参数,数据库文件的长度可根据需要一直增加,直到磁盘空间用尽为止。这时它等同于 MAXSIZE = UNLIMITED。
    growth_increment参数说明数据文件空间的每次增加量,其单位为MB,KB或%,默认为 MB。使用%时说明数据文件每次增加的长度等于增加时文件现有长度的百分比,growth_increment参数的默认值为10%。用MB或KB表示 时,其增加值应为64KB或其倍数。
    ON子句中的<filegroup>参数用于指出数据库的数据文件组,其中,filegroup_name为文件组名称。文件组中各文件的定义格式与上面介绍的数据文件的定义格式相同。
    CREATE DATABASE语句中的LOG ON子句用于定义数据库日志文件。各个日志文件的定义格式与数据文件相同。当未使用LOG ON子句指定日志文件时,SQL Server将自动为数据库建立一个日志文件,文件名称由系统产生,其长度等于数据库所有数据文件长度之和的25%。

    接下来的系统放弃了方块牌,把关系表放入矩形,并使用只能显示二元关系的线,但线的末端有可选或必选成员关系的标志,0,1或更多成员关系级别,给它一些权利。这三个图形是条形作为1,圆形作为0,“鸡爪”作为多个。这个百闻不如一见。

      视图大大简化了用户对数据的操作。因为在定义视图时,若视图本身就是一个复杂查询的结果集,这样在每一次执行相同的查询时,不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可。可见视图向用户隐藏了表与表之间的复杂的连接操作。

    SQL Server创建一个数据库时要经过以下两个步骤: ① 使用model数据库拷贝初始化新建立的数据库,用户在model数据库中所建立的数据库对象也一并被拷贝到新建数据库中。此外,新建数据库还继承了 model中的各种数据库选项设置,如果model数据库选项设置被修改,它只影响修改后所建立的数据库,已经建立的数据库的各种选项不再发生变化了;
    ② 用空白页面填充数据库中的自由空间。
    (1)在创建数据库时,如果省略了CREATE DATABASE语句中的所有可选参数,即使用下面的语句格式,它所创建的数据库大小完全等同于model数据库:
    CREATE DATABASE MYDB1
    GO
       (2)下面例子在创建数据库MYDB2时指定文件组,其数据文件有主文件组和MYDB2_GROUP文件组组成。MYDB2数据库所包含的数据文件和日志文件,以及它们的参数如图所示:

    我们可以认为讲师(lecturer)传授(teaches)课程(courses),因此课程是被讲师传授。

    • 定制数据

    新葡亰496net 22CREATE DATABASE MYDB2
    新葡亰496net 23        ON
    新葡亰496net 24                PRIMARY(
    新葡亰496net 25                                NAME = MYDB2_P1_dat,
    新葡亰496net 26                                FILENAME = ‘c:mssql7dataMYDB2_P1.mdf’,
    新葡亰496net 27                                SIZE = 5,
    新葡亰496net 28MAXSIZE = 10,
    新葡亰496net 29FILEGROWTH = 20%
    新葡亰496net 30),
    新葡亰496net 31
    新葡亰496net 32(NAME = MYDB2_P2_dat,
    新葡亰496net 33                                  FILENAME = ‘c:mssql7dataMYDB2_P2.ndf’,
    新葡亰496net 34                                 SIZE = 5,
    新葡亰496net 35MAXSIZE = 10,
    新葡亰496net 36FILEGROWTH = 1MB
    新葡亰496net 37),
    新葡亰496net 38
    新葡亰496net 39FILEGROUP MYDB2_GROUP(
    新葡亰496net 40                 NAME = MYDB2_S1_dat,
    新葡亰496net 41                                  FILENAME = ‘c:mssql7dataMYDB2_S1.ndf’,
    新葡亰496net 42                 SIZE = 10,
    新葡亰496net 43                 MAXSIZE = 50,
    新葡亰496net 44                 FILEGROWTH = 10
    新葡亰496net 45                 ),
    新葡亰496net 46
    新葡亰496net 47(NAME = MYDB2_S2_dat,
    新葡亰496net 48FILENAME = ‘c:mssql7dataMYDB2_S2.ndf’,
    新葡亰496net 49SIZE = 20,
    新葡亰496net 50MAXSIZE = 100,
    新葡亰496net 51FILEGROWTH = 20
    新葡亰496net 52)
    新葡亰496net 53Go
    新葡亰496net 54

    新葡亰496net 55

      视图能够实现让不同的用户以不同的方式看到不同或相同的结果集。因此,当有许多不同水平的用户共用同一数据库时,这显得极为重要。

    MYDB2数据库文件
            主文件组        MYDB2_GROUP文件组        日志文件
    逻辑名        MYDB2_P1_dat        MYDB2_P2_dat        MYDB2_S1_dat        MYDB2_S2_dat        MYDB2_log
    文件名        C:mssql7data
    MYDB2_P1.mdf        c:mssql7data
    MYDB2_P2.ndf        C:mssql7data
    MYDB2_S1.ndf        c:mssql7data
    MYDB2_S2.ndf        c:mssql7data
    MYDB2_log.ldf
    初始长度        5MB        5MB        10MB        20MB        10MB
    最大长度        10MB        10MB        50MB        100MB        无限制
    增    量        20%        1MB        10MB        20MB        10%
    2.使用Transact-SQL语句修改数据库
    ALTER DATABASE 语句的语法格式为:

    这很好理解,但我们应该表示更多的规则。例如,如果我们有一个策略,每个讲师必须刚好只传授一个课程?我们可以添加用最大1的条行标志和第二个执行中间线的条行来表示传授关系。这个逻辑适用于关系里涉及的课程。

    • 合并分割数据

    新葡亰496net 56ALTER DATABASE database
    新葡亰496net 57{    ADD FILE <filespec> [,新葡亰496net 58n] [TO FILEGROUP filegroup_name]
    新葡亰496net 59    | ADD LOG FILE <filespec> [,新葡亰496net 60n]
    新葡亰496net 61    | REMOVE FILE logical_file_name 
    新葡亰496net 62    | ADD FILEGROUP filegroup_name
    新葡亰496net 63    | REMOVE FILEGROUP filegroup_name
    新葡亰496net 64    | MODIFY FILE <filespec>
    新葡亰496net 65    | MODIFY FILEGROUP filegroup_name filegroup_property
    新葡亰496net 66}
    新葡亰496net 67<filespec> ::=
    新葡亰496net 68(NAME = logical_file_name
    新葡亰496net 69  [, FILENAME = 'os_file_name' ]
    新葡亰496net 70  [, SIZE = size]
    新葡亰496net 71  [, MAXSIZE = { max_size | UNLIMITED } ]
    新葡亰496net 72  [, FILEGROWTH = growth_increment] )
    新葡亰496net 73

    新葡亰496net 74

      在有些情况下,由于表中数据量太大,故在表的设计时常将表进行水平分割或垂直分割,但表的结构的变化却对应用程序产生不良的影响。如果使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。

    其中,database为待修改的数据库名称。
    ADD FILE子句指出向数据库中添加数据文件,TO FILEGROUP说明新添加数据文件所属的文件组名称。
    ADD LOG FILE子句指出向数据库中新添加的日志文件项。
    REMOVE FILE子句指出从数据库中删除文件,在删除后,SQL Server将该文件对应的物理文件一并从操作系统中删除。
    注意:① 当数据文件内容不为空时,不能将它们从指定数据库中删除;
    ② 当数据文件为主数据文件或数据库日志文件时,不能将它们从指定数据库中删除;
    ③ 当数据文件所属的文件组为默认文件组并且此数据文件是该默认文件组的唯一成员时,不能将它从指定数据库中删除。

    现在,让我们放宽一些规则。我们认为保持一个讲师工作,即使他这次没传授任何东西,但换取这份工作安全,我们想让他有时候可以传授一个或更多的课程。圆形指向线中心,鸡爪在课程框旁。

    • 安全性

    ADD FILEGROUP子句说明向数据库中添加文件组。
    REMOVE FILEGROUP子句说明从数据库中删除文件组,在删除时一并删除文件组中所有数据文件对应的操作系统文件。
    注意:只有当文件组中所有的数据文件为空时才能将它们从数据库中删除。

    新葡亰496net 75

      视图可以作为一种安全机制。通过视图用户只能查看和修改他们所能看到的数据。其它数据库或表既不可见也不可以访问。如果某一用户想要访问视图的结果集,必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响。

       MODIFY FILE指出修改数据文件,文件名称由<filespec>中的NAME参数指定。
    注意:① 每次只能对数据文件的FILENAME、SIZE、FILEGROWTH和MAXSIZE中
              的一项进行修改;
          ② 使用ALTER DATABASE语句改变数据文件大小时,只能增加不能减少。

    这一切都很好,直到我们觉得多对多的关系,这会看起来像这样:

    二、实例

       MODIFY FILEGROUP子句指出待修改的文件组,其中filegroup_name为文件组名称,file_property说明修改后的文件组属性,其取值包含以下几种:
    ?        READONLY:将文件组设置为只读文件组,之后将禁止对其中的数据库对象进行修改。数据库中的主文件组不能设置为只读文件组;
    说明:如果将主文件组被设置为只读文件组,所有用户不能在该数据库中再创建任何新的数据库对象和登录标识,或重新编译存储过程,因为这些工作都需要修改数据库中的系统表。
    ?        READWRITE:删除文件中的只读属性,之后可对该文件组进行读、写操作;
    ?        DEFAULT:将指定文件组设置为数据库的默认文件组,每个数据库中只能有一个默认文件组。
    (1)向MYDB2中添加一个数据文件MYDB2_P3_dat,其大小为10MB,执行后此数据文件被添加到主文件组[PRIMARY]中:

    新葡亰496net 76

      以下示例表结构如下:

    新葡亰496net 77ALTER DATABASE MYDB2
    新葡亰496net 78        ADD FILE(
    新葡亰496net 79                          NAME = MYDB2_P3_dat,
    新葡亰496net 80                FILENAME = ‘c:mssql7dataMYDB2_P3.ndf’,
    新葡亰496net 81                          SIZE = 10MB,
    新葡亰496net 82                          MAXSIZE = 100MB,
    新葡亰496net 83                          FILEGROWTH = 2MB
    新葡亰496net 84                          )
    新葡亰496net 85GO
    新葡亰496net 86

    我们需要有一个明确的关系表,称它“教学任务(Teaching Assignments)”,在讲师和课程之间。实体关系图更容易看懂,不需要看很多的SQL DDL语句。还有其它突出的模式,例如扇形。

    -- ----------------------------
    -- 学生表
    -- ----------------------------
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student` (
      `stu_no` varchar(255) NOT NULL,
      `name` varchar(255) NOT NULL,
      `age` int(11) DEFAULT NULL,
      `password` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`stu_no`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- 学生记录
    -- ----------------------------
    INSERT INTO `student` VALUES ('10001', '张三', '20', 'zhang123');
    INSERT INTO `student` VALUES ('10002', '李四', '21', 'lisi123');
    INSERT INTO `student` VALUES ('10003', '王五', '22', 'wang123');
    -- ----------------------------
    -- 学生成绩表
    -- ----------------------------
    DROP TABLE IF EXISTS `course`;
    CREATE TABLE `course` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `stu_no` varchar(255) NOT NULL,
      `name` varchar(255) NOT NULL,
      `score` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `id_fk` (`stu_no`),
      CONSTRAINT `id_fk` FOREIGN KEY (`stu_no`) REFERENCES `student` (`stu_no`)
    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- 学生成绩记录
    -- ----------------------------
    INSERT INTO `course` VALUES ('1', '10001', 'c  ', '70');
    INSERT INTO `course` VALUES ('2', '10001', 'java', '80');
    INSERT INTO `course` VALUES ('3', '10001', 'lisp', '90');
    INSERT INTO `course` VALUES ('4', '10002', 'c  ', '75');
    INSERT INTO `course` VALUES ('5', '10002', 'java', '80');
    INSERT INTO `course` VALUES ('6', '10003', 'lisp', '91');
    INSERT INTO `course` VALUES ('7', '10003', 'c  ', '73');
    

    (2)向MYDB2中添加一个日志文件MYDB2_LOG2:

     新葡亰496net 87

      学生表与学生成绩表通过stu_no学生学号这个字段进行关联。

    新葡亰496net 88ALTER DATABASE MYDB2
    新葡亰496net 89        ADD LOG FILE
    新葡亰496net 90  (NAME = MYDB2_LOG2,
    新葡亰496net 91    FILENAME = ‘c:mssql7dataMYDB2_LOG2.ldf’, 
    新葡亰496net 92         SIZE = 10MB,
    新葡亰496net 93    MAXSIZE = 50MB,
    新葡亰496net 94    FILEGROWTH = 2MB
    新葡亰496net 95)
    新葡亰496net 96

    我不能把部门和人员正确匹配我们。假设常见的组织架构,这应该2个1:n分部(Divisions)的关系模型。

      1、视图创建

    3)将数据库MYDB2中的文件组MYDB2_GROUP设置为默认文件组:
    ALTER DATABASE MODIFY FILEGROUP MYDB2_GROUP DEFAULT
    3.使用Transact-SQL语句删除数据库
      DROP DATABASE语句的语法格式为:
    DROP DATABASE database_name [,...n]
    其中,database_name为待删除的数据库名。在SQL Server中只有系统管理员和数据库所有者才有删除数据库的权限。
    (1)将以上建立的数据库MYDB2删除:
    DROP DATABASE MYDB2
    4.使用系统存储过程检索数据库的定义信息
    SQL Server提供了下列系统存储过程和语句,让用户检索服务器上的数据库定义信息以及每个数据库文件空间的使用情况:
    ?        sp_helpdb:检索服务器上的所有数据库信息及单个数据库的定义信息;对应的语法格式为:sp_helpdb [新葡亰496net基础加强,数据库设计。‘name’]
    其中,name参数为选项,当提供该参数时,sp_helpdb检索name参数指定的数据库定义信息,否则它检索服务器上的所有数据库信息;
    ?        sp_spaceused:检索数据库中资料空间的使用情况以及表所占用的空间;对应的语法格式为:sp_spaceused [‘objname’] [,’updateusage’]
    其中,objname是数据库中的表名,它要求sp_spaceusage显示系统分配给该表的空间及其使用状况。不指定objname参数时,系统存储过程sp_spaceused将统计当前数据库中的资料空间信息。
    updateusage 参数说明是否在统计空间使用情况前执行DBCC UPDATEUSAGE语句。默认时其值为false,即不执行DBCC UPDATEUSAGE语句。将其值设置为true时,系统将对数据库执行DBCC UPDATEUSAGE语句,这样所得到的空间使用信息将更为准确,但执行该语句要占用一定的时间,尤其是当数据库较大时,其执行时间会更长;
    ?        DBCC SQLPERF(LOGSPACE):检索数据库中的日志空间信息。

    新葡亰496net 97

      语法如下:

    二、数据库表存储结构      在SQL Server中,每个数据库最多可创建20亿个表,一个表允许定义1024列,每行的最大长度为8092字节(不包括文本和图像类型的长度)。当表中定义 有varchar、nvarchar或varbinary类型列时,如果向表中插入的数据行超过8092字节时将导致Transact-SQL语句失败, 并产生错误信息。SQL Server对每个表中行的数量没有直接限制,但它受数据库存储空间的限制。每个数据库的最大空间1048516TB,所以一个表可用的最大空间为 1048516TB减去数据库类系统表和其它数据库对象所占用的空间。
         SQL Server中的资料表分为永久表和临时表两种,永久表在创建后一直存储在数据库文件中,直至用户删除为止。而临时表则在用户退出或系统修复时被自动删 除。临时表又分为局部临时表和全局临时表两种,局部临时表只能由创建它的用户使用,在该用户连接断开时,它被自动删除。全局临时表对系统当前的所有连接用 户来说都是可用的,在使用它的最后一个会话结束时它被自动删除。在创建表时,系统根据当前表名来确定是创建临时表还是永久表,临时表的表名以#开头,除此 之外为永久表。局部临时表表名开头包含一个#号,而全局临时表的表名开头包含两个#号。
    1.使用Transact-SQL语句建立资料表
    CREATE TABLE 语句的语法格式为:

    你可以用多个工具从SQL DDL里获得实体关系图,在更高级查看其它问题模式。这里我不会给ER模型和图的详细说明;现在我只想让你知道它们。接下来,你可以自己学习使用它们。

      CREATE [ALGORITHM]={UNDEFINED|MERGE|TEMPTABLE}]
           VIEW 视图名 [(属性清单)]
           AS SELECT 语句
           [WITH [CASCADED|LOCAL] CHECK OPTION];

    新葡亰496net 98CREATE TABLE
    新葡亰496net 99[
    新葡亰496net 100    database_name.[owner].
    新葡亰496net 101    | owner.
    新葡亰496net 102] table_name
    新葡亰496net 103(
    新葡亰496net 104    {    <column_definition>
    新葡亰496net 105        | column_新葡亰496net基础加强,数据库设计。name AS computed_column_expression
    新葡亰496net 106        | <table_constraint>
    新葡亰496net 107    } [,新葡亰496net 108n]
    新葡亰496net 109)
    新葡亰496net 110[ON {filegroup | DEFAULT} ]
    新葡亰496net 111[TEXTIMAGE_ON {filegroup | DEFAULT} ]
    新葡亰496net 112

    一旦你的表设计已经确定,就可以考虑数据访问了。这通常意味着你会加索引到表。有两类索引:主和从。主索引必须在表上执行唯一性约束,像PRIMARY KEY和UNIQUE约束,从索引添加是为了性能提升。

      ALGORITHM子句:

      其中,table_name为新建立的表名。对于临时表,表名字符串长度不能超过116个字符,而永久表的表名字符串长度则不能超过128个字符。此外,在同一个数据库中,每个表所有者创建的表名必须保证唯一。
      computed_column_expression 指出计算列的定义表达式,计算列是一个虚拟列,它并不是存储在表中,而是由表中的其它非计算列(常规列)导出。计算列定义表达式可以为常规列、常量、变 量、函数组成的表达式,但它不能由一个子查询构成。除了下面情况,计算列可以与常规列一样使用在SELECT列表、WHERE子句和ORDER BY子句中:
    ?        计算列不能用在索引的关键词列;
    ?        计算列不能作为PRIMARY KEY、UNIQUE、FOREIGN KEY或DEFAULT约束定义的一部分;
    ?        计算列不能用INSERT和UPDATE语句插入资料。
        注意:① 在建表语句中,不允许对计算列设置空值属性(NULL或NOT NULL);
            ② 在建表语句中,列与列的定义用逗号分隔,当将PRIMARY KEY设置在最后时,       如果最后一列是常规列,则它后面的逗号可以省略;否则如果是计算列,则此逗号不可以省略。
    ON子句指出存储新建表的数据库文件组。当省略该子句或用DEFAULT关键词时,表被建立在数据库的默认文件组中。
    TEXTIMAGE_ON 子句说明存储新建表中的text、ntext和image列资料的数据库文件组名称。当省略TEXTIMAGE_ON子句时,text、ntext和 image列资料与表存储在同一个文件组中。如果表中不包含text、ntext和image列,则可以省略TEXTIMAGE_ON子句。
    <column_definition> ::= { column_name data_type }
    [ NULL | NOT NULL ]
    [ IDENTITY [(seed, increment ) [NOT FOR REPLICATION] ] ]
    [ ROWGUIDCOL ]
    [ <column_constraint>] [ ...n]
      column_definition 和data_type参数分别说明列名及其数据类型,其中数据类型可以为系统数据类型或用户定义数据类型。对于timestamp数据类型列,列名可以省 略,此时系统用timestamp字符串作为列名。在一个表中只能有一个timestamp类型列。
    NULL和NOT NULL说明列值是否允许为NULL。在SQL Server中,NULL既不是0也不是空格,它意味着用户还没有为列输入资料或是明确地插入了NULL。如果不使用NULL或NOT NULL为列设置空值属性时,列空值属性遵循以下规则:
    ?        对于用户定义数据类型,SQL Server使用该数据类型的空值属性设置;
    ?        对于系统数据类型列,当列数据类型为timestamp时,列的空值属性为NOT NULL。

    SQL引擎会自动为你创建主索引,但这个假设并不对你有好处。在SQL Server里,在一个表上你只能有一个聚集索引,因此小心用它。例如,不用聚集索引在customer_id列作为客户表的主键,你会使用它保持物理文件按部门编号排序,因为这是你的报表分组和汇总的样子。同时使用非聚集索引作为查找客户就可以了。

        ALGORITHM子句是可选的,是对标准SQL的MySQL扩展。ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。

    对于其它数据类型列,其空值属性则由连接选项ANSI_NULL_DFLT_ON和数据库选项‘ANSI null default’决定。
    说明:①通过设置连接选项SET ANSI_NULL_DFLT_ON ON|OFF对列的默认空值属性进行切换;
          ②通过设置数据库选项sp_dboption ‘database’,‘ANSI null default’,‘true’或sp_dboption ‘database’,‘ANSI null default’,‘false’ 对列的默认空值属性进行切换。

    索引的树结构由在CREATE INDEX语句里的列顺序决定。这就是说:

     

    IDENTITY关键词指定该列为IDENTITY列。当用户向表中插入新的资料时,系统自动为该行的 IDENTITY列赋值,并保证其值在表中的唯一性。每个表中只能有一个IDENTITY列,其列值不能由用户更新,不允许空值,也不许关联默认值或建立 DEFAULT约束。IDENTITY列常与PRIMARY KEY约束一起使用,从而保证表中各行具有唯一标识。
    IDENTITY列的数据类型 只能为int、smallint、tinyint、numeric、decimal等数据类型。当IDENTITY列数据类型为numeric和 decimal时,不允许出现小数字。对于IDENTITY列,可用seed参数和increment参数指出IDENTITY列的基值和列值增量。在建 立新表时,必须同时指定IDENTITY列的基值和增量,或同时省去这两个参数。默认时,seed和increment的值均为1。
    说明:① 使用关键词IDENTITYCOL可以引用表中的IDENTITY列,而不使用实际列名。                             因为每个表中只有一个IDENTITY列,所以这样操作不会引起二义性;
           ② 通过使用SQL Server中所提供的的系统函数IDENT_SEED(‘table_name’)和IDENT_INCR(‘table_name’)可以返回指定表中IDENTITY列的基值及其增量。
    ROWGUIDCOL 关键词说明该列为全局唯一标识列,每个表中只能有一个ROWGUIDCOL列,ROWGUIDCOL列的数据类型必须为 uniqueidentifier。ROWGUIDCOL属性不能自动为列赋值,也不要求列值的唯一性。在INSERT语句中,可以使用NEWID函数为 ROWGUIDCOL列赋值。
    2.使用Transact-SQL语句修改资料表
    ALTER TABLE 语句的语法格式为:

    1 CREATE INDEX Foobar ON Customers (state_code, city_name);
    

      对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

    新葡亰496net 113ALTER TABLE table
    新葡亰496net 114{    [ALTER COLUMN column_name
    新葡亰496net 115        {    new_data_type [ (precision[, scale] ) ]
    新葡亰496net 116                    [ NULL | NOT NULL ]
    新葡亰496net 117            | {ADD | DROP} ROWGUIDCOL
    新葡亰496net 118        }
    新葡亰496net 119    ]
    新葡亰496net 120    | ADD
    新葡亰496net 121        {    [ <column_definition> ]
    新葡亰496net 122            |  column_name AS computed_column_expression
    新葡亰496net 123        }[,新葡亰496net 124n]
    新葡亰496net 125    | [WITH CHECK | WITH NOCHECK] ADD
    新葡亰496net 126        { <table_constraint> }[,新葡亰496net 127n]
    新葡亰496net 128    | DROP
    新葡亰496net 129        {    [CONSTRAINT] constraint_name
    新葡亰496net 130            | COLUMN column
    新葡亰496net 131        }[,新葡亰496net 132n]
    新葡亰496net 133    | {CHECK | NOCHECK} CONSTRAINT
    新葡亰496net 134        {ALL | constraint_name[,新葡亰496net 135n]}
    新葡亰496net 136    | {ENABLE | DISABLE} TRIGGER
    新葡亰496net 137        {ALL | trigger_name[,新葡亰496net 138n]}
    新葡亰496net 139}
    新葡亰496net 140
    新葡亰496net 141

     

    在建立一个表后,在使用过程中经常会发现原来创建的表可能存在结构、约束等方面的问题。在这种情况下,如果用一个新表替换原来的表,将造成表中资料 的丢失。使用ALTER TABLE语句可以在保留表中原有资料的基础上修改表结构,打开、关闭或删除已有的约束,或增加新的约束。
    其中,table_name参数说明所修改的表名。
    WITH CHECK 和WITH NOCHECK选项说明向表中添加新的或打开表中原有的CHECK约束和FOREIGN KEY约束时,是否对表中已有资料进行约束检查。使用WITH NOCHECK选项可以禁止对表中已有数据进行约束检查,但该选项对新添加的数据无效,新插入的资料必须接受约束检查。
    ALTER COLUMN子句说明修改表中column_name参数所指定列定义,它可以改变列数据类型和空值设置,添加或删除ROWGUIDCOL属性。但下列类型不能被修改:
    ?        text、ntext、image、timestamp列;
    ?        计算列或用于计算的常规列;
    ?        复制列;
    ?        用于索引列,但如果这些列为varchar或varbinary数据类型,可以增加它们的列长度;
    ?        用在CHECK、FOREIGN KEY、UNIQUE或PRIMARY KEY约束中的列,但如果这些列为变长列,可以使用ALTER TABLE语句改变这些列的定义长度;
    ?        关联有默认值的列。
    使用ALTER COLUMN子句修改列数据类型时,new_data_type参数必须符合以下条件:
    ?        原数据类型必须能够转换为新的数据类型;
    ?        修改后的数据类型不能为timestamp;
    ?        ANSI null default选项是打开的或被修改列允许空值;
    注意:如果表中的对应列原定义为NULL并列中不存在资料时,将此列更改为NOT
          NULL时是允许的。
    ?        ANSI_PADDING选项是打开的;
    ?        对于被修改的IDENTITY列,必须具有有效的IDENTITY数据类型。
    ADD子句说明向表中添加新列,新列的定义方法与CREATE TABLE语句中的相同,包括列名、数据类型、约束条件等。
    注意:在ALTER TABLE语句中,对于新增加的列,必须允许空值,或关联一个默认值。
          无论此列原定义是否为NULL或此列中是否存在资料。
    DROP { [CONSTRAINT] constraint | COLUMN column }子句说明从表中删除指定约束或列。一个表中的下列类型不能被删除:
    ?        复制列;
    ?        用于索引列;
    ?        用于CHECK、FOREIGN KEY、UNIQUE或 PRIMARY KEY约束中的列;
    ?        定义有默认值或关联有默认对象的列;
    ?        关联有规则的列。
          { CHECK | NOCHECK } CONSTRAINT { ALL | constraint }子句说明打开或关闭表中所有或constraint参数指定的FOREIGN KEY和CHECK约束。当使用NOCHECK CONSTRAINT关闭约束时,之后所插入到表中的资料不再接受该约束检查。在打开或关闭表中约束时,可以使用WITH CHECK或WITH NOCHECK子句对表中的资料进行(或不进行)检查。
    3.使用Transact-SQL语句删除资料表
      DROP TABLE 语句的语法格式为:
      DROP TABLE table_name
       其中,table_name为待删除表的名称。
    当 删除一个表时,表之定义和表中的所有数据、以及该表的索引、许可设置、约束、触发器等均被自动删除,与该表相关联的规则和默认对象失去与它的关联关系。但 是,使用DROP TABLE语句不能删除SQL Server系统表和被FOREIGN KEY约束所参照的用户表。

    1 CREATE INDEX Barfoo ON Customers (city_name, state_code); 
    

      对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。

    三、约  束 在数据库管理系统中,保证数据库中的资料完整性是非常重要的。所谓资料完整性,就是指存储在数据库中资料的一致性和正确性。在SQL Server中,可以通过各种约束和默认、规则、触发器等资料对象来保证资料的完整性。其中约束包括以下几种:
    ?        PRIMARY KEY:主键约束;
    ?        FOREIGN KEY:外键约束;
    ?        UNIQUE:     唯一约束;
    ?        CHECK:                 检查约束;
    ?        DEFAULT:    默认值约束。

    逻辑上是一样的,但功能不同。

      对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它应该倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。明确选择TEMPTABLE的1个原因在于,创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定。与MERGE算法相比,锁定释放的速度更快,这样,使用视图的其他客户端不会被屏蔽过长时间。

    在SQL Server中,根据完整性措施所作用的数据库对象和范围不同,可将它们分类为以下几种:
    ?        实体完整性;
    ?        域完整性;
    ?        参照完整性;
    1.        实体完整性
    实体完整性把表中的每行看作一个实体,它要求所有行都具有唯一标识。在SQL Server中,可以通过建立PARMARY KEY约束、UNIQUE约束,以及列的IDENTITY属性等措施来实施实体完整性。
    2.        域完整性
    域完整性要求表中指定列的资料具有正确的数据类型、格式和有效的资料范围。域完整性通过默认值、FOREIGN KEY、CHECK等约束,以及默认、规则等数据库对象来实现。
    3.        参照完整性
    参照完整性维持被参照表和参照表之间的资料一致性,它通过主键(PRIMARY KEY)约束和外键(FOREIGN KEY)约束来实现。在被参照表中,当其主键被其它表所参照时,该行不能被删除,也不允许改变。在参照表中,不允许参照不存在的主键值。

    选择从索引是个非完全多项式(NP-Complete)问题,因此你不能用常规方法创建它们。最好你可以遵循一些简单的启发式。第一个启发式不要重叠索引(over-index)。初学者喜欢增加很多索引让它们的产寻更快。这并不都是对的:查询优化器会忽略用不到的索引,因此事实上它们变成了“无用代码”。但当基表修改的时候,每个插入,更新和删除语句会修改这些无用的索引。这会是很大的负担。

      WITH CHECK OPTION可用于对于可更新视图,可给定WITH CHECK OPTION子句来防止插入或更新行,除非作用在行上的select_statement中的WHERE子句为“真”。意思是说更新后,所更新的结果是否还会在视图中存在。如果更新后的值不在视图范围内,就不允许更新。如果创建视图的时候.没有加上with check option,更新视图中的某项数据的话,mysql并不会进行有效性检查。删掉了就删掉了。在视图中将看不到了。

    (1)        DEFAULT约束
         使用默认值(DEFAULT)约束后,如果资料在插入新行时没有显示为列提供资料,系统将默认值赋给该列。默认值约束所提供的默认值可以为常量、函数、系统零进函数、空值(NULL)等。
             默认值约束的定义格式为:
             [ CONSTRAINT constraint_name ] DEFAULT constraint_expression
         其中,constraint_name参数指出所建立的默认值约束名称。constraint_expression表达式为列提供默认值。
    在使用DEFAULT约束时,还应注意以下两点:
    ?        每列只能有一个DEFAULT约束;
    ?        约束表达式不能参照表中的其它列和其它表、视图或存储过程。
             例如,先创建TB_constraint表,并使用默认值约束为country列设置默认值。之后,再执行ALTER TABLE语句为TB_constraint表的name列添加一个默认值约束:

    第二个启发式如果一列从不在查询条件里使用(意思是说在WHERE、ON或HAVING子句里),那它不应该在索引里出现。

       例:对于一下视图使用WITH CHECK OPTION

    新葡亰496net 142CREATE TABLE TB_constraint
    新葡亰496net 143(
    新葡亰496net 144        name        char(20)        not null,
    新葡亰496net 145        country        varchar(30)
    新葡亰496net 146                CONSTRAINT        DF_country        DEFAULT ‘China’
    新葡亰496net 147)
    新葡亰496net 148GO
    新葡亰496net 149ALTER TABLE TB_countraint ADD CONSTRANT DF_name  DEFAULT ‘UNKNOWN’ FOR name
    新葡亰496net 150

    第三个启发式你不应该有常见列前缀列表的索引。

    1 CREATE TABLE t1 (a INT);
    2 CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
    3 WITH CHECK OPTION;
    4 CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0
    5 WITH LOCAL CHECK OPTION;
    6 CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0
    7 WITH CASCADED CHECK OPTION;
    

    (2)        CHECK约束
         CHECK约束限制输入到一列或多列的可能值,从而保证SQL Server数据库中资料的域完整性。在CHECK约束中可以包含搜索条件,但不能包含子查询。一个表可以定义多个CHECK约束,对于列也可以定义多个CHECK约束。
         注意:① 对于ALTER TABLE语句可以为同一列添加多个CHECK约束,但对于CREATE TABLE语句只能为每列定义一个CHECK约束;
               ② 如果CHECK约束被应用于一列,则它被定义为列级CHECK约束;如果CHECK约束被应用于多列,则它被定义为表级CHECK约束。
         
                       在ALTER TABLE语句和CREATE TABLE语句中,列级CHECK约束和表级CHECK约束的定义格式分别为:
                  [ CONSTRAINT constraint_name ]
                    CHECK [ NOT FOR REPLICATION ](逻辑表达式)
            [ CONSTRAINT constraint_name ]
                      CHECK [ NOT FOR REPLICATION ](搜索条件)
           
                 其中,constraint_name选项指出所建立的CHECK约束的名称。
                       逻辑表达式可以是AND和OR连接的多个简单逻辑表达式而构成的复合型逻辑表达式,搜索条件为布尔表达式。
                     列级CHECK约束只能参照被约束列,而表级CHECK约束则只能参照表中列,它不能参照其它表中资料。
                 例如,为前面已经创建的表TB_constraint增加phone字段及其对应的CHECK约束:
                     ALTER TABLE TB_constraint
                       ADD
                           Phone char(8) null
                             CONSTRAINT CH_phone CHECK
                                     (phone LIKE ‘[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’)
                     在ALTER TABLE语句中,使用CHECK或NOCHECK选项可以打开或关闭某个约束,并可以使用WITH CHECK或WITH NOCHECK子句对表中的资料进行(或不进行)检查。
    例如,将上例中所建立的CHECK约束关闭:
    ALTER TABLE TB_constraint NOCHECK CONSTRAINT CH_phone
    (3)        PRIMARY KEY约束
         PRIMARY KEY约束通过建立唯一索引保证指定列的实体完整性,使用PRIMARY KEY约束时,列的空值属性必须定义为NOT NULL。PRIMARY KEY约束可以应用于表中一列或多列,应用于多列时,它被定义为表级PRIMARY KEY约束,否则被定义为列级PRIMARY KEY约束。
    列级PRIMARY KEY约束的定义格式为:
    [ CONSTRAINT constraint_name ]
             PRIMARY KEY [ CLUSTERED | NONCLUSTERED ]
         [ WITH [ FILLFACTOR = fillfactor ] ]
         [ ON { filegroup | DEFAULT } ]
    表级PRIMARY KEY约束的定义格式为:
    [ CONSTRAINT constraint_name ]
             PRIMARY KEY [ CLUSTERED | NONCLUSTERED ]
                     { ( column [,...n] )}
         [ WITH [ FILLFACTOR = fillfactor ] ]
         [ ON { filegroup | DEFAULT } ]
           SQL Server自动为实施PRIMARY KEY约束的列建立唯一索引。如果在PRIMARY KEY约束中未指定索引类型时,默认情况下所建立的索引为簇索引(CLUSTERED)。该索引只能够通过删除PRIMARY KEY约束或其相关表的方法来删除,而不能使用DROP INDEX语句删除。无论是建立列级PRIMARY KEY约束还是表级PRIMARY KEY约束,每个表只能创建一个PRIMARY KEY约束。
    在PRIMARY KEY约束定义中,WITH子句设置为PRIMARY KEY约束所建立索引的页面填充度,ON子句指出存储索引的数据库文件组名称。
    例如,为表TB_constraint的name列添加PRIMARY KEY约束:
    因为PRIMARY KEY约束禁止被约束列出现重复的列值,所以,在建立PRIMARY KEY约束前应删除前面为name列所建立的DEFAULT约束。
    ALTER TABLE TB_constraint DROP CONSTRAINT DF_name
    GO
    ALTER TABLE TB_constraint ADD CONSTRAINT PK_name PRIMARY KEY (name)
       
    (4)        UNIQUE约束
    UNIQUE约束也能保证一列或多列的实体完整性,每个UNIQUE约束要建立一个唯一索引。对于实施UNIQUE约束的列,不允许有任意两行具有相同的索引值。与PRIMARY KEY约束不同的是,SQL Server允许为一个表建立多个UNIQUE约束。
    列级UNIQUE约束的定义格式为:
    [ CONSTRAINT constraint_name ]
                    UNIQUE [ CLUSTERED | NONCLUSTERED ]
                        [ WITH [ FILLFACTOR = fillfactor ] ]
                            [ ON { filegroup | DEFAULT } ]
    UNIQUE约束应用于多列时称作表级UNIQUE约束,其定义格式为:
    [ CONSTRAINT constraint_name ]
                    UNIQUE [ CLUSTERED | NONCLUSTERED ]
                                    { ( column [,...n] )}
                        [ WITH [ FILLFACTOR = fillfactor ] ]
                            [ ON { filegroup | DEFAULT } ]
            CLUSTERED和NONCLUSTERED关键词分别要求SQL Server对UNIQUE约束自动创建唯一簇索引和非簇索引。为UNIQUE约束所建立的索引也只能通过删除UNIQUE约束或删除表的方法来删除,而 不能够使用DROP INDEX语句删除。
    注意:与PRIMARY KEY约束不同的是:UNIQUE约束允许被约束列的空值属性设置为NULL,但UNIQUE约束不允许表中受约束列有一行以上同时为NULL。
       例如,为表TB_constraint添加UNIQUE约束:
    ALTER TABLE TB_constraint ADD CONSTRAINT UN_phone UNIQUE (name, phone)
        FOREIGN KEY约束
         FOREIGN KEY约束为表中一列或多列资料提供参照完整性。实施FOREIGN KEY约束时,要求在被参照表中定义了PRIMARY KEY约束或UNIQUE约束。FOREIGN KEY约束限制插入到表中被约束列的值必须在被参照表中已经存在。
        表级FOREIGN KEY约束的定义格式为:
            [ CONSTRAINT constraint_name ]
                    FOREIGN KEY [ ( column [,...n] ) ]
                            REFERENCES ref_table [ ( ref_column [,...n] ) ]
                    [ NOT FOR REPLICATION ]
            列级FOREIGN KEY约束的定义格式为:
            [ CONSTRAINT constraint_name ]
                    [ FOREIGN KEY ]
                            REFERENCES ref_table [ ( ref_column ) ]
                    [ NOT FOR REPLICATION ]
       
    其中,ref_table为被参照表,ref_column指出被参照表中的被参照列。被参照表中必须具有 PRIMARY KEY约束和UNIQUE约束。
    在FOREIGN KEY约束中,FOREIGN KEY子句中指定的列数和每列的数据类型必须与REFERENCES子句中的相同。对于列级FOREIGN KEY约束,由于参照列唯一确定,所以可以省略,而只需指出被参照列即可。
    使用FOREIGN KEY约束时,必须注意以下几点:
    ?        一个表最多只能参照253个不同的资料表,每个表也最多只能有253个FOREIGN KEY约束;
    ?        FOREIGN KEY约束不能应用于临时表;
    ?        在实施FOREIGN KEY约束时,用户必须至少拥有被参照中参照列的SELECT或REFERENCES权限;
    ?        FOREIGN KEY约束可以参照自身表中的其它列,这种参照称为自参照;
    ?        FOREIGN KEY约束中,只能参照同一个数据库中的某个表,它不能参照其它数据库中的表。跨数据库参照约束只能通过触发器来实现。
    列如,下面是表titleauthor和表titles的建表语句,为author_id列增加FOREIGN KEY约束:
    CREATE TABLE titleauthor
    (
            author_id                numeric(8)                not null,
            author_name                varchar(12)                not null,
            author_phone        varchar(12)                null
        PRIMARY KEY(author_id)
    )
    CREATE TABLE titles
    (
            title_id                numeric(8)                not null,
            author_id                numeric(8)                not null,
            title                    varchar(12)                null
        PRIMARY KEY(title_id)
    )
    ALTER TABLE titles
    ADD CONSTRAINT FK_author_id FOREIGN KEY (author_id)
    REFERENCES titleauthor (author_id)
    对于一个表,可以使用通过系统存储过程sp_help检索其定义信息,它所返回的内容包括表的结构定义、所有者、创建时间、各种属性、约束和索引等信息。
    sp_help的语法格式为:
    sp_help [ @objname = ] name
    其中,name参数说明所检索表的名称。
    四、规 则
    1、功能:规则的的作用与CHECK约束相同,它检查用户为其所关联的列或所关联的用户的数据类型列所输入数据的有效性。每列或每个用户定义数据类型只能同时关联一个规则,除此之外,每列还可以具有多个CHECK约束。
    2、 创建格式:
      CREATE RULE rule_name  AS condition_expression
    3、说明:rule_name:所创建的规则名称。
          Condition_expression指出规则所定义的条件,它用一个局部变量代表INSERT语句或UPDATE语句所输入的数值。 Condition_expression表达式可以与有效的WHERE子句所指的条件相同,其中可以包含算术运算符、关系运算符和IN、LIKE、 BETWEEN等谓词,也可以包含不参照数据库对象的内置函数。但是,在规则定义中,不能参任何列或其它数据对象。
    例1、        创建一个规则,限制所输入的数据范围为1到999之间的实数
    CREATE RULE money_range
       AS @range>1 and @range<999
    例2、        创建一个规则,限制用户输入的字符串只能在指定的列表条目中:
    CREATE RULE DB_name
    AS @db_name IN (‘SQL SERVER’,’ORACLE’,’INFORMIX’)

    这就是说如果你有个像这样的索引:

      v1视图的内容是t1表中的,v2视图的内容是视图v1中的,v3视图的内容是视图v1中的,但是v3视图定义的时候使用了WITH CHECK OPTION。现在我们执行一些语句

    4、        规则的应用
    在建立规则后,应将它们关联到列或用户定义数据类型才能使它们发挥作用,执行系统存储过程sp_bindrule建立规则关联。在用输入或修改数据时激活规则,系统将自动检查列值是否在规则指定的范围内、或是否与规则指定的数据格式相匹配。
    系统存储过程sp_bindrule语法格式为:
    sp_bindrule [@rulename] ‘rule_name’,[@objname=] ‘object_name’
       说明:rule_name为规则名称
            object_name为“表名.列名”格式时,说明它为一列名,否则,sp_bindrule将 object_name参数视作用户定义数据类型。
        例如:在SHIKONG数据库中建立一个shl_rule规则,然后关联到SPKFK表中的shl列
          CREATE RULE shl_rule
                   AS @shl>0
                Sp_bindrule shl_rule,’spkfk.shl’
    5、        解除规则
    在删除规则前必须执行系统存储过程sp_unbindrule解除规则与列或用户定义数据库类型之间的关联.sp_unbindrule语句的格式为:
    sp_unbindrule [@rulename] ‘rule_name’,[@objname=] ‘object_name’
    解除关联后,规则仍存储在当前数据库中,这时可执行DROP RULE语句将它删除。在DROP RULE语句的语法格式为:
    语法:DROP RULE {rule_name}[,…n]
    在一个DROP RULE语句中,可以一次同时删除多个规则,但必须保证这些规则没有相关联的列或用户定义数据类型,否则,系统将取消DROP RULE语句的执行,并返回一条错误信息。
    五、默认
        默认对象所执行的功能与默认值约束完全一样。但默认值约束是在CREATE TABLE或ALTER TABLE时定义,它与表定义存储在一起,所 以,删除表时,默认值约束被自动删除。而默认对象则需要使用CREATE DEFAULT语句定义,它作为一种数据对象单独存储,所以它可以被多次应用于 不同列。在删除表时不能删除默认对象,而需要使用DROP DEFAULT语句删除。
    1、        创建默认对象
    CREATE DEFAULT [owner.]default_name
    AS  constant_expression
    2、        说明:default_name为所建立的默认对象名称。
         Constant_expression参数为默认对象所提供数据。它可以是由常量、SQL Server内置函数、算术表达式和全局变量等所组成的常量表达式,但是不能包含任何列名或其它数据库对象。在Constant_expression表 达式中,对于字符和日期类型数据应引在单引号内,二进制数据必须以0X作前导符,货币类型以美元符号$开头,对于其它数据类型(如整数和浮点数等)则不需 要定界符。
        CREATE DEFAULT语句只能在当前数据库中创建默认对象。对每个用户来说,他在同一个数据库中所创建的默认对象名称必须保持唯一。
        例如:下面语句分别建立一个字符、日期、二进制、货币和整数等数据类型的默认对象
        CREATE DEFAULT DF_char AS ‘UNKNOWN’
            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语句向表中添加重复的键值行。

    1 CREATE INDEX Floob ON ExampleTable (a, b, c, d); 
    
    1 INSERT INTO v3 VALUES (2); -- [Err] 1369 - CHECK OPTION failed 'test.v3'
    2 INSERT INTO v2 VALUES (2);
    

    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 ]

    那实际上,下列这些索引是赠送的:

      执行第一行的时候会报错。v3视图定义的时候使用了WITH CHECK OPTION,索引v3具有CASCADED检查选项。因此,不仅会针对它自己的检查对插入项进行测试,也会针对基本视图的检查对插入项进行测试。这里对v1进行了检查,v1视图中不符合,所以插入失败。

    其中,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 CREATE INDEX Floob_3 ON ExampleTable (a, b, c);
    2 CREATE INDEX Floob_2 ON ExampleTable (a, b);
    3 CREATE INDEX Floob_1 ON ExampleTable (a); 
    

      执行第二行会成功。v2具有LOCAL检查选项,因此,仅会针对v2检查对插入项进行测试。因为v2定义的时候没有时候WITH CHECK OPTION,索引v2不会对v1继续检查,索引插入成功。

    七、视图:
    定义:视图是用户查看数据库表中资料的一种方式,它相当于一个虚拟表,用户通过它来浏览表中部分或全部资料。而数据的物理存放位置仍然在表中。视图可以基于一个或多个表。
    优点:
    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语句或语句块,它定义触发事件发生时,触发器所执行的动作。
        格式说明:第一种定义式中,触发器的触发事件为INSERT、UPDATE、DELETE等操作,第二种定义格式中的触发事件则只能为INSERT、 UPDATE。在第二种定义格式中,用IF子句进一步说明触发器的触发条件,这些条件限制只有当指定的列的列值被修改时,才激活触发器。
    例如: create trigger tr_spkfk
            on ywmxk
          for insert
          as   
           update spkfjc
           set kcshl=kcshl
            ( select sum(shl)
              from inserted
              where insertec.djbh like ‘jha%’
              group by inserted.spid
              having spkfjc.spid=inserted.spid
            
            )
    限制:1、在调用CREATE TRIGGER语句时,它必须为批中的第一个语句。
    2、        触发器的基表不能为视图。
    3、        WRITETEXT语句和TRUNCATE TABLE语句对触发表的资料操作不能激活触发器。
    4、        由于触发器的主要用是检查和修改资料,所以在触发器不要使用能够返回结果集合的要SELECT语句和变量赋值语句。如果确实需要在触发器对变量赋值,应在触发器定义开始部分使用SET NOCOUNT语句禁止SQL SERVER返回结果集合。

    直接创建隐含的索引是多余的。

       查询学生的最高科目成绩。

    临时表:触发器执行时产生两个特殊的临时表:inserted和deleted.这两个表在结
          构上与触发表结构相同,它们可以用于触发器的条件测试。在执行INSERT或  
        UPDATE语句时,插入到触发表的新行被同时添加到INSERTED表中。而执行    
        DELETE和UPDATE语句时,从触发表中删除的行被插入到DELETED表中。SQL   
        Server执行UPDATE操作时,它先从表中删除旧行,然后再插入新行,其中
        被删除的行插入到DELETED表中,而插入的新行则被同时记录到INSERTED临     
        时表中。
    嵌 套:在SQL Server中,触发器也允许嵌套,其中最嵌套级数为16。
        使用nested triggers服务器选项能够控制是否允许触发器嵌套。
        Sp_configure ‘nested triggers’,1
           reconfigure
    修 改:ALTER TRIGGER语句结构与CREATE TRIGGER语句结构基本一致。
    删 除:DROP TRIGGER {trigger_name}[,…n]
    九、select,delete,update,insert语句使用方法:
    功能说明:
       select:主要执行从数据库中的一个或多个表中查找满足一定条件的资料集合。
       delete:主要执行从数据库的表中删除符合一定条件的资料。
       update:按照一定条件更新数据库表中的资料。
       insert:向数据库表中插入一条资料。
    1、select 语句:
       SELECT select_list
       FROM   table_source
       [ WHERE search_condition      ]
       [ GROUP BY group_by_expression]
       [ HAVING search_condition     ]
       [ ORDER BY order_expresion [ASC | DESC ]   ]
    (1)最基本的SELECT语句形式为:
        SELECT select_list
        FROM   table_source
        其中,select_list指定结果集中要包含的列的名称,多列之间用逗号隔开:
        table_source为要查询的表名。
        例如:
        a.如果查询表中所有列的信息,用“*”代替列名。
            select *  from mchk
        b.在结果集中为列指定别名
            select spbh as 药品编号, hshsj as 含税价格 from spkfk
        c.为表名指定别名。
            select spbh , hshsj  from spkfk a
        d.消除结果集中重复的行。
            select distinct spid from splsk
        e.返回有限的结果。
            TOP n [percent]
            select top 10  djbh,hsje
                   from    cwk
            返回前10条记录。
            select top 10 percent djbh,hsje
                   from    cwk
            返回占查询结果10%的资料。
    (2)选择查询。
         a. 基于比较条件查询
            含税金额等于20000
            select *  from   cwk   where hsje=20000
            含税金额大于5
            select *  from   cwk   where hsje>20000
            条件:=,>,>=,<,<=,<>
         b.基于范围条件查询
           BETWEEN关键词 BETWEEN   AND
           查询发生在'2002/04/1' 和 '2002/05/22'之间的资料
           select *  from    cwk  where rq between ‘2002-04-01’ and ‘2002-05-22’
         c.基于列表条件查询
           IN关键词
           select * from spkfjc  where kcshl IN (100,1000,10000)         
         d.基于字符串匹配条件的查询。
           格式:
            SELECT select_list
            FROM  table_source
            WHERE EXPRESSION LIKE 'STRING'
            字符串中可以包含通配符:
               1. %:代表任意多个字符,A%表示以A开头的字符串,
                                      %A表示以A结尾的字符串,
                                      %A%表示中间出现A的字符串。
                  查询采购入库单
                  select * from cwk where djbh like 'jha%'
               2._(下划线):代表单个字符。
                   根据编号查询武汉客商信息
                 select * from mchk where danwbh  like 'wh00_'
               3.[]:代表指定范围内的单个字符,[]中可以是单个字符([asd]),也可以  
                   是字符范围([a-h])
                   在SPKFK中查询针剂信息。
                   select * from spkfk  where spbh like '[z]%'
               4.[^]:代表不在指定范围内的单个字符,[]中可以是单个字符([asd]),也  
                   可以是字符范围([a-h])
                  在SPKFK中查询非针剂信息。
                   select * from spkfk  where spbh like '[^z]%'
          e.基于未知值(NULL)查询。
                空值实际是指一种未知的,不存在,不可应用的资料,通常用NULL表示。
                查询价格为空资料集合
               select * from spkfk where spid is null

    下一个你经常会用的添加到架构的东西是视图。很多程序员认为视图可以帮助用户减少重复代码的编写。那是对的,但视图的最大优点是它每次用同样的方式做同样的事,对每个人。人总不会一致的。不抱怨的话,相比另一个程序员,程序员不会实现不同的业务规则。Fred读到的规格是(shipping_qty > 100))和Sam读到的规格(shipping_qty >= 100);如果他们使用视图的话,业务规则适用一个且只有一个方式。

    DROP VIEW IF EXISTS highest_course;
    CREATE VIEW highest_course AS
    SELECT s.NAME AS stuname, c.NAME AS course,    max(c.score) AS score
    FROM
            course AS c, student AS s
    WHERE
        s.stu_no = c.stu_no
    GROUP BY
        c.stu_no;
    

    f.基于多个条件选择查询结果。
               在WHERE语句中,可以用逻辑运算符来连接多个条件,构成一个复杂条件  
               进行查询。主要有三个逻辑运算符:
               1 AND :它连接两个条件,如果两个条件都成立,则组合起来的条件成立。
               2 OR  :它连接两个条件,如果其中一个条件成立,则组合条件成立。
               3 NOT :它引出一个条件,将该条件的值取反。         
                 查询没有发生在'2002-04-01' 和 '2002-05-22'之间的资料
                 select *  from cwk where rq not between ‘2002-04-01’ and ‘2002-05-22’ and djbh like ‘xsa%’
                 查询发生在'2002-04-01' 和 '2002-05-22'之间的资料
                 select  * from cwk  where rq  between ‘2002-04-01’ and ‘2002-05-22’ and djbh like ‘xsa%’
                 查询发生在小于等于'2002-04-01' 和大于等于 '2002-05-22'的资料
                  select * from cwk
                    where  rq<='2002-04-01' or rq>='2002-05-22'
       g.查询结果排序
         格式:
           SELECT select_list
                  FROM   talbe_source
                  WHERE  search_condition
                  ORDER BY order_expression [ASC  | DESC]
              其中,order_expression是排序依据的列名,可以有多个列名。ASC按升      
              序排序,DESC按降序排序,默认为ASC
         查询满足WHERE条件的资料,按降序排列。  
              select  * from cwk  where rq  between ‘2002-04-01’ and ‘2002-05-22’ and djbh like ‘xsa%’
                    order by rq desc
     (3)资料分组(northwind数据库)
          a. GROUP BY
             利用GROUP BY可以按一定的条件对查询到的结果进行分组,再对每一组数   
             据计算统计。
         格式:SELECT select_list
                   FROM table_source
                   WHERE search_condition
                   GROUP BY group_by_expression
              比如:查看每一种卖出商品的总数.
            select spid,sum(shl) from ywmxk
                group by spid
       b.HAVING
            HAVING子句用来向使用GROUP BY子句的查询中添加过滤准则,语法与WHERE   
            一样,但WHERE是针对单个行而言,HAVING是针对一组而言。
        区别:1、查询时,先滤掉不满足WHERE中条件的记录,而HAVING子句在分
                     组之后使用。
           2、HAVING可以在子句中包含聚合函数,但WHERE 不行。      
              比如:查看每一种卖出商品的总数,卖出数量大于30.
              select spid,sum(shl) as shl from ywmxk
                    group by spid
                    having sum(shl)>30
          c.COMPUTE 与COMPUTE BY
            COMPUTE子句可以用来计算汇总资料。
        比如:查看日期1994/09/13以后卖出商品的总数,
             select spid,shl as shl from ywmxk  where djbh like 'jha%'
                    compute sum(shl)
            COMPUTE BY可以按给定的条件将查询结果分组,并为每组计算汇总资料      
                 select spid,shl from ywmxk where djbh like 'jha%'
                         order by spid
                         compute sum(shl) by spid   
        若使用了COMPUTE BY,则必须使用ORDER BY,并且COMPUTE BY后面出现           
            的列的顺序必须与ORDER BY后出现的顺序相同。
     (4)T_SQL中的子查询
        子查询有两种类型:简单型和关联型。
                子查询是指SELECT子句嵌在另一个T-SQL语句中,一般情况下,子查      
            询用于另一个SELECT,INSERT,UPDATE或者DELETE语句中的WHERE或HAVING  
            短语中。
       a.简单子查询
        例如:查询销售商品数量大于100的销售出库单信息
    select djbh,hsje from cwk where  djbh in
    (select djbh as shl from ywmxk where djbh like 'xsa%'
    group by djbh  having sum(shl)>100 ))
          b.联结和子查询
             例如:查询销售单据信息同时显示出单位名称
               select a.djbh,a.hsje,b.dwmch from cwk a join mchk b  
                  on a.dwbh=b.dwbh
                   where a.djbh like ‘xsa%’
            在大多情况下,在SELECT语句中的联结比一个等效子查询便容易,效率高,我      
          们应尽可能地使用联结来代替子查询以取得更好的性能。
          c.为什么有时必须使用子查询。
        例如:select a.djbh,a.hsje,b.dwmch from cwk a join mchk b  
                  on a.dwbh=b.dwbh where a.djbh like 'xsa%'   
                 and  a.hsje<(select avg(hsje) from cwk where a.djbh  like 'xsa%')
           因为我们不能比较聚合值--avg(hsje),以及非聚合值hsje.
      
       (6)外联结,交叉联结和自联结。
       a外联结: 对于绝大多数的查询执行,当用户在多个表检索资料时标准的内部   
                   联结就足够了。但有些情况是当用户要检索的信息在两个表中没有公  
                   共资料时,使用外联结和交叉联结是很有用的。
        外联结的类型:左联结,右联结,全外联结。
               左联结和右联结的不同之处仅在于FROM短语中表排列次序不同。
    全外联结是同时使用左联接和右联接。
       例1 使用左联结选择所有商品及其销量。如果没有卖出我们也想看一看。
           select a.spid,a.spmch,isnull(sum(b.shl),0) as shl
    from spkfk a left join ywmxk b on a.spid=b.spid
                   where b.djbh like 'xsa%'
                   group by a.spid,a.spmch
              如果使用内联结没有卖出的商品的信息就不会被显示出来,
         使用isnull函数的目的:把NULL变为0。ISNULL(check_expression,   
                   replacement_value).
          例2 只选择没有卖出的商品名称。
                 select a.spid,a.spmch,isnull(sum(b.shl),0) as shl
    from spkfk a left join ywmxk b on a.spid=b.spid
                    where b.djbh like 'xsa%' and b.spid is null
                    group by a.spid,a.spmch

    通常来讲,视同扮演2个方式。或者他们是本地的语句(通常一个SELECT)和扩展为内嵌的文本,它们的定义保持在架构里。另一个做法是从它们的定义以物理表实现它们的定义。一般而言,当多个会话同时使用它们的时候,一个好的SQL引擎会实现视图,这样的话虚拟表可以在主存里共享,一个会话可以多次使用同样的视图。在SQL Server,你可以在视图上创建索引提高性能。

      执行DESCRIBE highest_course;可以查看这个视图的结构,如字段,字段大小是否为空等。执行结果如下:

    b交叉联结。
            所有表的所有行进行笛卡尔乘积。
            例如:生成所有进货商和所有商品之间的列表。
                 select a.dwmch,b.spmch
                  from mchk a cross join spkfk b
        c.自联结。
            自联结:不是一种特殊的联结,它实际上是在同一表中进行的内联结和外联     
                    结。
            例如:选择具有相同含税售价列表。
              select distinct a.hshsj,a.spmch
              from spkfk a
                  join spkfk b on a.hshsj=b.hshsj
                  and a.spid<>b.spid
              (1)spid不等表示记录自巳不与自己联结。
              (2)distinct存在重复的资料。
    (7)合并:
          UNION是将两个或多个查询合并到一个结果集中的方法,合并后的结果包含合   
          并组中的的所有查询。
          例如:在SPKFK中选择针剂和片剂。
              select * from spkfk  where spbh like '[z]%'
              union
              select * from spkfk  where spbh like '[z]%'

    即使有经验的SQL人员也不知道视图的另一部分; WITH CHECK OPTION子句。如果指定了WITH CHECK OPTION,视图表必须可更新。这个做法是阻止通过WHERE子句的违反。我们用例子解释下:

    新葡亰496net 151 

          注意事项:1、在所有查询中列的数目必须相同,如果不相同。
                    2、所有的数据类型必须兼容。是指经过隐含的转换能够兼容。
    2、delete 语句:
       例1、从ysmxk表中删除行。
             delete ywmxk
             where djbh='xsa00000001'
             根据值为' xsa00000001'的djbh将相应资料行删除。
       例2、通过ID删除某个出版商的sales
            利用联结查找到符合条件记录
    begin tran   
             delete cwk
             from  cwk c
                   join mchk m on c.dwbh=m.dwbh
             where m.danwbh like '1389'
             rollback tran
             利用子查询查找到符合条件记录
             begin tran
             delete cwk
             from   cwk
             where dwbh in
                   (select dwbh from mchk
                    where danwbh like '1389'
                    )
            rollback tran
           优点:可读性好。
           缺点:效率较低。
           在何处必须使用子查询进行删除。
           例如:
                delete ywmxk
                where shl<(select avg(shl) from ywmxk)
                      and djbh like ‘xsa%’
        因为在WHERE子句中有聚合函数,无法使用联结进行处理。
        特例:truncate table 语句
            truncate table sales
        区别:delete语句删除记录时对一行修改都记录日志,
          truncate table不记录日志,只记录整个资料面的释放操作。
    3、update 子句
          update语句可以像select和delete语句一样,可以使用联结和子查询对需要   
          更新的资料加以限制。并且也能使用子查询作为更新值的表达式。
        基本格式:
                 update tablename
                 set  fieldname=fieldvalue
       例如:把总销量大于300的商品的含税售价加10%。
          begin tran
          update spkfk
          set   hshsj=hshsj*1.1
          where spid in
                (select spid
                 from ywmxk
                 group by spid
                 having sum(shl)>=300
                )
          rollbace tran
    4、insert语句:
       基本语法:
           insert into
           table_or_view [(colun_list)]
           {data_values|select_statement}
       例1:添加资料到一行中的所有列
            insert into spkfk
            values('sph00000001',’ztj001’,…,…)
            不用给出列名,但在values中赋值顺序要与表中列的顺序相同,数据类型匹  
        配,不能对identity列赋值.不能违反完整性约束。
       例2:添加资料以一行中的部分列
            insert into
            spkfk(spid,spbh,spmch)
            values(' sph00000002',’ztj001’,’青霉素’)
           要确认没有提供资料列应为identity,允许为null或具有默认值

    1 CREATE VIEW NYC_Personnel
    2 AS
    3 SELECT *
    4 FROM Personnel
    5 WHERE city_name = 'New York'; 
    

      执行SELECT * FROM highest_course;即可查询视图数据内容,结果如下:

    例3:使用insert...select 语句揷入多行
           insert into destdb..jxdjhz
                select * from sourdb..jxdjhz b
                where b.rq=’2002-05-22’
                
    5:扩展:
        CASE表达式在select和update中的应用。
      例1、select d.spbh,
            case  when a.djbh like 'jha%' then sum(a.shl) else 0 end as jhshl,
            case  when a.djbh like 'jha%' then sum(a.hsje) else 0 end as jhje,
            case  when a.djbh like 'jhc%' then sum(a.shl) else 0 end as tcshl,
            case  when a.djbh like 'jhc%' then sum(a.hsje) else 0 end as tcje,
            case  when a.djbh like 'jhb%' then sum(a.hsje) else 0 end as tbje  
            from ywmxk  a  join cwk b on a.djbh=b.djbh join mchk c on c.dwbh=b.dwbh join spkfk d on    a.spid=d.spid
         where b.rq between @startrq and @endrq and c.danwbh= @danwbh
         group by d.spbh,a.djbh

    现在我们用下列语句UPDATE:

    新葡亰496net 152

     

    1 UPDATE NYC_Personnel
    2 SET city_name = 'Birmingham'; –- everyone moved!! 
    

       我们也可以查询名称为张三的最高科目成绩,执行SELECT * FROM highest_course WHERE stuname='张三';即可查询视图内容,结果如下:

    十、函数数据整理
    ABS:ABS函数返回数值表达的绝对值
    语法:ABS(numeric_expression)可以是整型、短整型、微短整型、小数、浮点数、货币、实型或小货币型数。
    ACOS:ACOS函数是一个数学函数,它返回以弧度表示的角度,即:ARCCOS。
    语法:ACOS(float_expression)变量是浮点数数据类型,表示角度的余弦。
    ASIN:反正弦函数。
    SIN:它返回表达式中的正弦值。
    语法:SIN(        float_expression)float_expression是浮点型的资料
    COS:它返回表达式中的余弦值。
    语法:COS(        float_expression)float_expression是浮点型的资料。
    TAN:它返加表达式的正切值。
    COT:它返回表达式中的余切值。
    ATAN:反正切函数。
    SIGN:如果表达式为正,SIGN函数返回1,如果表达为负,SIGN返回-1,如果表达式为0,则函数返回0。
    CEILING:返回不小于给定的数值表达式的最小整数。
    语法:CEILING(numeric_expression)小数、浮点、整数、实数、货币等类型。
    例如:SELECT CEILING(1.45)返回值为2
          SELECT CEILING (-1.45)返回值为-1
    FLOOR:返回不大于给定的数值表达式的最大整数。
    语法:FLOOR(numeric_expression)小数、浮点、整数、实数、货币等类型。
    例如:SELECT FLOOR(1.45)返回值为1
              SELECT FLOOR (-1.45)返回值为-2
    ASCII:ASCII函数返回整数,表示字符表达式最左边的字符的ASCII代码值。
    语法:ASCII(character_expression)
          例:ASCII(‘AB’)返回65。
    CHAR:字符串函数,用于将ASCII码整数转换为字符。
    语法:CHAR(integer_expression)变量是0~255间的正整数。
    例如:CHAR(65)返回‘A’
    CHARINDEX:字符串函数,返回想要的查找字符串,在目标字符中的起始位置。
    语法:CHARINDEX(‘PATTERN’,EXPRESSION[,START_LOCATION]);
    例如:CHARINDE(‘A’,‘BCDEA’,2)返回值为5,其2为从第几个字符进行搜索不写默认为从第一个位置。
    AVG:AVG是个集合函数,它计算数值列的平均值,忽略空值,如果使用了DISTINCT则对重复的值只取一次进行平均。
    语法;AVG([ALL|DISTINCT] expression)
          ALL是缺省值。
    例如:SELECT DISTINCT(AGE)FROM TABLE1 如果任意行有NULL值,则此行被忽略。
    COUNT:是一个集合函数,它返回的整数代表表达式中值的个数通为一个列,DISTINCT和COUNT一起使用时,返回单一值的个数。
        语法:COUNT({[ALL|DISTINCT] EXPRESSION |*})
        例如:SELECT COUNT(COLUMN1)FROM TABLE1,
              返回COLUMN1中没有空值的行数,如果是使用*将返回表中所有行的数目。
             使用DISTINCT则返回唯一值的个数。
    SUM:SUM是一个集合函数,返回表格中选定的数值型列中的值的总和。
        语法:SUM([ALL|DISTINCT]expression)
    MAX:MAX返回表达式中的最大值,
        语法:MAX(expression)
    MIN:MIN返回表达式中的最小值,
        语法:MIN(expression)
    GETDATE:GETDATE是一个函数,它返回系统日期和时间。
        语法:GETDATE()
    DATEADD:DATEADD返回根据日期时间添加的日期,
        语法:DATEADD(datepart,number,date)
        变量:DATEPART是用于计算的日期单位。有一定的格式。
                    NUMBER是指添加至日期变量中的日期单位数。
                    DATE:格式化为日期的字符串,或日期时间型的列名、变量或参数。
        例如:SELECT DATEADD(DAY,7,GETDATE())
    DATEDIFF:返回两个指定日期的日期单位差别。
        语法:DATEDIFF(datepart,date,date)
        例如:DATEDIFF(day,datevar,getdate())   
              返回值为DATEVAR和当前日期相差的天数。
    DATEPART:返回的整数表示日期中的日期单位。
        语法:DATEPART(datepart,date)
        例如:DATEPART(month,getdate())  
          返回值为当前日期的月份数。
    YEAR:显示所提供日期的年,
        语法:YEAR(DATE)  
    MONTH:显示所提供日期的月,
        语法:MONTH(DATE)

    UPDATE会执行,没有任何问题,但我们再次使用NYC_Personnel时,刚才看到的记录现在都消失了。这已不再符合WHERE子句的条件!同样,一个有(col1 = 'B')的INSERT INTO语句没有问题,但在这个视图里从不会看到。

    新葡亰496net 153

    DAY:显示所提供日期的天,
        语法:DAY(DATE)
    CAST:CAST语句用来进行数据类型的转换。
    语法:CAST(expression AS datatype)
    例如:CAST(MYDATE AS VARCHAR)
         把MYDATE 转换成可变字符类型。
    CONVERT:用来进行资料类的转换。
    语法:CONVERT(data_type,expression)
    例如:SELECT ‘my birthday is today’ convert(varchar(12),getdate( ))
          把日期转换成字符串类型,用加号与前边相连。
    EXP:返回以E为底的N次幂。
    语法:EXP(float_expression)
    例如:EXP(0)返回值为1。
    LOG:LOG函数返回浮点表达式的自然对数。
        语法:LOG(float_expression)
    LOG10:LOG函数返回浮点表达式的以10为底的对数值。
        语法:LOG10(float_expression)
    ROUND:ROUND返回给出的数学表达式的,并四舍五入至指定的精度。
        语法:ROUND(numeric_expression,length[,funcion])
        变量:numeric_expression为数值型表达式
    length是四舍五入的精度,小数点后边的数,当为负值时,数字表达式在小数点左边进行四舍五入。
    Function值为0时表达式四舍五入,如果不为0,将数字表达式舍位。
    SQUARE:求平方
        语法:SQUARE(float_expression)
    SQRT:求平方根
        语法:SQRT(float_expression)
    STR:SQRT可以将数值型转换为字符型资料,允许控制小数的格式。
        语法:STR(float_expression[,length[,decimal]])
        变量:length:想要的字符串的总长度。缺省为10。
         decimal:是小数点右边的位数。四舍五入。如果不写长度则为取整,小数后四     
                 舍五入。
    ISNULL:ISNULL可有非空资料代替NULL。
    语法:ISNULL(expression,value)
    例如:SELECT ISNULL(NULL,'ABC')
    LEFT:LEFT函数返回字符表达式从左边开始的给定的字节数。如果该整数是一个负数,  就返回NULL。
        语法:LEFT(character_expression,integer_expression)
        变量:character_expression可以是变量、常量、或表中的列。
              Integer_expression为要返回的字符数。
    RIGHT:RIGHT函数返回字符表达式从右边开始的给定的字节数。如果该整数是一个负
             数,就返回NULL。
        语法:LEFT(character_expression,integer_expression)
        变量:character_expression可以是变量、常量、或表中的列。
              Integer_expression为要返回的字符数。
    LEN:LEN函数提供了字符串表达式中的字符的长度。
        语法:LEN(string-expression)
        例如:LEN(‘ABCE’)值为4
    LOWER:LOWER函数将大写字符转换为小写字符。
        语法:LOWER(character_expression)
              变量是字符表达式。   
    UPPER:UPPER函数将小写字符转换为大写字符。
        语法:UPPER(character_expression)
             变量是字符表达式。   
    REVERSE:REVERSE返回字符串表达式的倒序。
        语法:REVERSE(character_expression)
        例如:REVERSE(‘PAM’)结果为‘MAP’
    LTRIM:LTRIM删除字符表的前导空格。
        语法:LTRIM(character_expression)
             变量是字符表达式。
    RTRIM:RTRIM删除字符表的后继空格。
        语法:RTRIM(character_expression)
             变量是字符表达式。
    NULLIF:如果一对表达式相等,NULLIF函数就返回NULL,如果它们不相等,NULLIF函数就返回第一个表达式的值。
      语法:NULLIF(expression1,expression2)
      变量:expression可以数值型,也可以是字符串。
      例如:SELECT NULLIF(134,135)返回值为134。
    PI:PI函数返回pi的值3。1415926
    REPLACE:REPLACE用串表达式3取代串表达式1中的表达式2。
      语法:REPLACE(‘string1’,‘string2’,‘string3’)
      例如:SELECT REPLACE(‘mydog’,‘dog’,‘car’)
            本例中,用CAR取代了MYDOG中的DOG,结果为MYCAT。
    STUFF:函数可以将表达式的一部分用所提供的另一个字符串替代,替代部分用起始位置和长度来定义。
        语法:STUFF(character_expression,start,length,character_expression)
    LENGTH:是决定要替换的字符数。
        例如:STUFF(‘MY  DOG  FIDO’,8,4,‘SALLY’)
    SUBSTRING:返回字符型的一部分。
        语法:SUBSTRING(expression,start,length)
        例如:SUBSTRING(‘MICROSOFT’,6,4)
              返回SOFT。
    REPLICATE:REPLICATE将字符串表达式复制用户定义的次数。
        语法:REPLICATE(character_expression,integer-expression)
        例如:REPLCATE(‘2’,5)
    十一、游标
    1、应用程序对游标操作过程
    A:用DECLARE语句声明光标,并定义光标类型和属性。
                B:调用OPEN语句打开和填充光标。
        C:执行FETCH语句读取光标中的单行数据,Transact-SQL光标不支持多行读取操作。
        D:如果需要,使用帝UPDATE…WHERE CURRENT OF…或UPDATE…WHERE CURRENT OF…语句修改光标表中的当前行数据。
        E:完成光标操作之后,执行CLOSE语句关闭光标,如果需要还可以OPEN语句打开光标。
        F:最后执行DEALLOCATED语句删除光标,并释放它所占用的所有资源。

    WITH CHECK OPTION会让系统会在INSERT或UPDATE上检查WHERE子句。如果新的或修改的行测试失败,修改会被拒绝,视图还是一样。那么,刚才的UPDATE语句会收到错误信息,你不能在特定方式里修改特定列。

      

    2、        游标定义语法:
    A:SQL-92游标定义语法
    语法:DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
                    FOR select_statement
          [FOR {READ ONLY | UPDATE [OF column_list]}]
    说明:1)cursor_name为所定义的光标名称。
    2)insensitive说明定义的光标使用SELECT语句结果集合的临时拷贝,
      禁止应用程序通过光标对其基表进行修改。
    3)SCROLL选项指出所定义光标的数据操作可以使用以下所有选项:
     ?FIRST:读取光标中的第一行数据;
      ?NEXT:  读取光标当前位置中的下一行数据;
     ?PRIOR: 读取光标当前位置中的上一行数据;
     ?LAST:  读取光标中的最后一条数据;
     ?RELATIVE n :读取光标当前位置之前(n为负数)或之后(n为正数)的第n行资料;
      ?ABSOLUTE n: 读取光标中的第n行数据。
              没有说明SCROLL选项时,DECLARE所定义的光标只能使用NEXT选项,即每次只能读取下一行资料。
             4)select_statement为SELECT查询语句,它定义光标的结果集合,但其中不能使用COUMPUTE、COMPUTE BY、FOR BORWSE和INTO等关键词。
             5)READ ONLY选项说明所定义的光标为只读光标,它禁止UPDATE语句和DELETE语句通过光标修改基表中的数据。
             6)UPDATE [OF column_list]:可以通过光标修改其基表数据,其中可修改的列用column_list参数列出。如果只指定UPDATE关键词,而省略OF column_list参数时,说明非只读光标中的所有列均可以修改。
            注意:光标声明语句中,如果有下列条件之一时,无论是否指定INSENSITIVE选项,系统将自动把所建立的光标定义为INSENSITIVE光标:
    1)        SELECT语句中使用了DISTINCT、UNION、GROUP BY或HAVING等关键词。
    2)        SELECT语句的选择列表中包含有集合表达式。
    3)        所有光标基表均没有建立唯一索引,并且光标具有SCROLL属性时。
    4)        SELECT语句中包含有ORDER BY子句,而ORDER BY子句指定的列又不具备和唯一标识功能。
    B:Transact-SQL游标定义语法
        语法:DECLARE cursor_name CURSOR
                   [LOCAL | GLOBAL]
                   [FORWARD_ONLY | SCROLL]
                   [STATIC | KEYSET | DYNAMIC]
                   [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
                   FOR select_statement
                   [FOR UPDATE [OF column_list]]
        说明:1)其中,cursor_name、SCROLL、UPDATE [OF column_list]参数与SQL-92语法格式定义中同名参数的作用相同。READ_ONLY与SQL-92定义中的READ_ONLY选项的作用相同。
        2)LOCAL和GLOBAL选项分别说明所定义的游标为局部游标或全局游标。
          局部游标的作用域为定义游标的批、存储过程或触发器
          全局游标的作用域为当前连接,在作用域外游标是不可见的。 
        3)FORWARD_ONLY选项指所定义的游标的数据提取操作只能前滚,即FETCH语句只能使用NEXT选项。
        4)STATIC与SQL-92定义中的INSENSITIVE关键字的功能相同,它将游标定义为静态游标。
        5)KEYSET关键字定义一个键集驱动游标,键集游标中的数据行及其顺序是固定的。
        6)DYNAMIC将游标定义为动态游标,可以随时看到游标结果集中被修改的数据,不能使用ABSOLUTE提取选项定位游标。
            7) SCROLL_LOCKS选项要求SQL Server在将数据读入游标时,锁定基表中的数据行,以确保以后能通过游标成功对基表进行定位删除和修改。
        8)OPTIMISTIC说明不锁定基表的数据行,当应用程序通过游标对基表进行修改时,首行检测游标填充之后表中的数据是否被修改,如果被修改则停止当前操作。
        9)select_statement为定义游标集合的SELECT语句,其中不能包含COMPUTE、COMPUTE BY、FOR BROWSE和不INTO关键字。
     注意:游标声明语句中,如果有下列条件之一时,无论是否指定STATIC选项,系统将自动把所建立的光标定义为静态光标:
    1)        SELECT语句中使用了DISTINCT、UNION、GROUP BY或HAVING等            
        关键词。       
    2)SELECT语句的选择列表中包含有集合表达式。
    3)所有光标基表均没有建立唯一索引,而又要求建立键值游标。
    4)SELECT语句中包含有ORDER BY子句,而ORDER BY子句指定的列又不具备唯一标识功能,所定义的动态游标将被转换为键集游标,不能转换为键集游标时,将转换为静态游标。
    3、        填充游标:
        定义游标后,使用OPEN语句可打开并填充游标。OPEN语句的语法格式:
        OPEN {{[GLOBAL] cursor_name}|cursor_variable_name}
            其中cursor_name参数或cursor_variable_name变量指所打开和填充的游标
    名称。
    @@CURSOR_ROWS全局变量
     1)-m说明游标以异方式填充,m为当前键集中已填充的行数;
     2)-1游标为动态游标,游标中的行数是动态变化的。
     3)0指定的游标未打开,或是所打开的游标已经关闭或释放。
     4)n游标被全部填充,返回值为游标中的和数。

    WITH CHECK OPTION可以作为架构级别的CHECK()子句。例如,假设有规则的酒店预定,你不能添加客人到另一个客人已或会占用的房间。不用直接写约束,像这样:

       2、视图结构的修改

    4、提取数据:
        Transact-SQL程序调用FETCH语句提取游标中数据,FETCH每次只提取一行数据,FETCH语句的语法:
    格式:
        FETCH
               [[NEXT | PRIOR | LAST | ABSOLUTE {n | @nvar}
    | RELATIVE {n | @nvar}]FROM]
    {{[GOLBAL] cursorname} | cursor_variable_name}
    [INTO @variable[,...n]]
    说明:1)cursor_name参数或cursor_variable_name变量指出所提取数据的游标名称。
         2)GLOBAL表明所操作游标为一全局游标。
         3)NEXT表明读取游标下一行,第一次对游标实行读取操作时,返回第一行。
       4)PRIOR、FIRST、 LAST、 ABSOLUTE n和RELATIVE n选项只适用于SCROLL游标
         5)INTO子句说明将读取的游标数据存放到指定的局部变量中。
    @@FETCH_STATUS
       1)0: 说明FETCH语句成功执行
      2)-1:说明的指的位置超出了游标结果集合的范围,从而导致读取不到数据
         3)-2: 说明要读取的行已从游标结果集合中删除,它不再是游标结果集中的成员
    5、游标定位修改和删除操作
       SQL Server中的UPDATE语句和DELETE语句也支持游标操作,它们可以通过游标修改或删除游标基表中的当前数据行。用于游标操作时,UPDATE语句和DELTEE语句的格式为:
    1)        UPDATE table_name
              SET 子句
         WHERE CURRENT OF cursor_name
    2)        DELETE FORM table_name
              WHERE CURRENT OF cursor_name
              当游标基于多个数据表时,UPDATE语句和DELETE语句一次只能修改或删除一个基表中的数据,而其它基表中数据不受影响。
      6、关闭和释放游标
         当提取完游标结果集合中的数据时,应及时调用CLOSE语句关闭游标。在关闭游标时,SQL Server删除游标当前的结果集合,并释放游标对数据库的所有锁定。
         CLOSE语句的语法格式:
            CLOSE {{[GLOBAL] cursor_name}| cursor_variable_name}
              DELLOCATE释放游标的数据结构之后,要使用游标必须重新执DECLARE语句。
         DELLOCATE语句的语法格式:
                    DEALLOCATE {{[GLOBAL] cursor_name}| cursor_variable_name}
    十二、存储过程
        1、局部变量:局部变量是用户定义的变量。它用DECLARE语句声明,用户可以用      
    SELECT或SET语句为其赋值。使用范围是定义的批处理、存储过程、储发器。
    命名局部变量的语法:
              declare @variable_name datatype
    [,@variable_name datatype]
    其中,
    A:@variable_name是局部变量的名字,必须以“@”符号开头。
    B:datatype 是为该局部变量指定的数据类型,如果需要,指定资料长度。
        例:声明一个整型变量@order_count ,使用如下语句:
        declare @order_count int
        我们可以 在一条declare语句中声明多个变量,变量之间用逗号分开。
        Declare @lastname varchar(30),@firstname varchar(20)
    C:变量声明以后,系统自动给它们初始为NULL。为局部变量赋值可以使用SET语句。语法:
        Set @variable_name=expression[,@variable_name=expression]…
        其中:
            (1)@variable_name是局部变量名。
            (2)expression是与局部变量的数据类型相匹配的表达式。该表达式的值赋给指定的局部变量。
        例:在批处理中声明两个变量,并为它们赋值,然后将它们用到SELECT语句   
            的WHERE子句中。
        Use shikong
        Go
        Declare @kcshl decimal(15,2),@kcje decimal(15,2)
        Set @kcshl=1000
        Set @kcje=25000
        Select  *  From spkfjc
        Where kcshl<=@kcshl and kcje<=@kcje
        Go
       把spbh为00000001的商品的kcje赋值给@kcje
        Select @kcje=kcje from spkfjc
              Where spbh=’00000001’
        如果SELECT 得到的不是单一的结果而是一个结果集,那么最后一个结果赋给变量。
    2、全局变量:全局变是SQL SERVER系统提供并赋值的变量。用户不能建立全局变量,         也不能用SET语句来修改全局的值。通常将全局变量的值赋给局部变量,以便保存和     
    处理。全局变量的名字以@@开头。
    例如:@@rowcount 表示最近一个语句影响的行数。@@error保存最近执行操作的错误状态。
    3、注释:是程序中不被执行的正文。
    作用:第一、说明代码的含义,增强代码的可读性。
    第二、可以把程序中暂时不用的语句注释掉,等需要时,再将它们恢复。
    单行注释:--  两个减号
    多行注释:/*     */。
    4、流程控制语句。
    A:BEGIN  END
       将一组T-SQL语句作为一个单元执行,BEGIN定义起如位置,END定义结束位置。
       语法:begin
               sql_statements
             end
    B:IF ELSE
       用来控制语句的条件执行,当IF后的条件成立时,就执行其后的语句,否则,若有ELSE语句,就执行ELSE后的语句,若无,则执行IF语句后的其它语句。
       语法:
           if  Boolean_expression
              sql_statements
           [  else
    sql_statements]
        C:IF 和 ELSE 只对后面的一条语句有效,如果IF 或ELSE后面要执行的语句多于一条,那么这些语句需要用BEGIN END括起来组成一个语句块。
        D:WHILE语句
            使用WHILE可以在条件成立的时候重复执行一条或多条语句。语法:
               while  Boolean_expression
                     sql_statements
            WHILE语句只能执行一条语句,如果希望包含多条语句,就应该使用BEGIN END
            例:
              declare @x int
              set @x=0
              while @x<3
              begin
              set @x=@x 1
              print convert(char(1),@x)
              end
    E:BREAK
       BREAK用于退出最内层的WHILE循环。语法如下:
          While Boolean_expression
               Sql_statements
          Break
               Sql_statements
    F:CONTINUE:用于重新开始一次WHILE循环,在CONTINUE之后的语句都不会被执行,而是跳转到循环开始的地方继续执行。
        例:while @<3
            begin
          set @x=@x 1
            print ‘x=’ convert(char(1),@x)
            if (@x=2) continue
            print ‘x is not 2’
          end

     1 CREATE TABLE Hotel
     2 (room_nbr INTEGER NOT NULL,
     3 arrival_date DATE NOT NULL,
     4 departure_date DATE NOT NULL,
     5 guest_name CHAR(30) NOT NULL,
     6 CONSTRAINT schedule_right
     7 CHECK (H1.arrival_date <= H1.departure_date),
     8 –- valid Standard SQL, but going to to work!!
     9 CONSTRAINT no_overlaps
    10 CHECK (NOT EXISTS
    11 (SELECT *
    12 FROM Hotel AS H1, Hotel AS H2
    13 WHERE H1.room_nbr = H2.room_nbr
    14 AND H2.arrival_date < H1.arrival_date
    15 AND H1.arrival_date < H2.departure_date))); 
    

      语法如下:

    G:GOTO
        Goto语句使执行动作转到另一个有标号的语句。GOTO语句和标号之间的语句不会被执行。
        定义GOTO的标识,语法;LABEL:
        执行:GOTO     LABEL
        IF (boolean_expression)
             Begin
             Sql_statements
             End
        Else
        Goto lable6
        ………..
        label6:
             sql_statements
    H:RETURN
       作用是无条件地从过程,语句中退出,其它语句不会被执行。
       RETURN与BREAK很相似,但RETURN可以返回一个整数。语法如下:
       RETURN[integer_expression]
    I:CASE(略)
    5、事务:所谓事务就是一个操作序列,序列中的操作作为一个不可分割的工作单元,要么都执行,要么都不执行。
        事务特性:原子性:(atomicity)要么提交,要和回滚。
                  一致性:(consistency)事务要让系统处于一个正确的状态。
                  孤立性:(isolation)有多个事务同时运行,不会彼此影响。
                  持久性:(durability)表示修改一旦完成,就能在系统中保存下来。
        事务模式:显式事务、隐式事务、自动事务
           1、显式事务是指由用户执行T-SQL事务语句而定义的事务,又称做用户定义事务。
       四种控制语句:
    1、begin tran [trasaction_name] 标识事务开始
    2、rollback tran [trasaction_name | savepoint_name]事务回滚
    3、save tran  savepoint_name 存储事务点
    4、commit tran       提交事务
    2、隐式事务是指在当前事务提交或回滚后,SQL Server自动开始的事务
         3、自动事务模式是SQL Server默认的事务管理模式,当一个语句成功执行后,它被自动提交,而当它执行过程中产生错误时,则自动回滚。
    6、存储过程。
    功能:A:接受输入参数并返回多个值或数据集合。
          B:包含T—SQL语句用以完成特定的操作,其中可以调用其它存储过程。
          C:返回一个提示成功与否及失败的状态代码给调用它的过程。
    优点:A:允许模块化编程,增强代码的重用性和共享性。
          B:加快运行速度
          当客户程序需要访问服务器上的资料时,一般要经过五个步骤:
    (1)        查询语句被发送到服务器
    (2)        服务器编译语句
    (3)        优化产生查询执行计划
    (4)        数据库引擎执行查询
    (5)        执行结果返回客户程序
          C:可以减少网络流量
          D:可以作为安全性机制。
    Create procedure 基本格式:
       Create proc[edure] procedure_name [; number]
            [{@parameter data_type}
             [=default ][output]
            ]
    as sql_statement
    其中:
    1)        procedure_name存储过程名
    2)        number 用于标志存储过程组中的一个存储过程
    3)        parameter存储过程中的输入、输出参数
    4)        datatype参数的数据类型。
    5)        default参数的默认值
    6)        sql_statement在存储过程中要执行的语句。
    例1、create procedure battery_order  //基本型
    as
    sql_statements
    例2、create procedure goods_order //输入参数
              @goodsname varchar(20)
    as
    sql_statements
    例3、create procedure goods_ordersum//输出参数
               @goodsname varchar(20),
               @ordersum money output
    as
      sql_statements
    例4、create procedure goods_order2//默认值
                             @goodsname varchar(20)=null
    as
      sql_statements
    例5、create procedure goods
    as
            sql_statement
            if @@error<>0   return(3)
    else
    return(0)
         SQL SERVER提供了两种传递参数的方式
    1、按位置:直接给出参数的值,顺序与创建存储过程的语句中参数顺序一致。
    2、参数名:参数可以以任意的顺序给出。 “参数名=参数值”
               exec goods_order  @goodsname=’battery’

    schedule_right约束没有问题,因为它没有子查询,但很多产品会检查overlaps约束。我们可以不用表上的no_overlaps约束,我们可以在Hotel表上所有行列上构建一个视图,并增加执行WITH CHECK OPTION的WHERE子句。

      ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
        VIEW view_name [(column_list)]AS
      select_statement
      [WITH [CASCADED | LOCAL] CHECK OPTION]

     

     1 CREATE VIEW Valid_Hotel_Stays (room_nbr, arrival_date, departure_date, guest_name)
     2 AS
     3 SELECT H1.room_nbr, H1.arrival_date, H1.departure_date, H1.guest_name
     4 FROM Hotel AS H1
     5 WHERE NOT EXISTS
     6 (SELECT *
     7 FROM Hotel AS H2
     8 WHERE H1.room_nbr = H2.room_nbr
     9 AND H2.arrival_date < H1.arrival_date
    10 AND H1.arrival_date < H2.departure_date)
    11 AND H1.arrival_date <= H1.departure_date
    12 WITH CHECK OPTION; 
    

       在原来的视图增加一个studentno字段

     

    例如:

     1 -- 修改mysql视图
     2 ALTER VIEW highest_course  AS
     3 SELECT s.stu_no AS studentno, s.NAME AS stuname, c.NAME AS course,    max(c.score) AS score
     4 FROM
     5         course AS c, student AS s
     6 WHERE
     7     s.stu_no = c.stu_no
     8 GROUP BY
     9     c.stu_no;
    10 DESCRIBE highest_course;
    
    修改mysql
    

     

    1 INSERT INTO Valid_Hotel_Stays
    2 VALUES (1, '2011-01-01', '2011-01-03', 'Ron Coe'); 
    

      执行第10行之后视图结构如下:

    转自:

    随后:

    新葡亰496net 154

    其他参考:

    1 INSERT INTO Valid_Hotel_Stays
    2 VALUES (1, '2011-01-03', '2011-01-05', 'John Doe'); 
    

       已经增加了一个字段studentno。

    用途:个人收藏学习

    在第2个INSERT INTO语句上,会给我们想要的违反了WITH CHECK OPTION子句。

      3、删除视图

     

    真正的好处是,这让约束在声明代码(declarative code)里了,且查询优化器可以使用。

    DROP VIEW highest_course;
    

     

    视图可以通过隔离让用户看不到未授权或不需要的数据。理想地,你想为每个用户创建一系列的视图,让他们觉得数据库就像专门为它们设计的一样。这会花点时间,你需要知道如何使用SQL的第三(最被忽略的)子语言——数据控制语言(the DCL (Data Control Language))。

      4、关于查看视图的相关语句

    DCL不是个安全系统;它是SQL数据库的简单的控制工具。它让数据不在安全级别外暴露。

    SELECT * FROM highest_course; -- 查询视图的所有内容
    DESCRIBE highest_course; -- 查询视图的每个字段的信息
    SHOW CREATE VIEW highest_course; -- 查询视图的创建语句
    

    在一个安全的系统里,在最小的安全级别,我们被告知超人是来自外星球的奇怪访客,有常人不及的能力和技能。但我们需要更高的级别来知道他是伪装的Clark Kent,伟大都市报纸的温顺记者~~~

    三、视图主要点

    原文链接:

      视图定义服从下述限制:

    • SELECT语句不能包含FROM子句中的子查询。
    • SELECT语句不能引用系统或用户变量。
    • SELECT语句不能引用预处理语句参数。
    • 在存储过程内,定义不能引用子程序参数或局部变量。
    • 在定义中引用的表或视图必须存在。但是,创建了视图后,能够删除定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。
    • 在定义中不能引用临时表,不能创建临时视图。
    • 在视图定义中命名的表必须已存在。
    • 不能将触发程序与视图关联在一起。
    • 在视图定义中使用了ORDER BY,但是调用的时候使用了新的ORDER BY,那么视图中定义的ORDER BY 将失效,会按照调用时候的ORDER BY排序。

      对于更新视图的内容,我们可以通过更新表数据的方式从而间接地去更新视图内容。

      视图的内容是否更新与WITH CHECK OPTION子句有关,有些视图是可以更新,有些视图是不能。也与视图的可更新性可能会受到系统变量updatable_views_with_limit的值的影响。

    本文由新葡亰496net发布于网络数据库,转载请注明出处:新葡亰496net基础加强,数据库设计

    关键词:

上一篇:操作练习,第四模块MySQL50题作业

下一篇:没有了