八宝书库 > 文学其他电子书 > SQL 21日自学通(V3.0)(PDF格式) >

第34部分

SQL 21日自学通(V3.0)(PDF格式)-第34部分

小说: SQL 21日自学通(V3.0)(PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




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 



        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 的所有人  ALL 只有当左边的内容不存在于右边时才 



会返回 TRUE 值 



总结 



    今天我们做了不少关于子查询的练习              你已经学习了使用 SQL  中的重要的一部分  你 



也已经处理了 SQL  中最为困难的一部分— — 相关查询              相关查询会在查询与子查询之间建 



立一个关系      并对子查询中的每一个实例加以关系限制                不要为查询的长度所制约          你可 



以马上从它们中把子查询找出来 



问与答 



    问  在一些 SQL 实例中对于同一个问题给出了多个解决的方法  这是否会导致混乱 



    答  不  事实上不是这样  多种方法得到相同的结果可以使你的查询更简练  这是 SQL 



      的优点 



                                                                   153 


…………………………………………………………Page 154……………………………………………………………

SQL 21  日自学通(V1。0)                                                  翻译人   笨猪 



校练场 



1  在嵌套查询部分         有一个例子中子查询返回了以下几个数值 



         LE SHOPPE 



         BIKE SPEC 



         LE SHOPPE 



         BIKE SPEC 



         JACKS BIKE 



其中有一些结果是重复的             为什么在最终的结果中没有出现重复 



2  下面的话是对还是错 



      1   汇总函数如 SUM      AVG   COUNT    MAX    MIN 都返回多个数值 



      2   子查询最多允许嵌套两层 



      3   相关查询是完全的独立查询 



3  下边的子查询中哪一个是使用 ORDERS 表和 PART 表工作的 



    INPUT/OUTPUT 



    SQL》 SELECT * FROM PART; 



         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 



INPUT/OUTPUT 



SQL》 SELECT * FROM ORDERS 



     ORDEREDON       NAME            PARTNUM      QUANITY      REMARKS 



     15…MAY…96       TRUE WHEEL      23           6            PAID 



     19…MAY…96       TRUE WHEEL      76           3            PAID 



     2…SEP…96        TRUE WHEEL      10           1            PAID 



     30…JUN…96       BIKE SPEC       54           10           PAID 



     30…MAY…96       BIKE SPEC       10           2            PAID 



     30…MAY…96       BIKE SPEC       23           8            PAID 



     17…JAN…96       BIKE SPEC       76           11           PAID 



     17…JAN…96       LE SHOPPE       76           5            PAID 



                                                                           154 


…………………………………………………………Page 155……………………………………………………………

SQL 21  日自学通(V1。0)                                                    翻译人    笨猪 



     1…JUN…96         LE SHOPPE       10            3             PAID 



     1…JUN…96         AAA BIKE        10            1             PAID 



     1…JUN…96         AAA BIKE        76            4             PAID 



     1…JUN…96         AAA BIKE        46            14            PAID 



     11…JUL…96        JACKS BIKE      76            14            PAID 



    A  SQL》 SELECT * FROM ORDERS WHERE PARTNUM = 



            SELECT PARTNUM FROM PART 



            WHERE DESCRIPTION = 'TRUE WHEEL'; 



    B  SQL》 SELECT PARTNUM FROM ORDERS WHERE PARTNUM = 



            (SELECT * FROM PART 



            WHERE DESCRIPTION = 'LE SHOPPE'); 



    C  SQL》 SELECT NAME; PARTNUM FROM ORDERS WHERE EXISTS 



            (SELECT * FROM ORDERS 



            WHERE NAME = 'TRUE WHEEL') 



练习 



    应用 ORDERS 表来写一个查询 返回所以字母顺序

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的