无
SQL是最重要的计算机语言之一。它是一种数据库语言。当我们在一个大型的信息库中查找需要的信息时,执行查找的代码很可能正在使用SQL。分享信息以便与其他人协作的很多应用程序也要使用SQL。
SQL已在世界上100多种软件产品中使用,并且新的软件产品还在随时增加。本书介绍如何最大程度地利用好数据库,如何使用SQL来解决实际问题。本书用到最广为应用的SQL产品,即Oracle和Microsoft Access,这两种产品广为使用、容易获取,并且可以在个人计算机上运行。通过详细学习这两种产品,你将具备使用基于SQL的任何产品所需的所有基本技能。
本书的组织方式
本书用一种非正式对话的方式带领读者学习SQL的主题。本书并列地展示了用Oracle和Access完成同一任务,以便读者可以看到两者的相似性和不同之处。大多数主题都通过SQL代码的一个示例来说明。在这些示例中,我们有意让表很小,从而更容易地检查和理解示例。
每个SQL代码示例都首先设定一个任务。然后,给出执行这个任务的SQL代码。我尽可能地编写在Oracle和Access上都能工作的SQL代码,然而,有时候我不可能这么做,因此我会针对Oracle编写SQL代码的一个版本,而针对Access编写另一个不同的版本。
为了让本书易于阅读,每个SQL示例都给出了初始的数据表和最终的数据表。这使得我们能够检查自己是否理解SQL代码做了些什么。我让示例尽可能地小,以便检查。
每个示例的后面常常给出一个提示,说明有关SQL代码或数据表的任何较难理解的地方。
最后,我们给出一个问题供读者解决,以便检查自己对于这一主题的理解。你可以自己决定是否去做这些练习。通常,这些问题都较容易解决,只需要对示例中的SQL代码略做修改。如果决定要做一个练习,本书的Web站点可以帮助你判断自己的解答是否正确。
本书中的每段SQL代码示例都设计为互不依赖而彼此独立,不需要之前的章节所做的任何修改。这就使得读者可以跳过本书中的某些内容,按照任意顺序来阅读章节。有些人可能想要从头到尾地阅读本书,但是,不一定非这样不可。
一定要阅读附录,学习如何运行Oracle和Access的实用技巧。所有示例的数据库文件和代码都可以从本书的Web站点获取。在本书中的几个地方,我表达了自己对于计算机技术的观点,而这是很多其他的技术图书避免去做的事情。这些观点是我的个人观点,我完全对它们负责。我也保留改变自己的观点的权利。如果我这么做了,我会在本书的Web站点上放上我的新观点,以及促使我改变自己想法的原因。
本书Web站点
本书的Web站点是一个名为“sqlfun”的 Google group,其Web地址是http://groupsgooglecom/
group/sqlfun。
也可以通过Email:sqlfun@gmailcom联络我。
这个Web站点包括如下内容:
■ 创建本书中用到的表的所有Oracle SQL代码。
■ 带有本书中用到的所有数据表的Access数据库。有针对数个版本的Access的数据库可供使用。
■ 检查读者对本书中的问题的解答方式。
■ 勘误表(如果书中有错的话)。
■ 开放的讨论区,可以在此发表评论、提出希望我解答的问题。
欢迎访问本书的Web站点。
致谢
很多人对本书贡献良多。我想要借此感谢他们在我编写本书期间给予的所有支持。这些想法和反馈帮助我提高了本书内容的质量,改进了我表述这些内容的方式。特别地,我要感谢以下同仁对于本书第3版的建议和帮助:
■ Dejang Liu
■ Alma Lynn Bane
对本书以前版本提供帮助的人包括:
■ Anila Manning对于本书第2版的编写提供了很多帮助。
■ Paul Reavis,他与我一起在加州大学伯克利继续教育学校教授这门课程。
■ Todd Matson审阅了Access相关的内容。
■ Faysal Shaarani 和 Bill Allaway审阅了Oracle相关的内容。
■ Spencer Brucker 和加州大学伯克利继续教育学校都支持我教授SQL基础课程并准备书中的素材。
■ Prentice Hall的所有同仁,尤其是编辑Bernard Goodwin;Moore Media公司的制作编辑Vanessa Moore;本书最初的编辑Michael Meehan和Jeffery Pepper;以及我没有直接共事的很多其他人。
■ 尤其感谢我的母亲Jean Praninskas;还有我的儿子Richard Watts,他也审阅了本书。
还要感谢Brian Akitore、Mehran Ansari、Asa Ashraf、Anne Bester、Sandra Bush、Connie Chong、Patricia Cleveland、Robert D’Antony、Gan Davnarrain、Bruce Douglass、James Drummond、Ron Duckworth、Dean Evans、Steve Fajardo、Earl Gardner、Wolday Gebremichael、Neelam Hasni、Reda Ismail、Marques Junior、John Karsnak、Allyson Kinney、Gladys Lattier、Brian Lester、Mahen Luximan、Alex McDougall、E.Muljadi、Satyendra Narayan、Bade Oyebamiji、Stefan Pantazi、Todd Perchert、Oxana Rakova、Jacob Relles、Ricardo Ribeiro、Cindy Roberts、John Rusk、Ty Seward、Gary Shapiro、David Smith、Kenneth Smtih、Joan Spasyk、Patricia Warfel和William White
John J. Patrick:暂无简介
刘红伟:暂无简介
SQL表示Structured Query Language,即结构化查询语言,它已经成为数据库应用的标准语言,因此,也是最重要的计算机语言之一。 对于计算机专业人士来说,SQL是必须掌握的语言之一,而对于想要高效率地使用商业数据库的一般读者来讲,掌握SQL可以在应用数据库的时候达到事半功倍的效果。
本书根据John Patrick在美国加州大学伯克利分校讲授的SQL课程编写,详细介绍与SQL相关的概念和技术。读者不需要任何数据库语言的应用经验,就可以通过本书详细的介绍和丰富的实例,熟练地掌握和使用SQL。
和其他的SQL相关图书相比,本书具有以下特色:
■ 不仅介绍基本概念,而且对每个概念都用了一个SQL范例进行说明。在大多数情况下都设置了一个任务,然后给出了完成这项任务的SQL代码。
■ 展示了数据的原表和结果表。这样,读者可以清晰地看到每一个SQL范例执行前后的变化,了解SQL语句的具体功能。
■ 提供Oracle SQL和Access SQL两个版本的代码。Oracle和Access分别是应用最广泛的企业级数据库和个人业务数据库。它们很好地覆盖了读者和用户的需求。
■ 每个小节的最后提出“检查理解”的练习,供读者实践本节学习到的知识,巩固对相关知识点的掌握。
■ 配套网站(http://groupsgooglecom/group/sqlfun)有丰富的辅助学习资源,包括创建数据库的代码(针对Oracle和Access的多个版本)、各章的范例代码、“检查理解”的解决方案、开放的学习讨论论坛。
我们很高兴能够翻译这样一本SQL入门好书,希望读者能够愉快地阅读本书和学习SQL。参加本书翻译工作的有刘红伟、景龙、景文正、孙海军、李振胜、李秋强、楚亚军、景文生、王志刚、安宁宁、党耀云、谯谊、武文超、庞晋才、刘永昌和孙连升。在阅读本书的过程中,如果有任何评论和建议,读者可以通过liuhongwei198004@sinacom和译者交流。译者
2009年2月
译者序
前言
第1章在表中存储信息
简介
11什么是SQL
12什么是关系数据库?为什么要
使用它
13为什么学习SQL
14本书内容简介
表的组成部分
15数据存储于表中
16一行表示一个对象及其相关信息
17一列表示一类信息
18单元格是表的最小部分
19每个单元格应该只表示一样东西
110使用主键列标识每一个行
111大部分表都很“瘦长”
表的示例
112Oracle和Access中表的示例
113l_employees表的一些设计决策
114Lunches数据库
小结
第2章从表中获取信息
select语句
21目标:从表中获取几个列和行
22select语句概述
select子句
23select子句概述
24使用select子句获取若干列
25使用select子句获取所有的列
26使用select语句获取某个列中的
不同值
27使用select子句获得几个列中的
不同值
where子句
28where子句概览
29在where子句中使用等于条件
210在where子句中使用小于条件
211在where子句中使用不等于条件
212在where子句中使用in条件
213在where子句中使用between
条件
214在where子句中使用like条件
215在where子句中使用is null条件
order by子句
216orderby子句概述
217通过一列升序排列行
218通过若干列升序排列行
219根据若干列以各种顺序排序各行
220整个过程
小结
第3章where子句中的复合条件
where子句中的复合条件
31在where子句中使用复合条件
32将not与in、between、like和is
null条件一起使用
33where子句中复杂条件的标准形式
34一个常见错误
常数值
35在select子句中使用常数值
36使用常数表
标点符号问题
37现在需要知道的标点符号
38标点符号参考
区分大小写
39Oracle中的区分大小写
310关于SQL中区分大小写的争论
311有一个选择
312在Oracle SQL Command Line
环境中关闭区分大小写
313Access中区分大小写
三值逻辑
314使用三值逻辑的SQL
错误消息
315错误消息常常是错的
练习
316练习1
317练习2
318练习3
小结
第4章保存结果
在新表或者视图中保存结果
41从select语句的结果中创建
一个新表
42从select语句的结果创建
一个新的视图
43表和视图的相似之处
44表和视图的不同之处
45删除表
46删除视图
47一个视图可以建立在另一个
视图之上
48预防性删除
修改表中的数据
49添加新行到表中
410添加若干新行到一个表中
411更改已经存在于表的行中的数据
412从表中删除行
使用GUI修改表中的数据
413使用Oracle GUI来修改表中的
数据
414使用Access GUI来修改表中的
数据
修改表中数据的限制
415使用insert、update和delete的
约束条件
416安全限制
小结
第5章数据字典和其他Oracle主题
提交、回滚和事务
51commit和rollback命令
52Autocommit选项
53事务
通过视图修改数据
54通过视图更改数据
55通过视图更改数据的例子
56使用With Check Option的视图
Oracle中的SQL Commands页面
57SQL Commands页面概览
58Autocommit选项
59Explain选项
使用Oracle数据字典:第一部分
510数据字典概述
511如何查找所有表的名字
512如何查找所有视图的名字
513如何查找定义视图的select语句
514如何查找表或者视图中的列名
515如何查找表的主键
小结
第6章创建自己的表
创建表
61create table命令
62Oracle和Access中的数据类型
63文本数据类型
64数字数据类型
65日期/时间数据类型
66其他数据类型
67将数据放入新表中
68在Oracle中创建l_employees表
更改表
69为表添加主键
610更改表的主键
611向表中添加一个新列
612扩展列的长度
613从表中删除一个列
614对表进行其他更改
带有重复行的表
615重复行的问题
616如何删除重复行
617如何区别重复行
小结
第7章格式、序列和索引
格式
71日期格式
72显示已经格式化的日期
73输入已格式化的日期
74Oracle中的其他格式
75Access中的格式
序列
76在Oracle中创建序列
77在Oracle中使用序列
78在Access中使用序列
索引
79创建索引
710优化器
711索引如何工作的示例
在数据字典中查找更多的信息:第二部分
712如何查找有关列的数据类型的
信息
713如何查找有关序列的信息
714如何找到有关索引的信息
715如何找到所有数据库对象的
相关信息
716如何使用Oracle中的数据
字典表
717如何使用数据字典列的索引
练习
718创建一个想要庆祝的
节日的表
小结
第8章数据完整性
表上的约束条件
81约束条件使数据保持一致
82check约束条件
83unique约束条件
84not null约束条件
85primary key约束条件
86对字段数据类型和长度的限制
参照完整性
87参照完整性的概念
88参照完整性的示例
89对RI保护的数据表使用insert
和update
810通过RI允许对数据表使用insert
和update
811RI防止对查找表使用update
和delete
812如何从查找表中删除编码
813如何在查找表中更改编码
814RI作为表之间的关系
815在Access GUI中建立RI
RI的delete选项和update选项
816删除和更新查找表的三个选项
817删除规则:set null
818删除规则:cascade
819更新规则:cascade
验证参照完整性
820主键的两种含义
821使用两个或者更多的列作为主键
822查找表和数据表可以是同一个表
如何在create table语句中编写约束条件
823约束条件常常在create table
语句中编写
小结
第9章行函数
行函数简介
91直接从初始表中获得数据
92什么是行函数
93select子句中行函数的例子
94select语句的所有子句中使用
行函数的例子
95定义行函数作为第一步
数字函数
96数字函数
97如何测试行函数
98测试数字行函数的另一种方法
文本函数
99文本函数
910组合名和姓
911分隔名和姓
912设计电话号码的格式
日期函数
913日期函数
914日期函数的一个例子
915从日期中删除时间
小结
第10章使用行函数
特殊行函数
101其他行函数
102使用函数识别用户和日期
103使用函数把null改为其他值
104使用函数更改数据类型
使用行函数的文档
105使用Oracle文档
106使用Access文档
107使用Access Expression Builder
查看行函数
创建数字和日期模式
108创建一个简单的数字模式
109创建一个复杂的数字模式
1010列出一个星期的所有星期数
1011创建一个工作日日历
1012如何计算从出生到现在的天数
1013如何查找出生后满10 000天的
日期
1014给Oracle和Access中的报表
编行号
1015可选内容:解代数方程的一种
简单方法
小结
第11章汇总数据
列函数简介
111汇总一个列中的所有数据
112列函数列表
最大值和最小值
113找出最大值和最小值
114列函数和where子句一起使用
115找出拥有最大值和最小值的行
计数
116对行和数据计数
117零计数:第一部分
118对列中相异值计数
119计算两个或多个列中相异值的
数目
求和与平均
1110求和函数与平均函数
1111加法存在的问题以及如何解决
其他主题
1112并不总将null更改为零
1113计算列中null的数目
1114对相异值计数
小结
第12章控制汇总级别
将表划分为行的组并汇总每个组
121列中数据组的汇总
122group by子句
123由两个或更多列形成的组
124有多个分组列时的null组
125在同一条select语句中,已汇总的
数据不能与没有汇总的数据混在
一起
126解决方案1:将更多的列添加到
group by子句中
127解决方案2:将查询划分为两条
单独的select语句
128如何创建有多个小计和一个总计
的报表
129零计数:第二部分
1210零计数:第三部分
删除某些已汇总的数据
1211having子句
1212比较having子句与where子句
1213在一个表上使用select语句的
全过程
1214having子句没有增加select语
句的功能
1215使用where子句来删除原始
数据
1216如何对一个列函数应用另一个列
函数并且绕开其他限制
小结
第13章内连接
连接简介
131一个查询可以使用几个表中的
数据
132最佳方法是一次连接两个表
两个表的内连接
133一对一关系
134多对一关系
135一对多关系
136多对多关系
137删除不匹配的行
138删除匹配列中带有null的行
139编写SQL语句进行内连接的
5种方式
连接条件的变体
1310用两个或多个匹配列连接
1311用between匹配一系列值的
连接
1312使用大于条件的连接
1313用行函数进行连接
1314在from子句中编写连接条件
连接应用
1315查找表
1316组合连接和数据的选取
1317联合使用连接
1318如何从数据字典中找出主键列
1319用内连接组合三个或更多的表
小结
第14章外连接
外连接简介
141外连接派生于内连接
142外连接的3种类型
143左外连接
144右外连接
145全外连接
146union简介
147带有匹配列的两个表的union的
例子
外连接的应用
148零计数:第四部分
149组合外连接与数据选取
1410按排序顺序的全外连接
1411找出模式中的缺陷
1412用两列或多列进行比较
1413比较两个不同的全外连接
1414问题:左外连接和右外连接
可能很难处理
小结
第15章union和union all
union的基础知识
151union与连接之间的区别
152union和union all的区别
153union中的select语句
154union中的order by子句
155创建一个包含union的表或者
视图
156union中的自动数据类型转换
非常规的union
157不同数据类型表的union
158不同列数的两个表的union
union的应用
159确定两个表是否相同
1510在union中使用直接量确定
数据的来源
1511给异常、警告和错误的标志
附加消息
1512将数据从一个列中分到两个
不同的列中
1513将两个函数应用到数据的
不同部分
1514三个表或更多表的union
Oracle中的交集和差集
1515交集
1516差集
小结
第16章交叉连接和自连接
交叉连接
161交叉连接的定义
162交叉连接重要的原因
163内连接源自交叉连接
164内连接的属性
165连接条件中的错误可以显示为
一个交叉连接
166使用交叉连接列出所有可能
的组合
167三维或多维时的其他布局
168避免对大型表使用交叉连接
自连接
169表为什么与自己连接
1610自连接的例子
1611处理事件序列
1612生成从0到999的数字
Access中的CrossTab查询
1613当有两维时的交叉表查询
1614增加到四维的CrossTab查询
1615更多维的CrossTab查询
1616显示谁参加每次午餐的
CrossTab
1617显示每次午餐的食物
Oracle中的CrossTab查询
1618Oracle中的CrossTab查询——
第一部分
1619Oracle中的CrossTab查询——
第二部分
小结
第17章在产品数据库中组合表
连接三个或者更多表的方法
171使用一系列步骤连接几个表
172在where子句中一次连接几个表
173在from子句中一次连接几个表
丢失信息
174小心使用内连接
175小心使用左外连接和右外连接
176全外连接保留了所有的信息
177几个表的全外连接
注意计算机的效率
178监视查询
179使用索引
1710尽早在过程中选择想要的数据
1711使用表保存总结数据
1712使用几种方法编写SQL
标准化连接表的方式
1713连接是数据库设计的一部分
1714视图可以标准化表的连接方式
1715临时报表
小结
第18章ifthenelse、参数查询和
子查询
ifthenelse逻辑
181Oracle中的case函数和decode
函数
182Access中的Immediate If (iif)
函数
183给行附加消息
184将一个列的数据划分为两个
不同的列
185对数据的不同部分应用两个
函数
参数查询
186Oracle中的参数查询
187Oracle中多次使用参数
188在Oracle中定义参数的更多方法
189Access中的参数查询
1810Access中带有两个参数的查询
1811Access中的参数限制
子查询
1812子查询简介
1813产生一系列值的子查询
1814产生一个值的子查询
1815存在null值时避免使用not in
子查询的应用
1816用于update命令中的子查询
1817找出两个表之间的不同之处
1818使用最新数据
子查询的原有特性
1819相关子查询
1820使用exists的子查询
1821使用子查询编写外连接
1822嵌套子查询
1823子查询的使用限制
1824许多子查询也可以写作连接
小结
第19章多用户环境
数据库配置
191单用户环境
192多用户环境
193分布式环境
194通过Internet连接
多用户环境中的操作
195如何使用别人拥有的表
196代名
197快照
安全性和特权
198识别用户
199特权
1910角色
1911几个人同时使用相同的表
Oracle数据字典和多用户环境
1912ALL和USER
1913如何在数据字典中找到所需
的表
1914如何找到列的含义
小结
第20章SQL设计
SQL的最初设计目标
201做一件事并且做好它
202关注信息
203保持SQL语言的简单性
204协调人们一起工作
新的界面
205窗体
206报表
207Web工具
208更小的数据库
209OLTP
2010数据仓库
小结
附录A获取和安装Oracle
附录BOracle快速入门
附录CAccess快速入门
附录DLunches数据库的图
〖=A(〗111235556789910111113141819191919212122242629303031343537384042444445464748495151515355565858606262657070737373747575777778788081838484848789899090919395959799100101102104106106107107109109109109110113113114120122122124124124125126127128128130132133133133134137140140141141142144144145146147148148150150152153155156156156158159161161163163164165167167168168169169171172174175176176176178179179179179180181182183183183184185186187187189190190192192193194196197197199200201201203204204204204207208209211211212213215215218220221223223226227229230230230231232234236236237237239239241242244247248249250253254254254254256256258259261261262263265267267268272272273274276277277277278280282284286287289289290292292293294294296297299300300300301301302305306307308309310312312313314316316318318320322323324325326326326327328330331333334336336337339341342344346348350350350352353354357358361361362364364365367368369370371371372374375375375376376379379381382383384384385387389391391395396399402405405406408409409409411412413413413413413415415415416416416416416417420420421421421424426427429430431433434436437437438438439441442443444445446446447448448449449449450451451451452452454454454455456457457457458459460460460460461462462462462463463464464464464466466467467468477481489〖=〗