本书好评
除非你在非常高的级别工作,否则这是你需要的独一无二的一本SQL图书。作者不但揭开了复杂查询的神秘面纱,还介绍了能够使“初学者”成为“超人”的原理和技术。请不要错过本书!
——Graham Mandeno, 数据库顾问
本书针对编写SQL查询为初学者提供了一个按部就班、易于阅读的指导。它包含了上百个带有详细说明的例子。本书为我们提供了理解、修改和创建SQL查询所需的工具。
—Keith W. Hare ,国际SQL标准委员会ISO/IEC JTC1 SC32 WG3负责人
John Viescas和Mike Hernandez采用日常的英语查询并且直接将其翻译为SQL。对于所有数据库设计者来说本书是一本重要的书。它吸取了复杂的数学集合论和一阶谓词逻辑(这些理论在E. F. Codd的最初关于关系数据库设计的论文中有所概述),并且使得这些理论容易让每个人理解。如果你想要学习从初级到中级的SQL课程,本书是你所必需的,不管你已经买了多少本其他的书。
—Arvin Meyer、MCP、MVP
仅仅一个“小心这一陷阱”的提示项,就能够帮助你在编写自己的查询时避免某些问题,节省的成本远超本书的价格,如果你想要挖掘你数据库方面的全部潜能,我强烈推荐本书。
—Kenneth D. Snell博士,数据库设计师/程序员
John和Mike完成了不可思议的工作,使得通常枯燥而困难的主题变得鲜活起来。本书将会是所有正规开发者书架上特色鲜明的一本,只不过我确信它没有时间静静呆在书架上,因为本书太有用了。
—Doug Steele,Microsoft Access开发者与作家
在过去的几十年里,SQL已经从一种只有计算机专家才知道的语言演变为计算机业界广泛使用的国际标准。现在,每年使用SQL开发的新应用程序数以百万计。如果想要从Internet或者内部网络访问公司信息,可能要使用SQL。本书帮助新用户学习SQL查询的基础知识,同时对于中级用户和高级用户来说,也是必备的参考书。
包含用于本书中示例查询的5个示例数据库的4种格式:Microsoft SQL Server 2000及以后版本、Microsoft Access 2000及以后版本、MySQL 5.0及以后版本,以及可以用于大多数其他语言实现的SQL脚本。
无
“就其本性而言,语言是具有群体性的,也就是说,它表达的不是特定的而是共同的事物,即对你、我和每个人都同样的事物。”
——Thomas Earnest Hulme, 《沉思录》(Speculations)
学习如何获取和操作数据库中的信息通常是一个复杂的过程。然而,只要理解了所要询问的问题或者想要对数据库做出的改变,那么,它也可能是一个相对容易的任务。在理解了问题之后,可以把它翻译成任何数据库系统所使用的语言,在多数情况下,就是结构化查询语言(Structured Query Language,SQL)。我们必须把请求翻译成一条SQL语句,以便数据库系统知道我们想要获取或改变什么信息。SQL为我们提供了和数据库系统交流的工具。
在担任数据库顾问的许多年里,我们发现,仅仅要从数据库获取信息或者在数据库中执行简单的数据修改的人数,要远远超过那些负责为一个数据库创建程序或应用程序的人数。不幸的是,没有一本书仅仅专注于这一主题,尤其是从一个“初学者”的角度。坦率地说,有很多关于SQL的好书,但是,大多数都是以数据库编程和开发为目标的。
有了这种想法,我们决定是时候编写一本书来帮助人们学习如何正确而有效地查询数据库了。我们在2000年出版了本书的第1版。在本书中,我们还希望介绍使用SQL修改数据库中数据的基本方法。
我们的决定结果已经在你的手中了。本书在SQL图书中是独一无二的,因为它关注SQL,而几乎与任何一种特定的数据库系统实现无关。本书第2版包含了数百个新的示例,并且包含了各个版本的示例数据库,包括使用最流行的开源MySQL数据库系统的数据库。当你阅读完本书时,将具备获取或修改任何信息所需的技能。
致谢
编写这样的一本书是合作的结果。总是有编辑、同事、朋友以及亲戚,在我们最需要的时候给予支持并且提供有价值的建议。这些人不断给我们鼓励,帮助我们集中注意力,并且激励我们完成这个项目。
首先,也是最重要的,我们要感谢本书的策划编辑Elizabeth Peterson,他激励着我们编写了这个第2版。我们还要感谢Weinberge带领我们一路前行。并且,我们无法忘记最终的策划编辑Chuck Toporek以及Romny French和产品团队,他们是一个伟大的团队。特别感谢Chrysta Meadowbrooke,她完成了令人惊讶的最终手稿录入工作。她解决了很多不一致的地方,并且指出了一些需要修改的SQL例子。最后,感谢总编辑Karen Gettman,他领导着这个团队并且仔细地关注着整个过程。
接下来,我们要感谢我们的技术编辑,特别是Stephen Forte和Keith Hare。Keith特别花时间运行了所有的例子,指出了几个错误,并且提出了改进的建议。再次感谢他贡献的所有时间和录入,并且帮助我们使本书成为关于SQL查询的严谨著述。
最后,再次非常特别地感谢Keith Hare为我们作序。作为国际SQL标准委员会的负责人,Keith是一位非常优秀的SQL专家。我们对在这一主题上有丰富的学识和经验的Keith充满尊敬,并且,我们很乐意接受他对我们的处女作的看法和评论。
本书好评 除非你在非常高的级别工作,否则这是你需要的独一无二的一本SQL图书。作者不但揭开了复杂查询的神秘面纱,还介绍了能够使“初学者”成为“超人”的原理和技术。请不要错过本书! ——Graham Mandeno, 数据库顾问 本书针对编写SQL查询为初学者提供了一个按部就班、易于阅读的指导。它包含了上百个带有详细说明的例子。本书为我们提供了理解、修改和创建SQL查询所需的工具。 —Keith W. Hare ,国际SQL标准委员会ISO/IEC JTC1 SC32 WG3负责人 John Viescas和Mike Hernandez采用日常的英语查询并且直接将其翻译为SQL。对于所有数据库设计者来说本书是一本重要的书。它吸取了复杂的数学集合论和一阶谓词逻辑(这些理论在E. F. Codd的最初关于关系数据库设计的论文中有所概述),并且使得这些理论容易让每个人理解。如果你想要学习从初级到中级的SQL课程,本书是你所必需的,不管你已经买了多少本其他的书。 —Arvin Meyer、MCP、MVP 仅仅一个“小心这一陷阱”的提示项,就能够帮助你在编写自己的查询时避免某些问题,节省的成本远超本书的价格,如果你想要挖掘你数据库方面的全部潜能,我强烈推荐本书。 —Kenneth D. Snell博士,数据库设计师/程序员 John和Mike完成了不可思议的工作,使得通常枯燥而困难的主题变得鲜活起来。本书将会是所有正规开发者书架上特色鲜明的一本,只不过我确信它没有时间静静呆在书架上,因为本书太有用了。 —Doug Steele,Microsoft Access开发者与作家 在过去的几十年里,SQL已经从一种只有计算机专家才知道的语言演变为计算机业界广泛使用的国际标准。现在,每年使用SQL开发的新应用程序数以百万计。如果想要从Internet或者内部网络访问公司信息,可能要使用SQL。本书帮助新用户学习SQL查询的基础知识,同时对于中级用户和高级用户来说,也是必备的参考书。 包含用于本书中示例查询的5个示例数据库的4种格式:Microsoft SQL Server 2000及以后版本、Microsoft Access 2000及以后版本、MySQL 5.0及以后版本,以及可以用于大多数其他语言实现的SQL脚本。
自从数据库语言SQL作为国际标准采用后的20年来,以及SQL数据库产品开始出现在市场后的25年来,SQL已经成为用来排序、修改、获取和删除数据的主要语言。今天,世界上数据的重要部分以及世界的经济,都是用SQL数据库来记录的。
SQL随处可见,因为它是操作数据的一种非常重要的工具,它是高性能的事务处理系统,它位于Web界面的后面。我曾经在网络监视器工具和垃圾邮件防火墙中见到SQL。今天,SQL可以直接执行,嵌套到编程语言中,以及通过调用接口来访问。它隐藏在GUI开发工具、代码生成器以及报表编制器中。不管是可见的还是隐藏的,底层的查询都是SQL。因此,要理解已有的应用程序并且创建一个新的应用程序,需要掌握SQL。
本书针对编写SQL查询提供了一个按部就班的、易于阅读的指导。它包含了上百个带有详细说明的例子。本书提供了我们理解、修改和创建SQL查询所需要的工具。
作为美国和国际SQL标准委员会的一名数据库顾问和成员,我花了大量的时间研究SQL。因此,我有一定的资格说:“本书的作者不仅理解SQL,而且知道如何讲解SQL”。他们在这两方面的能力使得本书成为宝贵的资源。
Keith W. Hare
JCC顾问公司高级顾问
美国SQL标准委员会INCITS H2副主席
国际SQL标准委员会ISO/IEC JTC1 SC32 WG3负责人
John L. Viescas;Michael J. Hernandez:John L. Viescas: Viescas顾问公司(一家令人尊敬的数据库咨询服务提供商)总裁,畅销书《Microsoft Office Access 2003 Inside Out》和《Microsoft Office Access 2007 Inside Out》的作者。
Michael J. Hernandez: Microsoft Visual Studio Tools for Office (VSTO)的产品经理,负责协助和指导产品的未来战略以及通过各种各样的会议向客户和开发者推销VSTO。
刘红伟:暂无简介
本书讨论的主题是SQL查询,而目标读者则是初学者。而这些,也恰恰是本书最大的两个特色。
但凡市面上涉及数据库技术的图书,必然少不了介绍SQL(Structured Query Language,结构化查询语言)的部分,甚至有不少图书是专门介绍SQL的,因为SQL是和大多数数据库系统交流的标准语言。市面上不乏SQL的大全图书,对于SQL的起源、应用和其他方面一一道来。而本书在SQL图书中是独一无二的,因为它关注SQL,而几乎与任何一种特定的数据库系统实现无关;它关注SQL查询和数据操作,对于数据库设计、数据库对象创建、存储过程等则并未提及。作者缘何如此设计?这要从本书的第二个特色说起。
什么样的人才是初学者呢?作者在前言中给出了明确的界定。两位作者都多年从事SQL方面的研究和咨询工作,他们比谁都清楚,绝大多数“初学者”使用最多的SQL功能就是数据查询。因此,本书大部分的篇幅都是针对如何用好SQL查询功能的。当然,本书也不是死板地局限于此。第五部分“修改数据集”是新加入的部分,分为3章来介绍UPDATE、INSERT和DELETE语句及其用法。当然,这也是出于读者需求的考虑。而第2章,则是一贯地介绍数据库设计合理化的一些原则。这并不是和SQL查询风马牛不相及,相反,良好的数据库设计,会在进行查询时减少很多不必要的麻烦。
除了上述的两大特点,本书还有其他一些闪亮的特色,包括:丰富的示例和详细的示例说明、独特的“请求/翻译/整理/SQL”技术、SQL语法图表、随书CD上多种格式的示例数据库、每章末尾的练习题等。这些特点也都是为了服务前面所提到的两大特点而精心安排的。作者在引言中对这些特点给出了详细的说明和介绍。
我们非常高兴能够把这样一本讲述SQL查询的好书翻译并介绍给广大读者。参加本书翻译工作的有刘红伟、景龙、景文正、孙海军、李振胜、李秋强、楚亚军、景文生、王志刚、安宁宁、党耀云、谯谊、武文超、庞晋才、刘永昌和孙连升。在阅读本书的过程中,读者如果有任何评论和建议,可以通过liuhongwei198004@sinacom和译者交流。
译者序
序言
前言
引言
第一部分关系数据库和SQL
第1章什么是关系1
11数据库的类型1
12关系模型简史1
121源起2
122关系数据库软件2
13剖析关系数据库3
131表3
132字段4
133记录4
134键4
135视图5
136关系6
14我们将学到什么9
15从这里走向何处10
16小结11
第2章确保数据库结构的健全12
21为什么会有本章12
22为什么要关心全面的结构12
23字段调优13
231名字中包含什么(第一部分)13
232消除毛边14
233解析多部分字段16
234解析多值字段17
24调优表19
241名字中包含什么(第二部分)19
242确保合理的结构20
243解析非必要的重复字段21
244键的标识24
25建立牢固的关系27
251建立一个删除规则28
252设置参与类型29
253设置参与程度31
26就这些吗32
27小结32
第3章SQL简史34
31SQL的起源34
32早期厂商实现35
33随后有了标准36
34ANSI/ISO标准的演化37
35其他SQL标准38
36商业实现40
37未来会怎样41
38为什么应该学习SQL41
39小结41
第二部分SQL基础
第4章创建简单查询43
41SELECT简介43
42SELECT语句44
43一点题外话:数据与信息45
44把请求翻译为SQL46
441扩展可见的字段49
442使用快捷方式请求所有的列51
45删除重复的行52
46排序信息53
461要事第一:排序序列54
462现在来排序55
47保存你的工作57
48示例语句58
49小结63
410练习题63
第5章获取列以外的信息66
51什么是表达式66
52要表示何种类型的数据67
53改变数据类型:CAST函数68
54指定显式的值70
541字符串直接量70
542数值直接量71
543日期时间直接量72
55表达式类型74
551连接74
552数学表达式76
553日期和时间算术78
56在一条SELECT子句中使用表达式81
561使用连接表达式81
562命名表达式82
563使用一个数学表达式83
564使用日期表达式84
565短暂离题:值表达式85
57“没有内容”的值:Null87
571Null简介87
572Null的问题88
58示例语句89
59小结93
510练习题94
第6章过滤数据96
61使用WHERE来精炼你所看到的
东西96
611WHERE子句97
612使用WHERE子句98
62定义查找条件99
621比较99
622范围104
623集合成员107
624模式匹配108
625Null111
626排除带有NOT的行113
63使用多个条件115
631AND和OR简介115
632排除行:老话重提120
633优先级顺序122
634检查重叠的范围124
64回顾Null:一个警告提示126
65以不同的方式表达条件129
66示例语句130
67小结134
68练习题135
第三部分多表操作
第7章用集合思考139
71什么是集合139
72集合上的操作140
73交集140
731集合论中的交集141
732结果集之间的交集142
733可以用交集解决的问题144
74差集145
741集合论中的差集145
742结果集之间的差集146
743使用差集解决的问题149
75并集150
751集合论中的并集150
752使用并集来组合结果集151
753使用并集解决的问题153
76SQL集合操作153
761经典集合操作与SQL154
762找出共同值:INTERSECT154
763找出遗漏的值:EXCEPT
(DIFFERENCE)156
764组合集合:UNION158
77小结160
第8章INNER JOIN162
81什么是JOIN163
82INNERJOIN163
821什么是“合法的”JOIN163
822列引用163
823语法164
824检查那些关系175
83INNER JOIN的用法176
831查找相关的行176
ⅩⅤⅡ832查找匹配的值177
84示例语句177
841两个表178
842两个以上的表181
843查找匹配值186
85小结194
86练习题195
第9章OUTER JOIN198
91什么是OUTER JOIN198
92LEFT OUTER JOIN和RIGHT
OUTER JOIN199
93FULL OUTER JOIN214
931语法214
932在非键值上的FULL
OUTER JOIN217
933UNION JOIN218
94OUTER JOIN的用法218
941找出遗漏的值218
942找出部分匹配的信息219
95示例语句219
96小结231
97练习题231
第10章UNION234
101什么是UNION234
102编写带有UNION的请求235
1021使用简单的SELECT语句236
1022组合复杂的SELECT语句238
1023多次使用UNION241
1024排序一个UNION242
103UNION的用法244
104示例语句245
105小结253
106练习题254
第11章子查询256
111什么是子查询256
1111行子查询256
1112表子查询257
1113标量子查询257
112用作列表达式的子查询258
1121语法258
1122初探聚合函数:COUNT和
MAX260
113作为过滤器的子查询262
1131语法262
1132用于子查询的特定谓词关键字…264
114子查询的用法275
1141构建子查询作为列表达式275
1142用作过滤器的子查询275
115示例语句277
1151表达式中的子查询277
1152过滤器中的子查询281
116小结287
117练习题287
第四部分汇总和分组数据
第12章简单汇总291
121聚合函数291
1211用COUNT统计行和值293
1212用SUM求和295
1213使用AVG计算平均值296
1214使用MAX求最大值298
1215使用MIN求最小值299
1216使用多个函数300
122在过滤器中使用聚合函数301
123示例语句303
124小结308
125练习题308
第13章分组数据310
131为什么分组数据310
132GROUP BY子句311
1321语法312
1322混合列和表达式316
1323在WHERE子句中的子查询中
使用GROUP BY317
1324模拟一条SELECT DISTINCT
语句319
133一些适用的限制320
1331列限制320
ⅩⅤⅢ1332根据表达式分组321
134GROUP BY的用法323
135示例语句324
136小结332
137练习题332
第14章过滤分组的数据335
141“聚焦分组”的一种新含意335
142过滤器何时起作用339
1421应该把过滤器放在WHERE中
还是HAVING中339
1422避免HAVING COUNT陷阱341
143HAVING的用法344
144示例语句345
145小结352
146练习题352
第五部分修改数据集
第15章更新数据集合355
151什么是UPDATE355
152UPDATE语句355
1521使用一个简单的UPDATE
表达式356
1522短暂离题:事务359
1523更新多列359
1524使用子查询来过滤行360
1525使用一个子查询UPDATE
表达式365
153UPDATE的用法367154示例语句368
155小结379
156练习题379
第16章插入数据集382
161什么是INSERT382
162INSERT语句383
1621插入值383
1622产生下一个主键值386
1623使用SELECT插入数据387
163INSERT的用法392
164示例语句394
165小结401
166练习题401
第17章删除数据集404
171什么是DELETE404
172DELETE语句404
1721删除所有的行405
1722删除某些行406
173DELETE的用法410
174示例语句411
175小结416
176练习题416
结束语419
附录ASQL标准图
附录B示例数据库结构
附录C日期和时间函数
附录D推荐读物
附录部分在本书随书光盘中。