按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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) 翻译人 笨猪
NAME ADDRESS STATE ZIP PHONE REMARKS
TRUE WHEEL 55O HUSKER NE 58702 555…4545 NONE
BIKE SPEC CPT SHRIVE LA 45678 555…1234 NONE
LE SHOPPE HOMETOWN KS 54678 555…1278 NONE
AAA BIKE 10 OLDTOWN NE 56784 555…3421 JOHN…MGR
JACKS BIKE 24 EGLIN FL 34567 555…2314 NONE
你只需要对上边你的查找定单的查询做一点改动即可
INPUT/OUTPUT
SELECT ALL C。NAME C。ADDRESS C。STATE C。ZIP FROM CUSTOMER C
WHERE C。NAME IN
(SELECT O。NAME FROM ORDERS O PART P
WHERE O。PARTNUM = P。PARTNUM
AND
O。QUANTITY * P。PRICE》 (SELECT AVG(O。QUANTITY * P。PRICE)
FROM ORDERS O PART P
WHERE O。PARTNUM = P。PARTNUM))
NAME ADDRESS STATE ZIP
BIKE SPEC CPTSHRIVE LA 45678
LE SHOPPE HOMETOWN KS 54678
JACKS BIKE 24EGLIN FL 34567
分析
注意一下圆括号最里边的内容 你会发现类似的语句
SELECT AVG(O。QUANTITY * P。PRICE)
FROM ORDERS O PART P WHERE O。PARTNUM = P。PARTNUM
结果传入的语句与你以前使用的 SELECT 语句有一些不同之处
SELECT O。NAME FROM ORDERS O PART P WHERE O。PARTNUM = P。PARTNUM
AND O。QUANTITY * P。PRICE》(。。。)
注意 SELECT 子句已经被改为返回单一的 NAME 列 运行该查询你会得到下表
NAME
LE SHOPPE
BIKE SPEC
LE SHOPPE