按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
148
…………………………………………………………Page 149……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
INPUT/OUTPUT
SELECT O。PARTNUM SUM O。QUANTITY*P。PRICE COUNT PARTNUM
FROM ORDERS O PART P WHERE P。PARTNUM = O。PARTNUM GROUP BY O。PARTNUM
HAVING SUM O。QUANTITY*P。PRICE 》 SELECT AVG O1。QUANTITY*P1。PRICE
FROM PART P1 ORDERS O1
WHERE P1。PARTNUM = O1。PARTNUM
AND P1。PARTNUM = O。PARTNUM)
PARTNUM SUM COUNT
10 8400。00 4
23 4906。30 2
76 19610。00 5
分析
子查询中不能只有
AVG(O1。QUANTITY*P1。PRICE)
因为子查询与主查询之间需要下边的关联语句
AND P1。PARTNUM = O。PARTNUM
将会计算每一组的平均值然后再与 HAVING SUM(O。QUANTITY*P。PRICE)》进行比较
技巧 当在相关查询中使用 GROUP BY 和 HAVING 子句时 在 HAVING 子句中的列必需
在 SELECT 或 GROUP BY 子句中存在 否则你将会收到一行非法引用的信息 因为这时
与子查询对应的是每一组而不是每一行 对于组你无法进行比较操作
EXISTS ANY ALL 的使用
EXISTS ANY 和 ALL 关键字的用法不像它看上去那么直观 如果子查询返回的内容
为非空时 EXISTS 返回 TRUE 否则返回 FALSE 例如
INPUT/OUTPUT
SELECT NAME ORDEREDON FROM ORDERS WHERE EXISTS
(SELECT * FROM ORDERS WHERE NAME ='TRUE WHEEL')
NAME ORDEREDON
TRUE WHEEL 15…MAY…1996
TRUE WHEEL 19…MAY…1996
149
…………………………………………………………Page 150……………………………………………………………
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