游戏化思维自学英语,像玩游戏一样过关斩将,让你对学习上瘾,在无形之中用地道的英语跟老外谈笑风生。详情加微信了解:cool-smiler

Effective SQL:编写高质量SQL语句的61个有效方法

书城 JackLeon 2个月前 (04-13) 60次浏览 0个评论 扫描二维码
文章目录[隐藏]

Effective SQL:编写高质量SQL语句的61个有效方法

Effective SQL:编写高质量 SQL 语句的 61 个有效方法

内容简介

本书结合 SQL 实践与实际案例,整合了实用的解决方案与洞见,可帮助大家解决复杂的问题,设计出能简化数据管理的数据库。作者拥有担任世界数据库顾问与讲师的丰富经验,在本书中归纳了编写高质量 SQL 语句的 61 个具体方法,并提供不同 SQL 版本的差异详情,无论你使用何种 SQL 版本都能从中获益。书中提供了大量清晰、务实的解释,以及专家的建议与大量实用的代码。本书除了介绍语法之外,还会讨论数据库设计的佳实践、层次结构管理与元数据等议题。若你对 SQL 已经有基本的认识,本书将能帮助你成为解决 SQL 问题的专家。书中内容涵盖各种 SQL 版本:IBMDB2、MicrosoftAccess、MicrosoftSQLServer、MySQL、OracleDatabase 与 PostgreSQL。

目录

目  录 Contents

本书赞誉

译者序

前言

致谢

关于作者

关于技术编辑

第 1 章 数据模型设计 1

第 1 条:确保所有表都有主键 1

第 2 条:避免存储冗余数据 4

第 3 条:消除重复数据组 7

第 4 条:每列只存储一个属性 9

第 5 条:理解为什么存储计算列通常有害无益 13

第 6 条:定义外键以确保引用完整性 16

第 7 条:确保表间关系的合理性 19

第 8 条:当第三范式不够时,采用更多范式 22

第 9 条:非规范化数据仓库 27

第 2 章 可编程性与索引设计 30

第 10 条:创建索引时空值的影响 30

第 11 条:创建索引时谨慎考虑以最小化索引和数据扫描 35

第 12 条:索引不只是过滤 37

第 13 条:不要过度使用触发器 41

第 14 条:使用过滤索引包含或排除数据子集 45

第 15 条:使用声明式约束替代编码校验 47

第 16 条:了解数据库使用的 SQL 方言并编写相应的代码 48

第 17 条:了解何时在索引中使用计算结果 51

第 3 章 当你不能改变设计时 55

第 18 条:使用视图来简化不能更改的内容 55

第 19 条:使用 ETL 将非关系数据转换为有用的信息 60

第 20 条:创建汇总表并维护 64

第 21 条:使用 UNION 语句将非规范化数据列转行 66

第 4 章 过滤与查找数据 72

第 22 条:了解关系代数及其如何在 SQL 中实现 72

第 23 条:查找不匹配或缺失的记录 78

第 24 条:了解何时使用 CASE 解决问题 79

第 25 条:了解解决多条件查询的技术 83

第 26 条:如需完美匹配,先对数据进行除操作 88

第 27 条:如何按时间范围正确地过滤日期和时间的列 91

第 28 条:书写可参数化搜索的查询以确保引擎使用索引 94

第 29 条:正确地定义“左”连接的“右”侧 97

第 5 章 聚合 100

第 30 条:理解 GROUP BY 的工作原理 100

第 31 条:简化 GROUP BY 子句 106

第 32 条:利用 GROUP BY 或 HAVING 解决复杂的问题 109

第 33 条:避免使用 GROUP BY 来查找最大值或最小值 113

第 34 条:使用 OUTER JOIN 时避免获取错误的 COUNT()117

第 35 条:测试 HAVING COUNT(x) <某数时包含零值记录 121

第 36 条:使用 DISTINCT 获取不重复的计数 123

第 37 条:知道如何使用窗口函数 126

第 38 条:创建行号与排名 129

第 39 条:创建可移动聚合函数 131

第 6 章 子查询 136

第 40 条:了解在何处使用子查询 136

第 41 条:了解关联和非关联子查询的差异 140

第 42 条:尽可能使用公共表表达式而不是子查询 145

第 43 条:使用连接而非子查询创建更高效的查询 151

第 7 章 获取与分析元数据 154

第 44 条:了解如何使用系统的查询分析器 154

第 45 条:学习获取数据库的元数据 164

第 46 条:理解执行计划的工作原理 168

第 8 章 笛卡儿积 175

第 47 条:生成两张表所有行的组合并标示一张表中间接关联另一张表的列 175

第 48 条:理解如何以等分量排名 177

第 49 条:知道如何对表中的行配对 181

第 50 条:理解如何列出类别与前三偏好 185

第 9 章 计数表 189

第 51 条:根据计数表内定义的参数生成空行 189

第 52 条:使用计数表和窗口函数生成序列 193

第 53 条:根据计数表内定义的范围生成行 196

第 54 条:根据计数表定义的值范围转换某个表中的值 199

第 55 条:使用日期表简化日期计算 205

第 56 条:创建在某个范围内所有日期的日程表 209

第 57 条:使用计数表行转列 212

第 10 章 层次数据建模 217

第 58 条:从邻接列表模型开始 218

第 59 条:对不常更新的数据使用嵌套集以提升查询性能 220

第 60 条:使用存储路径简化设置与搜索 222

第 61 条:使用祖先遍历闭包做复杂搜索 224

附录 日期与时间类型、运算符和函数 228

前言/序言

结构化查询语言(Structured Query Language)简称 SQL,是与大多数数据库系统通信的标准语言。如果你正在阅读本书并希望从数据库系统中获取信息,那么就需要使用 SQL。

本书面向从事 SQL 工作的开发人员和初级数据库管理员(DBA),适合对 SQL 的基本语法比较熟悉并且希望再获得一些有用的技巧以便更高效地使用 SQL 语言的人。而且我们发现,当从计算机编程惯用的基于过程的方式转变为基于集合的方式来解决问题时,所需的思维方式是截然不同的。

关系数据库管理系统(RDBMS)是一种软件应用程序,用于创建、维护、修改和操作关系数据库。许多关系数据库系统也提供了用于操作数据库中数据的客户端工具。关系数据库系统自出现以来一直在不断发展,并随着硬件技术和操作系统环境的进步变得更加完善和强大。

SQL 简史 IBM 研究员 Edgar F. Codd 博士(1923—2003)在 1969 年首次提出了关系数据库模型。他在 20 世纪 60 年代后期研究了处理大量数据的新方法,并开始思考如何应用数学原理解决遇到的各种问题。

自 1970 年 Codd 博士向世界提出了关系数据库模型之后,许多组织(如大学和研究实验室)开始致力于开发一种语言,用作支持关系数据库的基础。20 世纪 70 年代中期几种不同的语言出现,其中一个正是来自位于加利福尼亚州圣何塞的 IBM 圣特雷莎研究实验室的努力。

20 世纪 70 年代初,IBM 启动了一个名为 System/R 的重大科研项目,旨在证明关系模型的可行性,并希望在设计和实现关系数据库方面获得一些经验。1974~1975 年,他们的初次实验获得成功,创建了一个关系数据库的迷你原型。

在开发关系数据库的同时,研究人员也在努力定义数据库语言。1974 年,Donald Chamberlin 博士和他的同事发明了结构化英语查询语言(Structured English Query Language,SEQUEL),这门语言允许用户使用清晰易懂的英语句子操作关系数据库。原型数据库 SEQUEL-XRM 的初步成功,激励着 Chamberlin 和他的同事,他们决定继续研究。1976~1977 年,他们把语言名称从 SEQUEL 修改为 SEQUEL/2,但是不巧,SEQUEL 缩写已经被别人使用了,出于法律原因,他们不得不将 SEQUEL 更名为 SQL(结构化查询语言或 SQL 查询语言)。时至今日,虽然大家已经广泛接受了官方发音“ess-cue-el”,但是许多人还是将 SQL 读作“sequel”。

虽然 IBM 的 System/R 项目与 SQL 语言证明关系数据库是可行的,但是由于当时的硬件技术水平太低,这款产品并没有商用。

1977 年,加利福尼亚州门罗公园的一群工程师创办了 Relational Software 公司,他们开发了一套基于 SQL 的关系数据库产品并命名为 Oracle。1979 年,Relational Software 公司发布了这款产品,使之成为第一个商业化的关系数据库产品。Oracle 的一大优势是能运行在 Digital 的 VAX 小型机上,而不是昂贵的 IBM 大型机。Relational Software 公司此后更名为 Oracle 公司,成为 RDBMS 软件领域领先的厂商之一。

大约在同一时间,来自加利福尼亚大学伯克利分校计算机实验室的 Michael Stonebraker、Eugene Wong 和其他几位教授也在研究关系数据库技术。他们也开发了一个关系数据库的原型,命名为 Ingres。Ingres 使用一种称为查询语言(QUEL)的数据库语言,它比 SQL 结构更为清晰,而且使用了更少的类似英语的词句。但是,很明显当时 SQL 正在慢慢变成数据库标准语言,所以 Ingres 最终改为基于 SQL 的关系数据库。1980 年,这几位教授离开伯克利,成立了 Relational Technology 公司。1981 年,他们发布了 Ingres 的第一个商业版本。Relational Technology 公司之后经历了几次变革。Ingres 之前为 Computer Associates International 公司所有,现在属于 Actian 公司,但不管怎么样,Ingres 仍然是行业数一数二的数据库产品。

1981 年,IBM 也宣布开发自己的关系数据库,名为 SQL/DataSys(SQL / DS),并于 1982 年发布。1983 年,IBM 公司推出了一种名为 Database 2(DB2)的新型关系数据库产品,它可以在安装 IBM 的主流 MVS 操作系统的 IBM 大型机上运行。1985 年第一次发布之后,DB2 就成为 IBM 首屈一指的关系数据库,其技术已经融入 IBM 整个产品线中。

随着数据库语言的不断发展,语言标准化的想法在数据库社区中呼声渐长。但是,由谁来制定标准,或者应该参照哪个方言来制定一直没有达成共识,所以每个开发商还在不断开发与改进他们自己的数据库产品,并希望有朝一日自己的数据库方言能够成为行业标准。

许多开发商都会根据用户的反馈和需求在自己的数据库方言中增加新的元素,从而形成了早期非正规的标准。相对现在的标准来说它只能算是很小的一部分,因为它只包含各种 SQL 方言中相似的部分。然而,正是这一小部分规范(尽管不是很完善)为数据库用户提供了一套权威的评判标准,通过这些标准可以判断市场上的各种数据库,并且用户可以在不同数据库间切换。

1982 年,为了满足关系数据库语言标准化日益增长的需求,美国国家标准协会(ANSI)委托旗下 X3 组织数据库技术委员会 X3H2 制定一个标准。一番周折之后(包括对 SQL 的大量改进),委员会才意识到新的标准与市面上主要的 SQL 方言不兼容,对 SQL 的修改也并没有带来显著提高。


温馨提示:若在升级会员或付费后阅读过程中遇到问题,请加客服微信号(cool-smiler)沟通解决,祝您生活愉快。
转载请注明原文链接:Effective SQL:编写高质量SQL语句的61个有效方法
喜欢 (0)
[1186664388@qq.com]
分享 (0)
关于作者:
创享视界(creativeview.cn)是一个带动全民颠覆八小时工作制,通过投稿把自己的创意智慧变现的方式创造被动收入,从而实现财务自由的平台。我们相信,创新思维不仅有助于打造更出色的产品,还可以让世界变得更美好,让人人受益。
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
%d 博主赞过: