前言
本书第1版是在4年前出版的,至今仍在被众多的SQL爱好者追捧,甚至有人不辞辛劳地逐页扫描,上传至网络进行分享。本书第1版是基于SQL Server 2008编写的,时光荏苒,目前SQL Server 2014已经发布,窗口函数等新功能不断丰富和发展,先前需要编写很复杂的代码才能完成的工作,现在寥寥几行就能把问题解决。无论是从代码可读性还是执行效率方面看,SQL Server 2014都值得我们去深入学习。因此,我们在第1版的基础上,对书的内容重新进行了补充和完善。此外,这次我们还补充了一些像“三值逻辑”这样的基础知识,因为在实际工作中,我经常发现,由于存在NULL值比较问题,导致查询结果不正确,费尽千辛万苦地分析代码,最终却发现犯了低级错误。
当初之所以要写这本书,主要出于两方面的原因:一是伴随着各种数据库技术日新月异的发展,无论是哪种数据库产品,想用有限的篇幅去描述它的全貌,几乎都是不可能完成的任务,所以我就考虑能否抽取出各种数据库产品中一些大家共同关心的内容,进行深入细致的挖掘,而SQL无疑是这方面的首选;二是在与一些开发公司的合作中,发现公司间的SQL应用情况的差异也很大,一些公司出于产品的可移植性考虑,拒绝使用一些新的SQL技术,甚至尽量避免在服务器上部署存储过程。所以我希望在深入地讨论一些常用SQL技术的同时,也尽可能多介绍一些SQL的新技术,从而消除大家对新技术的恐惧感,对新技术的推广能够起到一定的作用。
本书特点
本书既覆盖了改善效率和性能的普通SQL技术,也深入探讨了SQL新技术,更包含一些实用的查询解决方案。希望本书能够成为引领读者进入SQL查询殿堂的捷径。
本书的内容是基于SQL Server数据库产品进行讨论的。不过,由于大家都在遵循ANSI-SQL标准,所以无论是哪种数据库产品的SQL,彼此之间的差别并不大。数据库开发人员在跨越不同的数据库产品时,一般不会遇到什么障碍。当然,本书不特定于某个SQL Server版本,在介绍一些新功能时,会介绍它是在哪个版本添加进来的。并且,本书在改写过程中,在添加新的查询解决方案的同时,保留了先前的解决方案,以便读者能够进行对比分析。
本书在介绍各种查询语法时,更注重对查询逻辑思维方式的引导和介绍,这样可以帮助读者在阅读之后举一反三,提升自己动手解决实际问题的能力。
本书适用读者
本书是按照由浅入深、循序渐进的方式对SQL进行介绍的,既包含了入门知识,也包含了深层次技术的讨论。即使是最基本的查询语句,我们也会尽力为读者提供解决深层次问题的能力。也就是说,同样一个问题,开发人员可以写几十甚至上百行的SQL语句来解决问题,也有可能仅通过一条SELECT语句就可以解决问题。对于SQL而言,虽然代码最简化并不一定是性能最优化,但至少是对思维能力的一种提升。
从这个角度而言,本书可以作为SQL入门书,也可以作为SQL程序员、DBA的参考书。
本书内容与结构
本书共19章,可大致分为基础篇、开发篇、性能调整篇和实战篇4部分。
基础篇包括第1章至第10章。其中,第1章是对查询工具、书写规范等基本内容的介绍,第2章至第5章是对数据库、表和索引的介绍,第5章至第10章则介绍了使用SELECT进行数据查询和使用INSERT、UPDATE、DELETE进行数据修改的各个方面。本次修订新增了SQL理论基础,新增函数介绍、架构概念、标识列和序列对象等一致性约束介绍,内存表、选择列表的同时操作概念,查询的逻辑处理步骤的修订,使用OFFSET-FETCH限制查询结果和限制查询修改,窗口分布函数和窗口偏移函数、MERGE与OUTPUT等,尤其是第9章的窗口计算部分,更是全部重新书写。
开发篇包括第11章至第15章。如果将SELECT、INSERT、UPDATE和DELETE作为基本查询语句,则IF...ELSE、WHILE和TRY...CATCH构造等则可以看作是SQL编程语句。在存储过程、触发器等对象中可以通过这些语句实现一些复杂的逻辑处理。如果你曾经是一位使用VB或VC的程序员,在学习C/S或B/S编程时,你应当掌握这种服务器端的编程工具,从而将业务逻辑计算合理地分布到服务器和客户端。本次修订对CLR存储过程、触发器、函数等以Visual Studio 2013为基础重新进行了编写。
性能调整篇包括第16章至第18章。第16章和第17章介绍的是事务处理机制和并发访问控制。其实,无论是微软还是Oracle、IBM,其数据库产品的核心功能都是一样的,即在保证数据完整性的前提下提供最大的并发支持。数据库系统是通过“锁机制”来实现的,数据库引擎都提供有多种粒度的锁定模式,从而允许用户可以根据需要将资源锁定在适当的级别,尽量减少锁定开销。第18章则讨论了查询优化器的工作原理,重用查询计划,可以减少额外的编译开销,提高服务器性能。
实战篇仅包含第19章的内容,提供了同一时间范围内并发数统计、时间段天数统计、数字范围统计、地域范围内最大数统计等较为常见问题的解决方案。本次修订在原解决方案的基础上新增了窗口函数的解决方案。
系统要求
本书实例中使用的操作系统是Windows 7,使用的数据库是SQL Server 2014开发者版本,开发工具是Visual Studio 2013。为使Visual Studio 2013能够支持SQL Server 2014的SQL开发,需要将其升级到最新版本。同时,由于SQL Server示例数据库在2014版本中表结构变动较大,因此对书中的代码重新进行了调整和测试,该示例数据库可从http://msftdbprodsamples.codeplex.com/releases/view/125550下载。
代码示例
本书中使用的所有代码,请从作者的博客(http://blog.csdn.net/zhanghongju)上获取。
致谢
在本书的完成过程中,得到了诸多SQL Server技术专家和爱好者的支持与帮助。他们无私和热情的参与,使本书的内容更加实用和更具指导性,在此一并表示感谢。他们是王向东、秦广、魏兰花、凌亚东、王亚羽、陈雨薇、王光辉、高存亭、桑晓红、王新河、张宪国、李联国、韩燕军。
由于时间仓促,加之作者水平有限,书中不足之处在所难免,敬请读者批评指正。
张洪举
2015年1月