John L. Viescas是一位有着超过45年从业经验的独立数据库顾问。他从一位系统分析师开始他的职业生涯,为IBM大型机系统设计大型数据库应用。他在达拉斯的应用数据研究中心工作了六年,在那里他带领30多名员工负责IBM大型计算机数据库产品的研究、开发以及客户支持工作。在应用数据研究工作期间,约翰完成了达拉斯德克萨斯大学的商业金融学位,并以优异的成绩毕业。 John 1988年加入Tandem 计算机公司,在那里他负责在Tandem公司美国西部销售区开发和实施数据库的营销方案。他开发并交付了用于技术研讨会的关系数据库管理系统—— NonStop SQL。约翰1989年写了他的第一本书,A Quick Reference Guide to SQL(Microsoft Press,1989),该书一本是对比了ANSI-86 SQL 标准、IBM的DB2、微软的SQL Server、甲骨文公司的Oracle、以及Tandem公司的NonStop SQL之间的语法相似性的研究类书。作者于1992年从Tandem公司公休时写了Running Microsoft Access第一版(Microsoft Press,1992年。他已经写了四个版本的Running Microsoft Access,以及Running系列的后续作品——三个版本的Microsoft Office Access Inside Out(Microsoft Press,2003、2007、2010)和Building Microsoft Access Applications(Microsoft Press,2005)。他也是畅销书籍SQL Queries for Mere Mortals(Addison Wesley,2014)第三版的作者。John目前保持着连续多年被微软授予微机数据库管理系统最有价值专家(MVP,Most Valuable Professional)的纪录(1993年至2015年)。John与他的妻子在法国巴黎定居了三十多年。 Douglas J. Steele从事包括大型机和个人机在内的计算机相关的工作超过45年(是的,他一开始是用穿孔卡的!)。在2012退休前,他在一家大型国际石油公司工作了31年多。尽管他职业生涯的高光时刻是通过发展SCCM任务序列将Windows 7推广到全球超过10万台电脑上,但是数据库和数据建模是他的主要工作方向。 Douglas超过17年被微软认证为最有价值专家(MVP,他撰写了大量关于Access数据库的文章,Douglas是Microsoft Access Solutions: Tips, Tricks, and Secrets from Microsoft Access MVPs(Wiley,2010)的合著者,也是很多书的技术编辑。 Douglas为滑铁卢大学系统设计工程硕士,专注于设计非传统电脑用户的用户界面研究。(当然,在七十年代末,很少有人是传统的电脑用户!)他的专业研究源于他的音乐背景(他拥有多伦多英国皇家音乐学院钢琴演奏准学士学位)。他还痴迷于啤酒并毕业于尼亚加拉学院酿酒及啤酒厂操作管理专业(滨湖尼亚加拉,安大略省)。 Douglas和他的妻子在加拿大安大略省圣凯瑟琳定居超过34年。读者可以通过邮箱:mvphelp@gmail.com联系Douglas。 Ben G. Clothier是芝加哥首屈一指的Access和SQL Server开发企业IT Impact公司的解决方案架构师。他曾在著名J Street Technology和Advisicon公司做过自由顾问,主要从事从小型个人解决方案到公司全业务应用程序Access项目的相关工作。值得注意的项目包括一家水泥公司的工作跟踪和库存管理系统、给保险商使用的医疗保险计划生成器以及国际航运公司的订单管理系统。Ben在UtterAccess是系统管理员,并且和Teresa Hennig、George Hepworth、Doug Yudovich合著了Professional Access? 2013 Programming(Wiley,2013);并与Tim Runcie和George Hepworth一起合著了Microsoft? Access in a SharePoint World(Advisicon,2011);Ben还是Microsoft? Access? 2010 Programmer’s Reference(Wiley,2010)一书的特约作者。他拥有微软SQL Server 2012解决方案认证和MySQL 5认证开发者等证书。从2009年开始Ben一直是微软的最有价值专家(MVP。
影印版,无译者
目錄:
Introduction 1
A Brief History of SQL 1
Database Systems We Considered 5
Sample Databases 6
Where to Find the Samples on GitHub 7
Summary of the Chapters 8
Chapter 1: Data Model Design 11
Item 1: Verify That All Tables Have a Primary Key 11
Item 2: Eliminate Redundant Storage of Data Items 15
Item 3: Get Rid of Repeating Groups 19
Item 4: Store Only One Property per Column 21
Item 5: Understand Why Storing Calculated Data Is Usually a Bad Idea 25
Item 6: Define Foreign Keys to Protect Referential Integrity 30
Item 7: Be Sure Your Table Relationships Make Sense 33
Item 8: When 3NF Is Not Enough, Normalize More 37
Item 9: Use Denormalization for Information Warehouses 43
Chapter 2: Programmability and Index Design 47
Item 10: Factor in Nulls When Creating Indexes 47
Item 11: Carefully Consider Creation of Indexes to Minimize Index and Data Scanning 52
Item 12: Use Indexes for More than Just Filtering 56
Item 13: Dont Go Overboard with Triggers 61
Item 14: Consider Using a Filtered Index to Include or
Exclude a Subset of Data 65
Item 15: Use Declarative Constraints Instead of Programming Checks 68
Item 16: Know Which SQL Dialect Your Product Uses and Write Accordingly 70
Item 17: Know When to Use Calculated Results in Indexes 74
Chapter 3: When You Cant Change the Design 79
Item 18: Use Views to Simplify What Cannot Be Changed 79
Item 19: Use ETL to Turn Nonrelational Data into Information 85
Item 20: Create Summary Tables and Maintain Them 90
Item 21: Use UNION Statements to Unpivot Non-normalized Data 94
Chapter 4: Filtering and Finding Data 101
Item 22: Understand Relational Algebra and How It Is Implemented in SQL 101
Item 23: Find Non-matches or Missing Records 108
Item 24: Know When to Use CASE to Solve a Problem 110
Item 25: Know Techniques to Solve Multiple-Criteria
Problems 115
Item 26: Divide Your Data If You Need a Perfect Match 120
Item 27: Know How to Correctly Filter a Range of Dates on a Column Containing Both Date and Time 124
Item 28: Write Sargable Queries to Ensure That the Engine Will Use Indexes 127
Item 29: Correctly Filter the Right Side of a Left Join 132
Chapter 5: Aggregation 135
Item 30: Understand How GROUP BY Works 135
Item 31: Keep the GROUP BY Clause Small 142
Item 32: Leverage GROUP BYHAVING to Solve Complex Problems 145
Item 33: Find Maximum or Minimum Values Without Using GROUP BY 150
Item 34: Avoid Getting an Erroneous COUNT When Using OUTER JOIN 156
Item 35: Include Zero-Value Rows When Testing for HAVING COUNTx < Some Number 159
Item 36: Use DISTINCT to Get Distinct Counts 163
Item 37: Know How to Use Window Functions 166
Item 38: Create Row Numbers and Rank a Row over
Other Rows 169
Item 39: Create a Moving Aggregate 172
Chapter 6: Subqueries 179
Item 40: Know Where You Can Use Subqueries 179
Item 41: Know the Difference between Correlated and Non-correlated Subqueries 184
Item 42: If Possible, Use Common Table Expressions Instead of Subqueries 190
Item 43: Create More Efficient Queries Using Joins Rather than Subqueries 197
Chapter 7: Getting and Analyzing Metadata 201
Item 44: Learn to Use Your Systems Query Analyzer 201
Item 45: Learn to Get Metadata about Your Database 212
Item 46: Understand How the Execution Plan Works 217
Chapter 8: Cartesian Products 227
Item 47: Produce Combinations of Rows between Two Tables and Flag Rows in the Second That Indirectly Relate to the First 227
Item 48: Understand How to Rank Rows by Equal
Quantiles 231
Item 49: Know How to Pair Rows in a Table with All Other Rows 235
Item 50: Understand How to List Categories and the Count of First, Second, or Third Preferences 240
Chapter 9: Tally Tables 247
Item 51: Use a Tally Table to Generate Null Rows Based on a Parameter 247
Item 52: Use a Tally Table and Window Functions for Sequencing 252
Item 53: Generate Multiple Rows Based on Range Values in a Tally Table 257
Item 54: Convert a Value in One Table Based on a Range of Values in a Tally Table 261
Item 55: Use a Date Table to Simplify Date Calculation 268
Item 56: Create an Appointment Calendar Table with All Dates Enumerated in a Range 275
Item 57: Pivot Data Using a Tally Table 278
Chapter 10: Modeling Hierarchical Data 285
Item 58: Use an Adjacency List Model as the Starting Point 286
Item 59: Use Nested Sets for Fast Querying Performance with Infrequent Updates 288
Item 60: Use a Materialized Path for Simple Setup and Limited Searching 291
Item 61: Use Ancestry Traversal Closure for Complex Searching 294
Appendix: Date and Time Types, Operations,
and Functions 299
IBM DB2 299
Microsoft Access 303
Microsoft SQL Server 305
MySQL 308
Oracle 313
PostgreSQL 315
Index 317
內容試閱:
本书赞誉
本书的写作团队实至名归,给我留下了深刻的印象,这么说并不足以表达我对本书的喜爱,应当说我被这本书震惊了。大多数关于SQL 的书只会告诉读者如何去写SQL,而本书则会告诉读者为什么这样写;大多数关于SQL 的书会将数据库设计与实现分开阐述,而本书则将数据库设计的考量贯穿于SQL 的各种使用场景;大多数关于SQL 的书只会在阅览完毕后放在书架上落灰,而本书将成为我的伴手读物。
Roger Carlson,微软Access MVP (19962015 年)
写基本的SQL 很简单,但是写功能完备且运行高效的SQL 就没那么容易了,尤其是对于那些有着复杂需求的关键业务系统。不过现在有了这本优秀的SQL 读物,无论读者正在使用哪种数据库管理系统,都可以快速上手编写高质量的SQL。
Craig S. Mullins,Mullins Consulting,Inc.,DB2 金牌顾问,IBM 数据分析师
这是一本关于SQL 的佳作。它采用深入浅出的叙述方式,使得新手也可以理解其内涵。同时,也包含了很多高级的SQL 窍门和技巧,能够让SQL 老手也受益匪浅。因此,这本书适合任何程度的读者,那些对数据库设计、管理以及SQL 编程方面有较高要求的读者都应该阅读这本书。
Graham Mandeno,数据库技术顾问,微软MVP (19962015 年)
对于关系型数据库和基于SQL 的数据库的设计者和开发者来说,这本书是绝佳的资源一部深入浅出的读物,书中有丰富的示例,完美地结合了设计理论与编程实现,这些例子涵盖了当今最常用的数据库实现,其中包括Oracle、DB2、SQL Server、MySQL、PostgreSQL 等。本书用成熟的技术引导读者深入学习SQL,比如在关于分层数据和统计表的讲解中,包含了其内部实现,以及在使用GROUP BY、EXISTS、IN、关联或非关联子查询、窗口函数、各种连接语句时的性能。此外,书中有不少独有的有趣示例,也使得这本书在SQL 类著作中格外闪耀。
Tim Quinlan,数据库架构师,Oracle 认证DBA
iv 本书赞誉
对于那些困在多种SQL 方言之中急需帮助的读者来说,这本书能够将你从一团乱麻中拉出来。本书从SQL 的各种方言中分离出公有的独立成分,能够让读者做到阅后即用。我从1992 年就开始使用各种SQL 实现,已经算是SQL 方言方面的老手了,但依旧能够从这本书中学到不少知识。
Tom Moreau 博士,SQL Server MVP(20012012 年)
这本书在描述SQL 的使用方面完美地做到了内容丰富、叙述简洁、易于理解 它通过展现如何使用SQL 解决现实世界中的需求问题来告诉读者构造SQL 查询的方法,并阐明了数据如何存储与数据如何查询之间的联系,解释了从数据库中准确且高效地取得结果集的全过程。
Kenneth D. Snell 博士,数据库技术顾问,前微软Access MVP
这本书填补了一个知识断档 新手DBA 如何成长为高级DBA 本书就像是成长过程的路线图、行动指南、罗塞塔石碑,帮助读者从基础SQL 应用者变为高阶使用者的教练。与其磕磕绊绊地重新发明轮子,或是迷迷糊糊地摸索数据库的正确使用方法,不如对自己好一点 把这本书带回家。你不仅能够了解到可能需要多年摸索才能见到的各种SQL 的实现技巧,还能深入理解数据库供应商各种实现的原因。在你学习SQL 的旅途中,这本书能够为你节省出很多时间和精力。
Dave Stokes,MySQL 社区管理员,就职于甲骨文公司
对于一个严肃的数据库开发人员,本书属于必读书目。它手把手地告诉读者,SQL 解决现实问题的强大能力。本书的作者们使用了浅显易懂的表达方式告诉读者每一种解决方案的利与弊。我们都知道,一个查询有很多种实现方式,而这本书将告诉读者为什么某一种实现比别的实现更高效。对于这本书,我最钟爱的部分莫过于每一章最后的总结,它会再次向读者强调要点与陷阱。我要向所有的数据库开发人员推荐这本书。
Leo(theDBguyTM),UtterAccess 社区主席,微软Access MVP
我认为这本书不仅适合开发人员,而且适合数据库管理员,它能够告诉读者,在实现一个特定需求时,如何通过多种方式编写高效的SQL 实现。我认为,这是一本数据库相关从业人员的必读书。推荐这本书的另一个理由,是它涵盖了几乎所有常见的RDBMS 应用场景,因此,对于那些需要将一种RDBMS 实现方言翻译为另一种方言的用户,本书就是你们要找的那本指南。我衷心祝贺本书的作者们,你们的作品无与伦比。
Vivek Sharma,甲骨文公司Oracle 核心技术与混合云解决方案部门特邀技术专家
感谢Suzanne,永远永远
John Viescas
感谢我美丽聪明的妻子Louise 在我写这本书期间对我的无限包容!
Doug Steele
感谢Suzanne 和Harold,没有你们的支持这本书是无法问世的!
Ben Clothier
序言
SQL 在成为国际标准数据库语言的30 余年里,已经在众多数据库产品中得以实现。现在SQL 无处不在,高性能事务处理系统、智能手机应用程序以及后端Web 接口程序中都在使用SQL 语言。甚至有一类NoSQL 数据库,其共同特点是(或曾经是)它们不使用SQL。随着NoSQL 数据库增加了SQL 语言接口,现在NoSQL 中No的意思是不仅仅是SQL(Not Only SQL)。
由于SQL 的普遍性,你很可能在很多产品和系统环境中都使用过SQL。有一个针对SQL 语言的诟病(也许是对的),虽然SQL 语言在不同的数据库产品中是类似的,但还是有细微的差别。这些差别源于对SQL 标准的不同理解、不同开发模式或者不同的底层架构。通过实例来对比不同产品SQL 方言中的细微差别,对于理解这些SQL 差异是非常有用的。本书为SQL 查询提供了一个罗塞塔石碑(解释古埃及象形文字的可靠线索),向我们展示了如何使用不同的SQL 方言编写SQL 查询并解释了SQL 方言中的差异。
我经常强调最好的学习方法是从错误中学习。也就是说,那些懂得从自己和别人的错误中学习的人,才能够获得更多。本书包含了一些不完整、不正确的SQL 查询实例,并向读者解释了这些SQL 不完整、不正确的原因,以此通过别人的错误进行学习。
SQL 是一种功能强大且复杂的数据库语言。作为美国和国际SQL 标准委员会的数据库顾问和参与者,我见过很多查询没有充分利用SQL 的能力。充分理解SQL 的语言能力以及复杂性的程序开发人员,不仅可以充分利用SQL 的功能构建性能良好的应用程序,还能高效地开发应用程序。本书提供了61 个具体实例来帮助大家学习。
Keith W. Hare
JCC 咨询有限公司高级顾问
美国INCITS dm32.2 SQL 标准委员会副主席
ISOIEC JTC1 SC32 WG3 国际SQL 标准委员会召集人
致谢
一位著名的政治家曾经说过:抚养一个孩子需要一个村庄。如果你曾经写过一本书,不管是技术方面的还是其他方面的,你会明白把你的孩子变成一本成功的书需要一个伟大的团队。
首先,非常感谢我们的策划编辑和项目经理Trina MacDonald。Trina 不仅缠着John 使其坚持将SQL Queries for Mere Mortals 一书打造成为Effectiue Software Development 系列丛书,还带领着团队度过了重重难关。John 组建了一支真正国际化的团队来完成这本书,感谢大家工作上的不辞辛劳,尤为感谢Tom Wickerath 在项目前后期给予的协助和技术审校。
Trina 向我们推荐了本书的内容指导Songlin Qiu,在他的帮助下我们了解了编写Effectiue Software Development 系列丛书的各个细节,非常感谢Songlin 给予我们的指导。Trina 精心挑选了庞大的技术编辑团队,他们辛苦地审核和调试了我们的数百个例子,并提供了很多有价值的反馈。感谢负责MySQL 的Morgan Tocker 和Dave Stokes;感谢负责PostgreSQL 的Richard Broersma Jr.;感谢负责IBM DB2 和Oracle 的Craig Mullins;感谢负责Oracle 的Vivek Sharma。
在写书的过程中,系列丛书编辑、畅销书Effective C, Third Edition 的作者ScottMeyers,也参与到我们的团队中,在如何把本书变成Effectiue Software Development 系列丛书方面给了我们很多宝贵的建议。希望本书可以成为Effectiue Software Development 系列丛书的典范。
Julie Nahil、Anna Popick 的制作团队和Barbara Wood 帮助我们使书符合出版的要求。我们不能没有你们!
最后,非常感谢我们的家庭忍受我们在漫长的夜晚写稿和调试例子。他们持久的耐心值得大书特书!
John Viescas
法国,巴黎
Douglas Steele
加拿大,安大略省,圣凯瑟琳
Ben Clothier
美国,得克萨斯州,康弗斯
关于作者
John L. Viescas 是一位有着超过45 年从业经验的独立数据库顾问。他的职业生涯从系统分析师开始,为IBM 大型机系统设计大型数据库应用。他在达拉斯的应用数据研究中心工作了6 年,在那里他带领30 多名员工负责IBM 大型计算机数据库产品的研究、开发以及客户支持工作。在应用