首页>参考读物>计算机科学与技术>数据库

Effective SQL:编写高质量SQL语句的61个有效方法
作者 : [法]约翰·L. 维卡斯(John L. Viescas) [加]道格拉斯·J. 斯蒂尔(Douglas J. Steele)[美] 本·G. 克洛西尔(Ben G. Clothier) 著
译者 : 文浩 译
丛书名 : Effective系列丛书
出版日期 : 2018-06-26
ISBN : 978-7-111-60066-4
定价 : 69.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 259
开本 : 16
原书名 : Effective SQL: 61 Specific Ways to Write Better SQL
原出版社: Pearson Education Inc.
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

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

图书特色

Effective SQL
61 Specific Ways to Write Better SQL
Effective SQL
编写高质量SQL语句的61个有效方法
[ 法 ] 约翰 · L. 维卡斯(John L. Viescas)
[ 加 ] 道格拉斯 · J. 斯蒂尔(Douglas J. Steele)   著
[ 美 ] 本 · G. 克洛西尔(Ben G. Clothier)
文浩 译
三位世界顶级数据库顾问和讲师、Microsoft MVP合力撰写,国际SQL标准委员会负责人作序推荐,多位资深数据库专家一致好评
通过通俗易懂的语言、大量的示例展示利用SQL解决现实中的问题来传授编写高质量查询语句的方法,示例囊括市面上的多种主流数据库产品

图书前言

结构化查询语言(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的修改也并没有带来显著提高,不兼容是肯定的。最后,他们只保留了数据库厂商都能够遵循的最小集合。
1986年,美国国家标准协会(ANSI)正式采纳了“ANSI X3.135-1986数据库语言SQL”这个标准,也就是我们熟知的SQL/86标准。本质上,它就是将各种SQL方言之间的相似部分提取出来并标准化,其实许多数据库厂商早就实现了。尽管这个标准还不太完善,但是至少为数据库语言的未来奠定了坚实的基础。
1987年,国际标准化组织(ISO)正式批准了自己的数据库标准(几乎和ANSI SQL/86一样)作为国际标准,标准文件为“ISO 9075:1987数据库语言SQL”(这两个标准通常都简称为SQL/86)。国际数据库社区厂商与美国数据库厂商使用了相同的数据库标准,他们可以联合工作。尽管SQL已经标准化了,但是语言离完成还很远。
很快SQL/86受到舆论、政府和行业专家的多方批评,例如著名的数据库大师C. J. Date认为SQL语法很冗余(相同的查询有不同的写法),缺乏对某些关系运算符以及引用完整性的支持。
为了解决这个问题,ISO和ANSI修改了标准,只采用了原来标准中的核心部分,而且特别增加了对数据引用完整性的支持。1989年中期,ISO发布了名为“ISO 9075:1989数据库语言SQL与完整性增强”的标准文件。同年末期,ANSI也发布了名为“X3.135-1989数据库语言SQL与完整性增强”的标准文件。这两个标准通常简称为SQL/89标准。
人们普遍认为,SQL/86和SQL/89标准缺乏数据库系统应有的最基本功能。例如,标准中没有定义如何修改或删除数据库结构,也没有定义修改数据库的安全权限的方法,即便所有数据库厂商都已经在自己的产品中实现了这些功能(例如,使用CREATE语法创建了数据库对象,但是标准中没有定义ALTER或DROP语法来修改这个数据库对象)。
ANSI和ISO不想再制定一个所有数据库厂商都能支持的“最小集合”,他们把工作重点放在了SQL的修订上,这也许能让SQL变得更加完善。新标准(SQL/92)包括了大多数数据库厂商已经广泛支持的功能,但是也包括一些只有少数数据库厂商支持的功能,甚至还有一些从未实现过的功能。
1992年10月,ANSI与ISO分别发布了新的SQL标准文件“X3.135-1992数据库语言SQL”和“ISO/IEC 9075:1992数据库语言SQL”。SQL/92标准的内容远多于SQL/89,而且涉及的范围更广。例如,新标准中定义了创建数据库结构之后修改它的方法,增加了对字符串、日期和时间的操作运算符,并定义了额外的安全特性。相比之前的标准,SQL/92算是个重要的里程碑。
当数据库厂商致力于实现SQL/92标准中的功能时,他们也在开发和实现自己的功能,从而在SQL标准的基础上扩展新的功能。虽然这些扩展(例如支持更多的数据类型,在SQL/92中只有6种数据类型)能为产品提供更多的功能,而且还可以区分其他的数据库产品,但同时也存在很多隐患。最主要的问题是,扩展导致每个数据库厂商的SQL方言与原始标准相差甚远,这就破坏了应用程序在不同数据库之间运行的可移植性。
1997年,ANSI的X3组织更名为国家信息技术标准委员会(NCITS),原来负责SQL标准的技术委员会现在称为ANSI NCITS-H2。由于SQL标准复杂性的激增,ANSI和ISO标准委员会将标准分成12个有独立编号的部分和一个附录,这样做的原因是,他们已经开始SQL3的工作(这样命名是因为它是标准的第三个主要修订版本),分开之后每个部分的工作可以同时进行。自1997年至今,共制定了两个新的部分。
本书中所有的内容都是基于最新版的ISO SQL标准:数据库语言—SQL/基础(文档ISO/IEC 9075-2:2011)—目前已经在大多数商业数据库系统中实现。ANSI也采用了ISO标准,这个标准因此成了真正的国际化标准。我们还参考了IBM DB2、Microsoft Access、Microsoft SQL Server、MySQL、Oracle和PostgreSQL的最新文档,在需要解释不同数据库产品的不同语法时会用到。虽然你在本书中学习的大多数SQL不是针对某个特定的数据库软件产品,但是我们会在必要的时候向你展示与特定数据库产品相关的示例。
我们关注的数据库
虽然上一节提到了SQL标准,但是这并不意味着所有数据库系统都是一样的。DB-Engines网站收集整理了大量的数据库系统,并按照流行度每月公布一次排名,网址为http://db-engines.com/en/ranking/relational+dbms。
有6个数据库系统持续保持排行榜最热门DBMS好几个月,按字母顺序依次为(括号里的版本是书中测试使用的数据库版本):
1)IBM DB2(Linux、UNIX和Windows版的DB2,v10.5.700.368)
2)Microsoft Access(Microsoft Access 2007,向上兼容2010、2013、2016或更高版本)
3)Microsoft SQL Server(Microsoft SQL Server 2012 11.0.5343.0)
4)MySQL(MySQL社区版5.7.11)
5)Oracle数据库(Oracle Database 11g Express版本11.2.0.2.0)
6)PostgreSQL(PostgreSQL 9.5.2)
这并不意味着书中的代码不能在这6种数据库之外的数据库中运行,我们只是没有在其他数据库或其他版本上测试而已。阅读本书时,你可能会注意到,在针对不同数据库时,我们都添加了说明(标有注意的部分)。注意的内容只涵盖这6种数据库。如果你使用的是其他数据库,运行示例遇到任何问题时,请查阅相关数据库文档。
示例数据库
为了阐明书中的概念,我们创建了一些用于举例的数据库,如下:
1)啤酒风格:这是一个很有趣的游戏,根据Michael Larson的书《Beer: What to Drink Next》(Sterling Epicure,2014)中提到的,对89种不同风格的啤酒进行分类。
2)演出代理:这个数据库用来管理演员、代理、客户和预订。你将使用类似的设计来处理待办事项和酒店预订。
3)菜谱:这个数据库可以用来保存和管理所有喜爱的食谱。
4)销售订单:这个是典型的商店订单数据库,销售自行车、滑板以及相关配件。
5)学生课程:这个数据库用来管理学生的信息、他们参加的课程,以及课程成绩。
我们还为某些条目提供了特殊的示例数据库,在这些条目里面就可以找到与这些示例数据库相关的创建代码。你可以在GitHub上找到与本书相关的数据库表结构和示例数据。
在GitHub上查找示例
很多技术书籍都会附带一个包含全书代码的光盘。我们觉得这太局限了,所以决定把书中的所有示例都放在GitHub上,网址为https://github.com/TexanInParis/Effective-SQL。
GitHub上,最上层的6个文件夹是我们关注的几个数据库系统。6个文件夹中分别包含与书中章节相对应的10个文件夹和1个示例数据库文件夹。
在这10个文件夹中分别包含一些SQL代码文件,文件名与对应章节内的代码清单的编号一致。注意,这些代码不一定适用于所有数据库。如果存在不兼容某些数据库的情况,在每个章节文件夹下面我们都创建了一个名为README的文件,用来记录不同数据库之间的差异。对于Microsoft Access,README文件记录的是哪个示例数据库包含对应章节的代码清单。
GitHub根目录还有一个Listings.xlsx文件,这个文件记录了每个示例数据库对应哪些代码清单,同时还记录了这些代码清单能够适用于6个数据库系统中的哪几个。
每个示例数据库文件夹中都包含许多SQL文件,除了Microsoft Access示例数据库,Microsoft Access文件夹下面包含的都是Microsoft Access 2007格式的.accdb文件。我们使用Microsoft Access 2007格式的原因是它能兼容版本12(2007)以上的所有版本。示例数据库文件夹下面的某些文件是用来创建数据库表结构的,另外一些是用来插入示例数据库的数据的。(注意,书中的某些条目依赖于某些特定的数据。这些条目需要的数据库结构和数据有时就包含在章节的代码清单中。)
在准备本书的代码清单时,有些时候会遇到每行63个字符的限制,这个限制是纸质书规定的。某些代码清单可能存在编辑错误。当你不确定的时候,请参考我们在GitHub上的代码清单,上面的代码清单都测试过,我们确信都是正确的。
章节概要
正如本书的书名所示,书中共包含了61个方法。每个方法条目都是相对独立的。如果你使用某个条目里面的内容,不需要阅读其他条目。当然,也有特例,有些条目里的内容依赖于其他条目。在这种情况下,我们尽可能地提供它们之间的依赖关系,但绝大多数情况下,我们都提供了它们之间的引用关系,所以你可以自行查阅。
虽然每个条目正如我们说的那样相互独立,但是仍然可以分成不同的主题。我们把它们分成以下10个主题:
1)数据模型设计:如果你面对的是糟糕的数据模型设计,想要编写高效的SQL语句是不太可能的,该章包含一些基本的数据模型设计原则。如果你的数据库设计违反了该章中讨论的任何原则,你应当找出问题所在并修复。
2)可编程性与索引设计:仅靠良好的逻辑数据模型设计是写不出高效的SQL语句的。你还必须保证设计被正确实施,否则你可能会发现使用SQL从数据库中高效查询数据的能力会大打折扣。该章将帮助你了解索引的重要性,以及如何正确地使用它。
3)当你不能改变设计时:有时,就算你使出浑身解数,也没办法处理在你控制之外的外部数据。该章将帮助你解决这个难题。
4)过滤与查找数据:从数据库中查询或过滤数据的能力是SQL的主要功能之一。该章探讨了几种不同的方法,可以用来查询所需的数据。
5)聚合:SQL标准一直都有聚合数据的功能。但是,通常你得提供诸如“按客户统计总数”“按天统计订单数”或者“按月统计每个类型的平均销售额”等的统计方式。它总是跟在“按”“以”或者“每”后面。该章将介绍高效聚合数据的技术,其中还会介绍如何使用窗口函数解决更为复杂的聚合问题。
6)子查询:使用子查询有很多种方法。本章将介绍在SQL语句中使用子查询获得更多灵活性的各种方法。
7)获取与分析元数据:有时候会觉得信息不够。你需要有关数据的信息,甚至可能需要有关数据如何被查询到的信息。这种情况下,使用SQL获取数据库元数据可能会有帮助。该章可能会针对某个数据库产品,但我们希望书中提供了足够的信息,以便你可以将这些原则应用到数据库系统中。
8)笛卡儿积:笛卡儿积是将一个表中的所有行与第二个表中的所有行组合在一起的结果。虽然可能不像其他表连接查询那样常用,但该章中展示的案例如果不使用笛卡儿积是没办法解决的。
9)计数表:另外一个有用的工具就是计数表,通常是具有单列连续递增数字的表、单列连续递增日期,或者更复杂一点的用作记录行列转换函数所需列名的表。笛卡儿积依赖于表中实际存储的数据,而计数表则不受此限制。该章介绍了几种只有使用计数表才能解决的问题。
10)层次数据建模:在关系数据库中,层次数据建模并不罕见。糟糕的是,它恰好是SQL的一个软肋。该章将帮助你如何在数据规范化和查询与维护元数据的便利性之间进行权衡。
每种数据库系统都有一些用来计算或者操作日期与时间的函数。同样,每种数据库系统也有自己的日期与时间的数据库类型和计算规则。由于这些差异的存在,我们特意提供了一个附录,在使用日期和时间的时候提供给你一些帮助。虽然我们确信已经总结了所有的数据类型和运算符,但还是强烈建议你参考相关的数据库文档,了解你使用的函数的特定语法。

上架指导

计算机\数据库

封底文字

“鉴于作者在业内的声誉,这本书想必会让人印象深刻,可实际仍超出预期,我彻底被它震撼了。……大部分SQL书籍都陈放在我的书架上,而本书永远放在我的办公桌上。”
——Roger Carlson,Microsoft Access MVP(2006–2015)
“……但现在,有了这本书,编写高效的SQL语句会比以前快很多,无论你使用的是哪种DBMS。”
——Craig S. Mullins,Mullins Consulting公司,DB2金牌顾问与IBM顶级分析师
“这本书可谓精妙绝伦。全书用初学者也能读懂的浅易语言编写,同时,那些技巧与窍门使行业专家也能从中受益。本书适合于任何专注数据库设计、管理或编程的人,他们的书架上就应该放着这样一本书。”
——Graham Mandeno,数据库顾问与Microsoft MVP (1996–2015)
“这本书任何关系型数据库或SQL数据库的程序员与设计师来说,本书都是一本卓越的读物——语言通俗易懂,示例知行合一。……书中的技巧举世无双,示例妙趣横生,绝对不同凡响。
——Tim Quinlan,数据库架构师与Oracle认证DBA
“这本书适合有不同SQL方言工作经验的人。每个方法都是独立的,你可以按需阅读。”
——Tom Moreau博士,SQL Server MVP (2001–2012)
“这本书讲述了SQL的使用技巧,内容紧凑、直观有力、语言通俗易懂——通过用SQL解决现实中的问题来传授如何编写查询语句……以获得准确高效的查询结果。”
——Kenneth D. Snell博士,数据库咨询师与前Microsoft Access MVP
“……本书结合现实中真实存在的问题,引导你如何从基础的结构化查询语言(SQL)进阶到运用更为高级的技巧来解决问题……与其瞎忙或到处寻找答案,不如帮自己一个忙:直接买这本书吧。……为了节省时间、精力与避免徒劳无益,买这本书就对了。”
——Dave Stokes,MySQL社区管理员,Oracle公司职员
“本书是从事数据库开发人员必不可少的一本书。书中展示了如何使用强大的SQL一步一步地解决现实中的问题。……向所有从事数据库开发的同行们强烈推荐本书。”
——Leo (theDBguyTM),UtterAccess论坛版主与Microsoft Access MVP
“这本书讲述了如何编写高效SQL以及解决特定问题的不同解决方案……作者做了件很了不起的事情,我表示由衷的感谢。”
——Vivek Sharma,Oracle亚太地区混合云解决方案,核心云技术专家

译者序

大多数软件开发人员都会接触数据库开发,SQL的语法虽然很容易学习,但是要写出高效的SQL语句却很困难。首先你必须了解项目需求,然后还要熟悉你所使用的数据库产品,最后才能有针对性地写出有用的SQL查询。但实际上能做到以上两点的开发人员很少,因为开发人员往往更熟悉项目需求,而疏于数据库与SQL技能;DBA熟悉数据库的各种调优技能,但不太了解项目各方面的需求,编写SQL也会感觉心余力绌。作为一本经验总结性的著作,本书将帮助开发人员摆脱这个窘境,是开发人员甚至DBA不可或缺的手边书。
在翻译这本书的过程中,我深深地体会到作者的良苦用心,作者擅长运用通俗易懂的语言阐述自己的观点,并配合贴近真实项目的案例佐证修改之后SQL的高效与精确。翻译中,我往往会受作者一言启发,犹如醍醐灌顶,恍然大悟!建议大家在阅读每一条方法时着重理解作者要解决的问题,当项目中遇到类似的问题时,再回过头来重新习读,这样可能效果更好。
很荣幸能够有机会承担本书的翻译工作。在翻译过程中,经常会为一句话、一个术语进行反复讨论,到处查找资料,力图使本书的翻译能正确、贴切地反映原文的意思,同时注意使句子、段落符合中国人的语言习惯。真挚地希望你能从本书中获益,这是作者的初衷,也是我的愿望!
由于我的能力有限,表达方式也有所欠缺,因此译文中不可避免会有疏漏和不足之处,希望广大读者多多指正,我将不胜感激。

文浩

图书目录

本书赞誉
译者序

前言
致谢
关于作者
关于技术编辑
第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

教学资源推荐
作者: 丁兆云 周鋆 杜振国 著
作者: [美]尼娜·朱梅尔(Nina Zumel) 约翰·芒特(John Mount) 著
作者: Philip M. Lewis, Arthur Bernstein, Michael Kifer
作者: K.P.Soman;Shyam Diwakar;V.Ajay
参考读物推荐
作者: 陈雷 等编著内封:陈雷 方波 黄桃 李乐 施洪宝 熊浩含 闫昌 张仕华 周生政 编著