友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

SQL 21日自学通(V3.0)(PDF格式)-第42章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 



 
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!