编辑推荐

适读人群:《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》适合有一定数据库理论和实践基础的读者。同样也适合数据库管理员,数据库开发人员以及高级用户。

经典原味:面向所有版本SQL方言的编程指南。

构造合理数据模型,修补现有模型的缺陷。

超强作者阵容,三位微软专家联袂巨献。

内容简介

Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》全面系统地介绍了SQL语言各方面的基础知识以及一些高级特性,包括SQL数据语言、SQL方案语言、数据集操作、子查询以及内建函数与条件逻辑等内容。书中每个章节讲述一个相对独立的主题,并提供了相关示例和练习。涵盖了市场上常用数据库版本(MySQL、Oracle及MicrosoftSQLServer等)。同时针对开发基于数据库的应用程序,以及日常的数据库系统管理,《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》都展现了大量经过实践检验的方法和技巧。读者可以通过对《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》循序渐进地学习快速掌握SQL语言,也可以在实际工作中遇到问题时直接翻阅《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》中的相关章节以获取解决方案。

作者简介

  JohnL.Viescas是一位有着超过45年从业经验的独立数据库顾问。他从一位系统分析师开始他的职业生涯,为IBM大型机系统设计大型数据库应用。他在达拉斯的应用数据研究中心工作了六年,在那里他带领30多名员工负责IBM大型计算机数据库产品的研究、开发以及客户支持工作。在应用数据研究工作期间,约翰完成了达拉斯德克萨斯大学的商业金融学位,并以优异的成绩毕业。John1988年加入Tandem计算机公司,在那里他负责在Tandem公司美国西部销售区开发和实施数据库的营销方案。他开发并交付了用于技术研讨会的关系数据库管理系统——NonStopSQL。约翰1989年写了他的*一《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》,AQuickReferenceGuidetoSQL(MicrosoftPress,1989),该书一本是对比了ANSI-86SQL标准、IBM的DB2、微软的SQLServer、甲骨文公司的Oracle、以及Tandem公司的NonStopSQL之间的语法相似性的研究类书。作者于1992年从Tandem公司公休时写了RunningMicrosoftAccess第一版(MicrosoftPress,1992年)。他已经写了四个版本的RunningMicrosoftAccess,以及Running系列的后续作品——三个版本的MicrosoftOfficeAccessInsideOut(MicrosoftPress,2003、2007、2010)和BuildingMicrosoftAccessApplications(MicrosoftPress,2005)。他也是畅销书籍SQLQueriesforMereMortals(AddisonWesley,2014)第三版的作者。John目前保持着连续多年被微软授予微机数据库管理系统*有价值专家(MVP,MostValuableProfessional)的纪录(1993年至2015年)。John与他的妻子在法国巴黎定居了三十多年。

  DouglasJ.Steele从事包括大型机和个人机在内的计算机相关的工作超过45年(是的,他一开始是用穿孔卡的!)。在2012退休前,他在一家大型国际石油公司工作了31年多。尽管他职业生涯的高光时刻是通过发展SCCM任务序列将Windows7推广到全球超过10万台电脑上,但是数据库和数据建模是他的主要工作方向。Douglas超过17年被微软认证为*有价值专家(MVP),他撰写了大量关于Access数据库的文章,Douglas是MicrosoftAccessSolutions:Tips,Tricks,andSecretsfromMicrosoftAccessMVPs(Wiley,2010)的合著者,也是很多书的技术编辑。Douglas为滑铁卢大学系统设计工程硕士,专注于设计非传统电脑用户的用户界面研究。(当然,在七十年代末,很少有人是传统的电脑用户!)他的专业研究源于他的音乐背景(他拥有多伦多英国皇家音乐学院钢琴演奏准学士学位)。他还痴迷于啤酒并毕业于尼亚加拉学院酿酒及啤酒厂操作管理专业(滨湖尼亚加拉,安大略省)。Douglas和他的妻子在加拿大安大略省圣凯瑟琳定居超过34年。读者可以通过邮箱:mvphelp@gmail.com联系Douglas。BenG.Clothier是芝加哥首屈一指的Access和SQLServer开发企业ITImpact公司的解决方案架构师。他曾在著名JStreetTechnology和Advisicon公司做过自由顾问,主要从事从小型个人解决方案到公司全业务应用程序Access项目的相关工作。值得注意的项目包括一家水泥公司的工作跟踪和库存管理系统、给保险商使用的医疗保险计划生成器以及国际航运公司的订单管理系统。

  Ben在UtterAccess是系统管理员,并且和TeresaHennig、GeorgeHepworth、DougYudovich合著了ProfessionalAccess?2013Programming(Wiley,2013);并与TimRuncie和GeorgeHepworth一起合著了Microsoft?AccessinaSharePointWorld(Advisicon,2011);Ben还是Microsoft?Access?2010Programmer’sReference(Wiley,2010)一书的特约作者。他拥有微软SQLServer2012解决方案认证和MySQL5认证开发者等证书。从2009年开始Ben一直是微软的*有价值专家(MVP)。

影印版,无译者

精彩书评

Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》的写作团队实至名归,给我留下了深刻的印象,这么说并不足以表达我对《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》的喜爱,应当说我被这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》震惊了。大多数关于SQL的书只会告诉读者如何去写SQL,而《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》则会告诉读者为什么这样写;大多数关于SQL的书会将数据库设计与实现分开阐述,而《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》则将数据库设计的考量贯穿于SQL的各种使用场景;大多数关于SQL的书只会在阅览完毕后放在书架上落灰,而《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》将成为我的伴手读物。

RogerCarlson,微软AccessMVP(1996–2015年)

写基本的SQL很简单,但是写功能完备且运行高效的SQL就没那么容易了,尤其是对于那些有着复杂需求的关键业务系统。不过现在有了这本优秀的SQL读物,无论读者正在使用哪种数据库管理系统,都可以快速上手编写高质量的SQL。

CraigS.Mullins,MullinsConsulting,Inc.,DB2金牌顾问,IBM数据分析师

这是一本关于SQL的佳作。它采用深入浅出的叙述方式,使得新手也可以理解其内涵。同时,也包含了很多高级的SQL窍门和技巧,能够让SQL老手也受益匪浅。因此,这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》适合任何程度的读者,那些对数据库设计、管理以及SQL编程方面有较高要求的读者都应该阅读这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》。

GrahamMandeno,数据库技术顾问,微软MVP(1996–2015年)

对于关系型数据库和基于SQL的数据库的设计者和开发者来说,这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》是*佳的资源——一部深入浅出的读物,书中有丰富的示例,完美地结合了设计理论与编程实现,这些例子涵盖了当今*常用的数据库实现,其中包括Oracle、DB2、SQLServer、MySQL、PostgreSQL等。《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》用成熟的技术引导读者深入学习SQL,比如在关于分层数据和统计表的讲解中,包含了其内部实现,以及在使用GROUPBY、EXISTS、IN、关联或非关联子查询、窗口函数、各种连接语句时的性能。此外,书中有不少独有的有趣示例,也使得这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》在SQL类著作中格外闪耀。

TimQuinlan,数据库架构师,Oracle认证DBA

对于那些困在多种SQL方言之中急需帮助的读者来说,这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》能够将你从一团乱麻中拉出来。《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》从SQL的各种方言中分离出公有的独立成分,能够让读者做到“阅后即用”。我从1992年就开始使用各种SQL实现,已经算是SQL方言方面的老手了,但依旧能够从这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》中学到不少知识。

TomMoreau博士,SQLServerMVP(2001–2012年)

这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》在描述SQL的使用方面完美地做到了内容丰富、叙述简洁、易于理解——它通过展现如何使用SQL解决现实世界中的需求问题来告诉读者构造SQL查询的方法,并阐明了“数据如何存储”与“数据如何查询”之间的联系,解释了从数据库中准确且高效地取得结果集的全过程。

KennethD.Snell博士,数据库技术顾问,前微软AccessMVP

这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》填补了一个知识断档——新手DBA如何成长为高级DBA——《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》就像是成长过程的路线图、行动指南、罗塞塔石碑,帮助读者从基础SQL应用者变为高阶使用者的教练。与其磕磕绊绊地重新发明轮子,或是迷迷糊糊地摸索数据库的正确使用方法,不如对自己好一点——把这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》带回家。你不仅能够了解到可能需要多年摸索才能见到的各种SQL的实现技巧,还能深入理解数据库供应商各种实现的原因。在你学习SQL的旅途中,这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》能够为你节省出很多时间和精力。

DaveStokes,MySQL社区管理员,就职于甲骨文公司

对于一个严肃的数据库开发人员,《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》属于必读书目。它手把手地告诉读者,SQL解决现实问题的强大能力。《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》的作者们使用了浅显易懂的表达方式告诉读者每一种解决方案的利与弊。我们都知道,一个查询有很多种实现方式,而这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》将告诉读者为什么某一种实现比别的实现更高效。对于这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》,我*钟爱的部分莫过于每一章*后的总结,它会再次向读者强调要点与陷阱。我要向所有的数据库开发人员推荐这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》。

Leo(theDBguyTM),UtterAccess社区主席,微软AccessMVP

我认为这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》不仅适合开发人员,而且适合数据库管理员,它能够告诉读者,在实现一个特定需求时,如何通过多种方式编写高效的SQL实现。我认为,这是一本数据库相关从业人员的必读书。推荐这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》的另一个理由,是它涵盖了几乎所有常见的RDBMS应用场景,因此,对于那些需要将一种RDBMS实现方言翻译为另一种方言的用户,《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》就是你们要找的那本指南。我衷心祝贺《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》的作者们,你们的作品无与伦比。

VivekSharma,甲骨文公司Oracle核心技术与混合云解决方案部门特邀技术专家

目录

Introduction1
ABriefHistoryofSQL1
DatabaseSystemsWeConsidered5
SampleDatabases6
WheretoFindtheSamplesonGitHub7
SummaryoftheChapters8
Chapter1:DataModelDesign11
Item1:VerifyThatAllTablesHaveaPrimaryKey11
Item2:EliminateRedundantStorageofDataItems15
Item3:GetRidofRepeatingGroups19
Item4:StoreOnlyOnePropertyperColumn21
Item5:UnderstandWhyStoringCalculatedDataIsUsuallyaBadIdea25
Item6:DefineForeignKeystoProtectReferentialIntegrity30
Item7:BeSureYourTableRelationshipsMakeSense33
Item8:When3NFIsNotEnough,NormalizeMore37
Item9:UseDenormalizationforInformationWarehouses43
Chapter2:ProgrammabilityandIndexDesign47
Item10:FactorinNullsWhenCreatingIndexes47
Item11:CarefullyConsiderCreationofIndexestoMinimizeIndexandDataScanning52
Item12:UseIndexesforMorethanJustFiltering56
Item13:Don’tGoOverboardwithTriggers61
Item14:ConsiderUsingaFilteredIndextoIncludeor
ExcludeaSubsetofData65
Item15:UseDeclarativeConstraintsInsteadofProgrammingChecks68
Item16:KnowWhichSQLDialectYourProductUsesandWriteAccordingly70
Item17:KnowWhentoUseCalculatedResultsinIndexes74
Chapter3:WhenYouCan’tChangetheDesign79
Item18:UseViewstoSimplifyWhatCannotBeChanged79
Item19:UseETLtoTurnNonrelationalDataintoInformation85
Item20:CreateSummaryTablesandMaintainThem90
Item21:UseUNIONStatementsto“Unpivot”Non-normalizedData94
Chapter4:FilteringandFindingData101
Item22:UnderstandRelationalAlgebraandHowItIsImplementedinSQL101
Item23:FindNon-matchesorMissingRecords108
Item24:KnowWhentoUseCASEtoSolveaProblem110
Item25:KnowTechniquestoSolveMultiple-Criteria
Problems115
Item26:DivideYourDataIfYouNeedaPerfectMatch120
Item27:KnowHowtoCorrectlyFilteraRangeofDatesonaColumnContainingBothDateandTime124
Item28:WriteSargableQueriestoEnsureThattheEngineWillUseIndexes127
Item29:CorrectlyFilterthe“Right”Sideofa“Left”Join132
Chapter5:Aggregation135
Item30:UnderstandHowGROUPBYWorks135
Item31:KeeptheGROUPBYClauseSmall142
Item32:LeverageGROUPBY/HAVINGtoSolveComplexProblems145
Item33:FindMaximumorMinimumValuesWithoutUsingGROUPBY150
Item34:AvoidGettinganErroneousCOUNT()WhenUsingOUTERJOIN156
Item35:IncludeZero-ValueRowsWhenTestingforHAVINGCOUNT(x)<SomeNumber159
Item36:UseDISTINCTtoGetDistinctCounts163
Item37:KnowHowtoUseWindowFunctions166
Item38:CreateRowNumbersandRankaRowover
OtherRows169
Item39:CreateaMovingAggregate172
Chapter6:Subqueries179
Item40:KnowWhereYouCanUseSubqueries179
Item41:KnowtheDifferencebetweenCorrelatedandNon-correlatedSubqueries184
Item42:IfPossible,UseCommonTableExpressionsInsteadofSubqueries190
Item43:CreateMoreEfficientQueriesUsingJoinsRatherthanSubqueries197
Chapter7:GettingandAnalyzingMetadata201
Item44:LearntoUseYourSystem’sQueryAnalyzer201
Item45:LearntoGetMetadataaboutYourDatabase212
Item46:UnderstandHowtheExecutionPlanWorks217
Chapter8:CartesianProducts227
Item47:ProduceCombinationsofRowsbetweenTwoTablesandFlagRowsintheSecondThatIndirectlyRelatetotheFirst227
Item48:UnderstandHowtoRankRowsbyEqual
Quantiles231
Item49:KnowHowtoPairRowsinaTablewithAllOtherRows235
Item50:UnderstandHowtoListCategoriesandtheCountofFirst,Second,orThirdPreferences240
Chapter9:TallyTables247
Item51:UseaTallyTabletoGenerateNullRowsBasedonaParameter247
Item52:UseaTallyTableandWindowFunctionsforSequencing252
Item53:GenerateMultipleRowsBasedonRangeValuesinaTallyTable257
Item54:ConvertaValueinOneTableBasedonaRangeofValuesinaTallyTable261
Item55:UseaDateTabletoSimplifyDateCalculation268
Item56:CreateanAppointmentCalendarTablewithAllDatesEnumeratedinaRange275
Item57:PivotDataUsingaTallyTable278
Chapter10:ModelingHierarchicalData285
Item58:UseanAdjacencyListModelastheStartingPoint286
Item59:UseNestedSetsforFastQueryingPerformancewithInfrequentUpdates288
Item60:UseaMaterializedPathforSimpleSetupandLimitedSearching291
Item61:UseAncestryTraversalClosureforComplexSearching294
Appendix:DateandTimeTypes,Operations,
andFunctions299
IBMDB2299
MicrosoftAccess303
MicrosoftSQLServer305
MySQL308
Oracle313
PostgreSQL315
Index317

前言/序言

  SQL在成为国际标准数据库语言的30余年里,已经在众多数据库产品中得以实现。现在SQL无处不在,高性能事务处理系统、智能手机应用程序以及后端Web接口程序中都在使用SQL语言。甚至有一类NoSQL数据库,其共同特点是(或曾经是)它们不使用SQL。随着NoSQL数据库增加了SQL语言接口,现在NoSQL中“No”的意思是“不仅仅是”SQL(NotOnlySQL)。

  由于SQL的普遍性,你很可能在很多产品和系统环境中都使用过SQL。有一个针对SQL语言的诟病(也许是对的),虽然SQL语言在不同的数据库产品中是类似的,但还是有细微的差别。这些差别源于对SQL标准的不同理解、不同开发模式或者不同的底层架构。通过实例来对比不同产品SQL方言中的细微差别,对于理解这些SQL差异是非常有用的。《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》为SQL查询提供了一个罗塞塔石碑(解释古埃及象形文字的可靠线索),向我们展示了如何使用不同的SQL方言编写SQL查询并解释了SQL方言中的差异。

  我经常强调最好的学习方法是从错误中学习。也就是说,那些懂得从自己和别人的错误中学习的人,才能够获得更多。《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》包含了一些不完整、不正确的SQL查询实例,并向读者解释了这些SQL不完整、不正确的原因,以此通过别人的错误进行学习。

  SQL是一种功能强大且复杂的数据库语言。作为美国和国际SQL标准委员会的数据库顾问和参与者,我见过很多查询没有充分利用SQL的能力。充分理解SQL的语言能力以及复杂性的程序开发人员,不仅可以充分利用SQL的功能构建性能良好的应用程序,还能高效地开发应用程序。《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》提供了61个具体实例来帮助大家学习。

  KeithW.Hare

  JCC咨询有限公司高级顾问

  美国INCITSdm32.2——SQL标准委员会副主席

  ISO/IECJTC1SC32WG3国际SQL标准委员会召集人

  致谢

  一位著名的政治家曾经说过:“抚养一个孩子需要一个村庄”。如果你曾经写过一《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》,不管是技术方面的还是其他方面的,你会明白把你的“孩子”变成一本成功的书需要一个伟大的团队。

  首先,非常感谢我们的策划编辑和项目经理TrinaMacDonald。Trina不仅缠着John使其坚持将SQLQueriesforMereMortals一书打造成为EffectiueSoftwareDevelopment系列丛书,还带领着团队度过了重重难关。John组建了一支真正国际化的团队来完成这《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》,感谢大家工作上的不辞辛劳,尤为感谢TomWickerath在项目前后期给予的协助和技术审校。

  Trina向我们推荐了《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》的内容指导SonglinQiu,在他的帮助下我们了解了编写EffectiueSoftwareDevelopment系列丛书的各个细节,非常感谢Songlin给予我们的指导。Trina精心挑选了庞大的技术编辑团队,他们辛苦地审核和调试了我们的数百个例子,并提供了很多有价值的反馈。感谢负责MySQL的MorganTocker和DaveStokes;感谢负责PostgreSQL的RichardBroersmaJr.;感谢负责IBMDB2和Oracle的CraigMullins;感谢负责Oracle的VivekSharma。

  在写书的过程中,系列丛书编辑、畅销书EffectiveC++,ThirdEdition的作者ScottMeyers,也参与到我们的团队中,在如何把《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》变成EffectiueSoftwareDevelopment系列丛书方面给了我们很多宝贵的建议。希望《Effective SQL:编写高质量SQL语句的61条有效方法(英文版)》可以成为EffectiueSoftwareDevelopment系列丛书的典范。

  JulieNahil、AnnaPopick的制作团队和BarbaraWood帮助我们使书符合出版的要求。我们不能没有你们!

  最后,非常感谢我们的家庭忍受我们在漫长的夜晚写稿和调试例子。他们持久的耐心值得大书特书!

  JohnViescas

  法国,巴黎

  DouglasSteele

  加拿大,安大略省,圣凯瑟琳

  BenClothier

  美国,得克萨斯州,康弗斯

  关于作者

  JohnL.Viescas是一位有着超过45年从业经验的独立数据库顾问。他的职业生涯从系统分析师开始,为IBM大型机系统设计大型数据库应用。他在达拉斯的应用数据研究中心工作了6年,在那里他带领30多名员工负责IBM大型计算机数据库产品的研究、开发以及客户支持工作。在应用


其他推荐