
如何使用本书
请一定认真通读前言部分。它包含了一些必要的背景知识及其他信息,这为后续的内容做了适当的铺垫。“平台和版本”一节会告诉你本书涉及哪些关系数据库管理系统。尤其要看一下“本书中用到的表”一节,这样你会熟悉后续章节里反复出现的数据表样例。你也会在“本书使用的约定”一节中看到一些重要的代码和字体风格约定。上述内容都是前言的组成部分。
注意,这是一本SQL 实例集,它用一系列的代码实例来帮助你解决你可能会遇到的相似或者相同的问题。请不要试图通过本书学习SQL 语法和基本知识,至少它不适合那些对SQL 一无所知的读者。本书适合作为补充材料,而不能替代通常的SQL 教科书。除此之外,下述要点能帮你更好地利用本书。
•本书中用到了一些数据库厂商提供的函数。如果你不了解这些函数,不妨参考Jonathan Gennick的著作SQL Pocket Guide,该书详细解释了这些函数。
•如果你不曾使用过窗口函数,或者不熟悉GROUP BY查询,请先阅读附录A。该附录讲解了SQL 的分组概念和做法,它也展示了窗口函数的工作原理。窗口函数的引入是SQL 最为重要的进展之一。
•请尊重常识!务必了解,本书不可能涵盖你在工作中可能遇到的全部问题。你要做的是把本书提供的实例作为模板或者指南,灵活运用必要的技术来解决你遇到的问题。你可能会这样说:“太棒了!这个例子适用于这种特定的数据集,但我遇到的问题与此不同,以至于无法照搬。”在这种情况下,你应该试着找到两者之间的共性。把书中的查询语句拆解开来,先提取出最基本的形式,然后根据需要逐步增加难度。任何查询都从SELECT...FROM...这种基本形式起步。如果你在它的基础上逐步地添砖加瓦,每次增加一个新的查询项、函数或连接查询,你就不仅能充分理解每个动作会如何影响最终的结果集,也能了解书中的实例与你的实际需求之间有何种差异。最后,你就能修改这些实例,使其适用于你自己的数据集。
•测试、测试,再测试。本书中反复出现的EMP表只有14行,毫无疑问,你在工作中遇到的任何一张表都可能比它大。因此,我建议用你自己的数据来测试书中的查询,至少要保证它们工作正常。我没有办法了解你的表长什么样,有哪些索引,和其他表存在何种关联。因此,除非你全面地理解了书中的查询技巧以及把它们应用到你的数据里会有什么样的结果,否则请不要盲目地将它们应用于生产环境的代码。
•大胆尝试,勇于创新。我鼓励你大胆尝试本书未曾提及的那些技巧和做法。虽然我在书中刻意使用了不同数据库的许多函数,但通常而言,还有别的函数也同样适用于解决某个问题。因此,请大胆改写书中提供的代码,演化出你自己的版本。
•新东西不一定更好。如果你的代码里没有用到新近引入的SQL 语言特性,并不意味着引入之后它会变得更有效率。在很多情况下,传统的做法可能和新方案一样好,甚至更好。请记住这一点,尤其是在阅读附录B 的时候。读过本书以后,请不要认为你必须更新或者修改所有的旧代码。你只需要认识到,SQL 相比20年前添加了许多新的、非常好的功能,而它们值得你花时间去学习。
•不要害怕复杂的查询。如果你发现某个查询看起来太复杂,以至于暂时无法理解,不要害怕。当讲解一个问题时,我已经不遗余力地分解每一个查询,从最简单的形式开始逐级变化,直至呈现出完整的解法,我甚至列出了每个中间步骤的执行结果。你可能没办法立刻纵观全局,但只要跟着我的思路走下去,不仅能够理解查询语句是如何被构造出来的,也能看到中间的每一步会得到什么样的结果。最终,你会发现那些复杂的查询并不难理解。
•在必要的时候进行防御式编程。为了让本书中出现的查询尽量简洁易懂,我去除了代码里的许多防御性措施。以一个计算员工薪酬总和的查询为例。一种可能出现的情况是,表示薪酬的字段被定义成了VARCHAR类型,以至于存入数据库的可能是混合了数字和字符串的数据。我在书中给出的代码并没有提防这种情况(因此,SUM函数因无法处理字符数据而导致执行失败)。如果你遇到了这样的数据(更准确地说是“这样的问题”),就需要通过额外的代码做一些防范处理,或者把不规范的数据整理好,因为本书中给出的查询并没有考虑这种数字和字符混合出现的情况。我的观点是,略去这类琐碎的细节有助于你聚焦正题,专注理解查询技术。
•反复练习最重要。掌握查询的最佳办法是亲自动手编程。阅读代码自然大有裨益,但动手练习是更好的做法。你当然要先读懂那些查询并了解其工作原理,但最终只有通过动手实践才能自己写出查询。
注意,本书中的很多例子都是人为设计的。然而,问题本身都来自真实世界,并非人为臆造。我只不过围绕着一小组包含了雇员数据这样的表来构造实例。我尽力帮你先熟悉示例数据,这样你就能把注意力放在每一个实例背后的技术细节上。面对某个具体问题时,你可能会说:“我不需要针对雇员数据做这些查询。”这时请忽略示例数据,聚焦于我为你演示的那些技术。技术是通用的。我和我的同事天天都在用同样的技术解决不同的问题。我们相信你也是这样。