按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
PARTNUM DESCRIPTION PRICE
140
…………………………………………………………Page 141……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
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
77 ROADKILL 7。99
如果你没有觉察到这些改变而仍然使用原来的查询的话 你将会得到如下信息
multiple rows in singleton select
你没有得到任何结果 SQL 的响应信息可能不会相同 但是你都会同样地得不到任何结果
想知道为什么会有这样的结果 请想一个 SQL 引擎的处理规则 你需要重新核查一下你的
子查询 请输入
INPUT/OUTPUT
SELECT PARTNUM FROM PART WHERE DESCRIPTION LIKE 〃ROAD%〃
PARTNUM
76
77
你会把这个结果赋给 O。PARTNUM = 就是这一步导致的错误
分析
PARTNUM 怎么能同时匹配 76 和 77 呢 解释器一定会给你这样的信息的 因为你是
一个懒家伙 当你使用 LIKE 子句的时候 你就已经开始了犯错误的道路 如果你想使用
比较运算符如》 (SELECT AVG(O。QUANTITY * P。PRICE)
FROM ORDERS O PART P WHERE O。PARTNUM = P。PARTNUM)
142
…………………………………………………………Page 143……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
NAME ORDEREDON TOTAL
LE SHOPPE 1…JUN…1996 3600。00
BIKE SPEC 30…MAY…1996 2803。60
LE SHOPPE 17…JAN…1996 2650。00
BIKE SPEC 17…JAN…1996 5830。00
JACKS BIKE 11…JUL…1996 7420。00
分析
在这个例子中的 SELECT/FROM/WHERE 子句的区别不太明显
SELECT O。NAME O。ORDEREDON O。QUANTITY * P。PRICE TOTAL
FROM ORDERS O PART P WHERE O。PARTNUM = P。PARTNUM
这是归并两个表的常用方法 这种归并是必须的 因为单价在 PART 表上而数量则在
ORDERS 表上 WHERE 子句用来检测相关性错误 指一个主关键字对应两条记录的情况
之后则是子查询语句
AND
O。QUANTITY * P。PRICE》(SELECT AVG(O。QUANTITY * P。PRICE)
FROM ORDERS O PART P WHERE O。PARTNUM = P。PARTNUM)
第一个比较表达式是将每一条记录的金额与子查询中的平均金额进行比较 注意子查
询中使用归并的原因与主查询是相同的 它严格地遵循着归并的语法 在子查询中没有什
么秘密可言 它与单独的查询具有相同的语法格式 事实上 大多数子查询都是作为独立
查询经过测试确定其只返回一个值以后才作为子查询使用的
子查询的嵌套
嵌套就是将一个子查询嵌入到另一个子查询中去 例如
Select * FROM SOMETHING WHERE ( SUBQUERY(SUBQUERY(SUBQUERY)))
子查询可被嵌套的深度依你的需要而定 例如 如果你想给那些花费超过了平均价格
的客户发一个特别通知 你将会使用 CUSTOMERS 表中的如下信息
INPUT
SELECT * FROM CUSTOMER
OUTPUT
143
…………………………………………………………Page 144……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人