友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第23部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
SQL 21 日自学通(V1。0) 翻译人 笨猪
NAME ORDEREDON
TRUE WHEEL 2…SEP…1996
TRUE WHEEL 30…JUN…1996
BIKE SPEC 30…JUN…1996
BIKE SPEC 30…MAY…1996
BIKE SPEC 30…MAY…1996
BIKE SPEC 17…JAN…1996
LE SHOPPE 17…JAN…1996
LE SHOPPE 1…JUN…1996
AAA BIKE 1…JUN…1996
AAA BIKE 1…JUL…1996
AAA BIKE 1…JUL…1996
JACKS BIKE 11…JUL…1996
分析
与你所想的并不一样 在 EXISTS 中的子查询在这个例子中只返回一个值 因为从子
查询中返回的行数至少有一行 EXIST 返回为 TRUE 这就使得表中的所有记录都被显示
了出来 如果你把查询改成下边的形式 你将不会得到任何结果
SELECT NAME ORDEREDON FROM ORDERS
WHERE EXISTS SELECT * FROM ORDERS WHERE NAME ='MOSTLY HARMLESS')
分析
EXISTS 求得的结果为 FALSE 因为 MOSTLY HARMLESS 并不是 NAME 中的内容
注 注意在 EXIST 所属的子查询中使用了 SELECT * EXIST 并不管返回了多少列
你可以使用 EXIST 来检查查询是否确实存在输出 从而实现对查询确实有结果才输出
的控制
如果你在相关查询中使用 EXISTS 关键字 它将会检查你所指出的每一种情况 例如
INPUT/OUTPUT
SELECT NAME ORDEREDON FROM ORDERS O WHERE EXISTS
(SELECT * FROM CUSTOMER C WHERE STATE ='NE' AND C。NAME = O。NAME)
NAME ORDEREDON
TRUE WHEEL 15…MAY…1996
TRUE WHEEL 19…MAY…1996
TRUE WHEEL 2…SEP…1996
150
…………………………………………………………Page 151……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
NAME ORDEREDON
TRUE WHEEL 30…JUN…1996
AAA BIKE 1…JUN…1996
AAA BIKE 1…JUL…1996
AAA BIKE 1…JUL…1996
与上例相比只有微小的改动 不相关的查询返回了所有在内布拉斯加州售出的已有订
单的自行车 下边的子查询将返回与 CUSTOMER 和 ORDERS 相关的所有记录
(SELECT * FROM CUSTOMER C WHERE STATE ='NE' AND C。NAME = O。NAME)
分析
对于相关的记录 如果 STATE 为 NE 则 EXISTS 返回为 TRUE 否则返回 FALSE
与 EXISTS 相关的关键字有 ALL ANY 和 SOME ANY 与 SOME 具有同样的功能
乐观的人认为它给用户提供了一种选择 而悲观的人则认为它使得条件更加复杂化 见下
例
INPUT
SELECT NAME ORDEREDON FROM ORDERS WHERE NAME = ANY
(SELECT NAME FROM ORDERS WHERE NAME ='TRUE WHEEL')
OUTPUT
NAME ORDEREDON
TRUE WHEEL 15…MAY…1996
TRUE WHEEL 19…MAY…1996
TRUE WHEEL 2…SEP…1996
TRUE WHEEL 30…JUN…1996
分析
ANY 与子查询中的每一行与主查询进行比较 并对子查询中的每一行返回一个 TRUE
值
(SELECT NAME FROM ORDERS WHERE NAME ='TRUE WHEEL')
将 ANY 用 SOME 替换将会得到同样的结果
INPUT/OUTPUT
SELECT NAME ORDEREDON FROM ORDERS WHERE NAME = SOME
(SELECT NAME FROM ORDERS WHERE NAME ='TRUE WHEEL')
NAME ORDEREDON
TRUE WHEEL 15…MAY…1996
151
…………………………………………………………Page 152……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
NAME ORDEREDON
TRUE WHEEL 19…MAY…1996
TRUE WHEEL 2…SEP…1996
TRUE WHEEL 30…JUN…1996
分析
你可能注意到了它与 IN 有些类似 使用 IN 的相同查询语句如下
INPUT/OUTPUT
SELECT NAME ORDEREDON FROM ORDERS WHERE NAME IN
(SELECT NAME FROM ORDERS WHERE NAME ='TRUE WHEEL')
NAME ORDEREDON
TRUE WHEEL 15…MAY…1996
TRUE WHEEL 19…MAY…1996
TRUE WHEEL 2…SEP…1996
TRUE WHEEL 30…JUN…1996
分析
你已经看到了 IN 返回的结果与 SOME 或 ANY 是相同的 是不是它就没有用了呢
当然不是 IN 能像下边这样使用吗
INPUT/OUTPUT
SELECT NAME ORDEREDON FROM ORDERS WHERE NAME 》 ANY
(SELECT NAME FROM ORDERS WHERE NAME ='JACKS BIKE')
NAME ORDEREDON
TRUE WHEEL 15…MAY…1996
TRUE WHEEL 19…MAY…1996
TRUE WHEEL 2…SEP…1996
TRUE WHEEL 30…JUN…1996
LE SHOPPE 17…JAN…1996
LE SHOPPE 1…JUN…1996
回答是否定的 IN 只相当于多个等号的作用 而 ANY 和 SOME 则可以使用其它的比
较运算符如大于或小于 它是你的一个新增工具
ALL 关键字的作用在于子查询中的所有结果均满足条件时它才会返回 TRUE 奇怪吗
ALL 常起双重否定的作用 见下例
INPUT/OUTPUT
SELECT NAME ORDEREDON FROM ORDERS WHERE NAME ALL
152
…………………………………………………………Page 153……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
(SELECT NAME FROM ORDERS WHERE NAME ='JACKS BIKE')
NAME ORDEREDON
TRUE WHEEL 15…MAY…1996
TRUE WHEEL 19…MAY…1996
TRUE WHEEL 2…SEP…1996
TRUE WHEEL 30…JUN…1996
BIKE SPEC 30…JUN…1996
BIKE SPEC 30…MAY…1996
BIKE SPEC 30…MAY…1996
BIKE SPEC 17…JAN…1996
LE SHOPPE 17…JAN…1996
LE SHOPPE 1…JUN…1996
AAA BIKE 1…JUN…1996
AAA BIKE 1…JUL…1996
AAA BIKE 1…JUL…1996
分析
该语句返回了除 JACKS BIKE 的所有人 ALL 只有当左边的内容不存在于右边时才
会返回 TRUE 值
总结
今天我们做了不少关于子查询的练习 你已经学习了使用 SQL 中的重要的一部分 你
也已经处理了 SQL 中最为困难的一部分— — 相关查询 相关查询会在查询与子查询之间建
立一个关系 并对子查询中的每一个实例加以关系限制 不要为查询的长度所制约 你可
以马上从它们中把子查询找出来
问与答
问 在一些 SQL 实例中对于同一个问题给出了多个解决的方法 这是否会导致混乱
答 不 事实上不是这样 多种方法得到相同的结果可以使你的查询更简练 这是 SQL
的优点
153
…………………………………………………………Page 154……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
校练场
1 在嵌套查询部分 有一个例子中子查询返回了以下几个数值
LE SHOPPE
BIKE SPEC
LE SHOPPE
BIKE SPEC
JACKS BIKE
其中有一些结果是重复的 为什么在最终的结果中没有出现重复
2 下面的话是对还是错
1 汇总函数如 SUM AVG COUNT MAX MIN 都返回多个数值
2 子查询最多允许嵌套两层
3 相关查询是完全的独立查询
3 下边的子查询中哪一个是使用 ORDERS 表和 PART 表工作的
INPUT/OUTPUT
SQL》 SELECT * FROM PART;
PARTNUM DESCRIPTION PRICE
54 PEDALS 54。25
42 SEATS 24。50
46 TIRES 15。25
23 MOUNTAIN BIKE 350。45
76 ROAD BIKE 530。00
10 TANDEM 1200。00
INPUT/OUTPUT
SQL》 SELECT * FROM ORDERS
ORDEREDON NAME PARTNUM QUANITY REMARKS
15…MAY…96 TRUE WHEEL 23 6 PAID
19…MAY…96 TRUE WHEEL 76 3 PAID
2…SEP…96 TRUE WHEEL 10 1 PAID
30…JUN…96 BIKE SPEC 54 10 PAID
30…MAY…96 BIKE SPEC 10 2 PAID
30…MAY…96 BIKE SPEC 23 8 PAID
17…JAN…96 BIKE SPEC 76 11 PAID
17…JAN…96 LE SHOPPE 76 5 PAID
154
…………………………………………………………Page 155……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
1…JUN…96 LE SHOPPE 10 3 PAID
1…JUN…96 AAA BIKE 10 1 PAID
1…JUN…96 AAA BIKE 76 4 PAID
1…JUN…96 AAA BIKE 46 14 PAID
11…JUL…96 JACKS BIKE 76 14 PAID
A SQL》 SELECT * FROM ORDERS WHERE PARTNUM =
SELECT PARTNUM FROM PART
WHERE DESCRIPTION = 'TRUE WHEEL';
B SQL》 SELECT PARTNUM FROM ORDERS WHERE PARTNUM =
(SELECT * FROM PART
WHERE DESCRIPTION = 'LE SHOPPE');
C SQL》 SELECT NAME; PARTNUM FROM ORDERS WHERE EXISTS
(SELECT * FROM ORDERS
WHERE NAME = 'TRUE WHEEL')
练习
应用 ORDERS 表来写一个查询 返回所以字母顺序排列在 JACKS BIKE 之后的NAMES
和 ODEREDON 数据
155
…………………………………………………………Page 156……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
第一周回顾
在第一周中我们简要地回顾了一下 SQL 的历史 第一周的重要是在 SQL 的 SELECT
语句上 下边给出的内容是关于 SELECT 语句的语法与我们学习的前后对照情况表
l SELECT 'DISTINCT | ALL' (Day 2)……Columns (Day 1); Functions (Day 4)
l FROM (Day 2)……Tables or Views (Day 1); Aggregate Functions (Day 4)
l WHERE (Day 5)……Condition (Day 3); Join (Day 6); Subquery (Day 7)
l GROUP BY (Day 5)……Columns (Day 3)
l HAVING (Day 5)……Aggregate Function (Day 4)
l UNION | INTERSECT (Day 3)……(Placed between two SELECT statements)
l ORDER BY (Day 5)……Columns (Day 1)
假如你需要在你的程序中建立成千上万个查询的话 你会发现它们中的 80%将会以
SELECT 开头 而余下的 20%将在第二周中提到
预览
在第二周中我们将会学习到数据库管理的新技能 我们将会学习如何
l 建立和删除一个表
l 为你的朋友提供访问权限和有效地防止你的敌人
l 更新和删除表中的数据
156
…………………………………………………………Page 157……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
第二周概貌
这一周都讲些什么
在第一周我们讲了使用 SELECT 语句进行 SQL 的最基本的查询 从最简单的 SELECT
语句开始 我们学习了如何从数据库中取得数据 然后我们学习了 SQL 中的函数 它们在
的用处很大 例如在转换数据的格式或财务领域 然后你很快就学到了用不同的方法从数
据库中取得数据 子句如 WHERE ORDER BY 和 GROUP BY 允许你对查询进行定制以
返回有特定要求的数据记录 你学习了归并操作以从不同的表中返回数据 当你需要运行
多个查询且每个查询都需要前一个查询返回的内容时子查询是特别有用处的
在第二周我们将进一步地学习 SQL 的使用
l 第 8 天教你如何修改数据库中的数据 你也许很害怕向数据库中录入数据 但是
手工输入数据并不总是必须的 现代的数据库系统大多都支持你从其它的数据库
格式中导入或导出数据 此外 SQL 还提供了几个很有用的语句使你可以熟练地
操纵数据库中的数据
l 第 9 天你将学习如何建立和维护数据库中的表 你也将学习如何建立数据库和管
理数据库的磁盘空间
l 第 10 天将学习如何建立 维护 使用数据库的视图和索引
l 第 11 天将涉及事务处理 对数据库进行处理以及撤消对它的改动 它对于在线事
务处理程序非常有用
l 第 12 天的重点是数据库的安全性 拥有数据库安全性知识可以让你更有效地管理
数据库
l 第 13 天将学习如何在大型的应用程序中使用 SQL 内嵌型 SQL 常常运行于宿主
语言如 C 或 COBOL 上 此外 开放数据联接 ODBC 可以让你在应用程序中
写出在通过数据库驱动在不同的数据库系统上运行的代码 也将会提到一些 SQL
的高级特性
l 在第 14 天将会讨论如何使用动态 SQL 并用几个例子来演示如何在应用程序中
使用 SQL
157
…………………………………………………………Page 158……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
第八天 操作数据
目标
今天我们来讨论一下数据操作问题 在今天中我们将学习以下内容
l 如何使用 INSERT UPDATE 和 DELETE 来处理数据
l 在操作数据时使用 WHERE 子句的重要性
l 从外部数据源中导入和导出数据的基本方法
数据操作语句
到现在为止我们已经学习了从数据库出取得数据的每一种可能的操作 当获得数据以
后 你可以在应用程序中使用或编辑它 在第一周主要讨论获得数据 但是 可能你会对
如何向数据库中输入数据感兴趣 你也可能会很想知道如何来编辑数据 今天 我们将讨
论三个关于如何对数据库中的表中的数据进行操作的三条语句 这三条语句是
INSERT 语句
UPDATE 语句
DELETE 语句
在过去 你也许使用过基于 PC 机的数据库系统 如 ACCESS dBASE IV 和 FOXPRO
这些产品提供了很好的输入 编辑和删除数据的工具 这就是 SQL 为什么提供了对数据进
行编辑的基本语句可又允许用户使用应用程序自带的工具进行编辑的原因 SQL 的程序员
应该具有将数据送入数据库中的能力 此外 大型的数据库系统常常不能按照数据库设计
和编程人员的意图来进行设计 因为这些数据库系统是为大容量和多用户环境准备的 所
以它的设计重点放在了如何优化查询和数据引擎上了
大多数商业化的数据库系统都提供了导入导出数据的工具 数据被存储在有分隔符的
文本文件之中 格式化的文本文件常常存储着与表相关的信息 相关的工具如 ORACLE 的
SQL*Loader SQL Server's bcp bulk copy 以Microsoft Acces 的导入和导出数据的工具都
将在今天提到
注 今天的例子是用 Personal Oracle7 做的 请注�
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!