xml地图|网站地图|网站标签 [设为首页] [加入收藏]
当前位置: www8029com > 澳门新葡8522最新网站 > 正文

澳门新葡8522最新网站:始建构造

时间:2019-12-03 04:18来源:澳门新葡8522最新网站
需要学习的朋友可以通过网盘下载: 内容简介  · · · · · · 本书通过大量的实例,详细说明了为提高SQL编程技术而必须面对的思想方法上的根本转变——由以过程式编程方式思考

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

本书通过大量的实例,详细说明了为提高 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标准做出了杰出贡献。

作者简介  · · · · · ·

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


目录  · · · · · ·

第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里给我们的数据类型和简单的行或列约束来模型化数据元。在第三篇,我们把这些行放入表成为实体,关系和辅助数据。

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

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

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

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

澳门新葡8522最新网站 1

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

澳门新葡8522最新网站 2

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

澳门新葡8522最新网站 3

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

澳门新葡8522最新网站 4

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

 澳门新葡8522最新网站 5

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

澳门新葡8522最新网站 6

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

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

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

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

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

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

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

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

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

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

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

1 CREATE INDEX Floob ON ExampleTable (a, b, c, d); 

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

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); 

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

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

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

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

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

现在我们用下列语句UPDATE:

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

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

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

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

 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))); 

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

 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; 

例如:

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

随后:

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

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

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

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

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

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

原文链接:

编辑:澳门新葡8522最新网站 本文来源:澳门新葡8522最新网站:始建构造

关键词: www8029com