友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第29部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
19…MAY…1996 TRUE WHEEL 76 3 PAID
2…SEP…1996 TRUE WHEEL 10 1 PAID
30…JUN…1996 TRUE WHEEL 42 8 PAID
30…JUN…1996 BIKE SPEC 54 10 PAID
30…MAY…1996 BIKE SPEC 10 2 PAID
30…MAY…1996 BIKE SPEC 23 8 PAID
17…JAN…1996 BIKE SPEC 76 11 PAID
17…JAN…1996 LE SHOPPE 76 5 PAID
1…JUN…1996 LE SHOPPE 10 3 PAID
1…JUN…1996 AAA BIKE 10 1 PAID
1…JUL…1996 AAA BIKE 76 4 PAID
1…JUL…1996 AAA BIKE 46 14 PAID
11…JUL…1996 JACKS BIKE 76 14 PAID
分析
两表的共有字段是 PARTNUM 假如你不知道 或者是不想知道 这个字段 但是你
又想用 PART 表的 description 字段来工作 这时可以使用子查询 语句如下
INPUT/OUTPUT
SELECT * FROM ORDERS WHERE PARTNUM =
(SELECT PARTNUM FROM PART WHERE DESCRIPTION LIKE 〃ROAD%〃)
ORDEREDON NAME PARTNUM QUANTITY REMARKS
19…MAY…1996 TRUE WHEEL 76 3 PAID
17…JAN…1996 BIKE SPEC 76 11 PAID
17…JAN…1996 LE SHOPPE 76 5 PAID
1…JUL…1996 AAA BIKE 76 4 PAID
11…JUL…1996 JACKS BIKE 76 14 PAID
分析
139
…………………………………………………………Page 140……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
更进一步 如果你使用了在第六天中的概念 你可以使 PARTNUM 列带有
DESCRIPTION 这样就会使那些对 PARTNUM 还不太清楚的人看得更明白些 如下例
INPUT/OUTPUT
SELECT O。ORDEREDON O。PARTNUM P。DESCRIPTION O。QUANTITY O。REMARKS
FROM ORDERS O PART P WHERE O。PARTNUM = P。PARTNUM
AND O。PARTNUM =(SELECT PARTNUM FROM PART
WHERE DESCRIPTION LIKE 〃ROAD%〃)
ORDEREDON PARTNUM DESCRIPTION QUANTITY REMARKS
19…MAY…1996 76 ROAD BIKE 3 PAID
1…JUL…1996 76 ROAD BIKE 4 PAID
17…JAN…1996 76 ROAD BIKE 5 PAID
17…JAN…1996 76 ROAD BIKE 11 PAID
11…JUL…1996 76 ROAD BIKE 14 PAID
分析
查询的第一部分非常熟悉
SELECT O。ORDEREDON O。PARTNUM P。DESCRIPTION O。QUANTITY
O。REMARKS FROM ORDERS O PART P
这里使用了别名 O 和 P 来指定了在 ORDERS 和 PART 表中你所感兴趣的 5 列 对于
你要访问的在两个表中的名字唯一的列别名是没有必要的 可是它可以使你的语句更具有
可读性 你看到的第一个 WHERE 子句内容如下
WHERE O。PARTNUM = P。PARTNUM
它是将 ORDERS 与 PART 表进行归并的标准语句 如果你没有使用 WHERE 子句 那
么你将会得到两个表的记录的所有可能的组合 接下来就是子查询语句 内容如下
AND O。PARTNUM =(SELECT PARTNUM FROM PART WHERE DESCRIPTION LIKE 〃ROAD%〃)
增加的限制使你的 PARTNUM 内容必须与你的子查询所返回的结果相等 子查询则非常简
单 它要求返回以 ROAD%相符的 PARTNUM 使用 LIKE 语句是一种懒人的办法 使得
你不必键入 ROAD BIKE 但是这只是你侥幸 如果在 PART 表中加入了一个新的记录名
字为 ROADKILL 时呢 这时 PART 表的内容如下
INPUT/OUTPUT
SELECT * FROM PART
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
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!