按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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
144
…………………………………………………………Page 145……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
NAME
BIKE SPEC
JACKS BIKE
我们曾经花过一些时间来讨论为什么子查询应该只返回一个数值 而这个查询返回
了多个数值则是显而易见的
将上述结果引入下边的语句
SELECT C。NAME C。ADDRESS C。STATE C。ZIP FROM CUSTOMER C
WHERE C。NAME IN (。。。)
分析
头两行没有什么特别的内容 在第三行时再次引入了关键字 IN 看一下第二天的 查
询简介 SELECT 语句的使用 IN 是一种允许你在子查询中进行多行输出的工具 就像
你原来记得的那样 它将返回与所列内容相匹配的记录 它的列出内容如下
LE SHOPPE
BIKE SPEC
LE SHOPPE
BIKE SPEC
JACKS BIKE
根据子查询的条件得到了下边的内容
NAME ADDRESS STATE ZIP
BIKE SPEC CPT SHRIVE LA 45678
LE SHOPPE HOMETOWN KS 54678
JACKS BIKE 24 EGLIN FL 34567
在子查询中使用关键字 IN 是非常普遍的 因为 IN 可以与一组数据进行对比 而且它
不会使 SQL 的引擎检查出其中有冲突或是不合适的地方
子查询也可以使用 GROUP BY 和 HAVING 子句 见下例
INPUT/OUTPUT
SELECT NAME AVG QUANTITY FROM ORDERS
GROUP BY NAME HAVING AVG QUANTITY 》 SELECT AVG QUANTITY
FROM ORDERS
NAME AVG
BIKE SPEC 8
JACKS BIKE 14
145
…………………………………………………………Page 146……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
分析
让我们来看一下这个查询在引擎中的工作过程 首先 请看子查询
INPUT/OUTPUT
SELECT AVG QUANTITY FROM ORDERS
该查询返回的结果为 6
而主查询的结果如下
INPUT/OUTPUT
SELECT NAME AVG QUANTITY FROM ORDERS GROUP BY NAME
NAME AVG
AAA BIKE 6
BIKE SPEC 8
JACKS BIKE 14
LE SHOPPE 4
TRUE WHEEL 5
在经过 HAVING 子句的检查后 该查询给出了两条大于平均 QUANTITY 的记录
INPUT/OUTPUT
HAVING AVG QUANTITY 》 SELECT AVG QUANTITY FROM ORDERS
NAME AVG
BIKE SPEC 8
JACKS BIKE 14
相关子查询
到现在为止 我们所写出的子查询都是独立的 它们都没有涉及到其它的子查询 相
关子查询可以接受外部的引用从而得到一些令人惊奇的结果 请看下边的这个查询
INPUT
SELECT * FROM ORDERS O WHERE 'ROAD BIKE' =
(SELECT DESCRIPTION FROM PART P
WHERE P。PARTNUM = O。PARTNUM)
OUTPUT
ORDEREDON NAME PARTNUM QUANTITY REMARKS
19…MAY…1996 TRUE WHEEL 76 3 PAID
146
…………………………………………………………Page 147……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
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