友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

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

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!





    现在回要原来的表中         我们已经对联合进行了充分的准备               可以用它来完成一些实际 



的工作了  找一下我们卖 road bikes 共卖了多少钱 



INPUT/OUTPUT 



SELECT SUM   O。QUANTITY * P。PRICE TOTAL  FROM ORDERS O; PART P 



WHERE O。PARTNUM = P。PARTNUM  AND P。DESCRIPTION = 'ROAD BIKE' 



      TOTAL 



      19610。00 



    在这种设置中       销售人员可以保证 ORDERS  表的更新           生产部门则可以保持 PART  表 



的更新  而你则无需对数据库的底层进行重新设计 



注  注意在 SQL 语句中表以及列的别名的使用  你可能会因为别名多按了许多许多个按键 



但是它可以让你的语句更具有可读性 



我们可以对更多的表进行联合吗  例如               我们需要生成发票所要的信息             可以这样写 



INPUT/OUTPUT 



SELECT C。NAME   C。ADDRESS    O。QUANTITY * P。PRICE TOTAL 



FROM ORDER O    PART P CUSTOMER C 



WHERE O。PARTNUM = P。PARTNUM AND O。NAME = C。NAME 



             NAME               ADDRESS           TOTAL 



             TRUE WHEEL         55O HUSKER         1200。00 



             BIKE SPEC          CPT SHRIVE        2400。00 



                                                                       128 


…………………………………………………………Page 129……………………………………………………………

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



               LE SHOPPE            HOMETOWN             3600。00 



               AAA BIKE             10 OLDTOWN           1200。00 



               TRUE WHEEL           55O HUSKER           2102。70 



               BIKE SPEC            CPT SHRIVE           2803。60 



               TRUE WHEEL           55O HUSKER           196。00 



               AAA BIKE             10 OLDTOWN          213。50 



               BIKE SPEC            CPT SHRIVE          542。50 



               TRUE WHEEL           55O HUSKER           1590。00 



               BIKE SPEC            CPT SHRIVE           5830。00 



               JACKS BIKE           24 EGLIN             7420。00 



               LE SHOPPE            HOMETOWN             2650。00 



               AAA BIKE             10 OLDTOWN           2120。00 



把语句写成如下格式会更具有可读性 



    INPUT/OUTPUT 



    SELECT C。NAME     C。ADDRESS     O。QUANTITY * P。PRICE TOTAL 



    FROM ORDERS O      PART P  CUSTOMER C 



    WHERE O。PARTNUM = P。PARTNUM 



                    AND  O。NAME  =  C。NAME      ORDER  BY  C。NAME 



                 NAME               ADDRESS             TOTAL 



                  AAA BIKE           10 OLDTOWN         213。50 



                  AAA BIKE           10 OLDTOWN        2120。00 



                  AAA BIKE           10 OLDTOWN        1200。00 



                  BIKE SPEC         CPT SHRIVE          542。50 



                  BIKE SPEC         CPT SHRIVE         2803。60 



                  BIKE SPEC         CPT SHRIVE         5830。00 



                  BIKE SPEC         CPT SHRIVE         2400。00 



                  JACKS BIKE        24 EGLIN           7420。00 



                  LE SHOPPE         HOMETOWN           2650。00 



                  LE SHOPPE         HOMETOWN           3600。00 



                  TRUE WHEEL        55O HUSKER          196。00 



                  TRUE WHEEL        55O HUSKER         2102。70 



                  TRUE WHEEL        55O HUSKER         1590。00 



                  TRUE WHEEL        55O HUSKER         1200。00 



    注   注意当将三个表进行联合的时候  ORDERS                   PART   CUSTOMER       ORDERS  表 



                                                                               129 


…………………………………………………………Page 130……………………………………………………………

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



被使用了两次  而其它的表只使用了一次                 通常    根据给定的条件返回行数最少的表会作 



为驱动表— — 也就是基表          在查询中除基表以外的其它表通常是向基表联合以便更有效地 



获得数据  所以  在本例中 ORDERS  表是基表             在大多数的数据库中只有很少的几个基表 



  直接或间接地       与其它的所有表联合          见第 15 天    高性能的 SQL 语句流    for more on 



base tables 。 



    在下边的使用中我们通过使用 DESCRIPTION             列来使上述的查询更精确           因而也就更 



有效 



INPUT/OUTPUT 



SELECT C。NAME   C。ADDRESS   O。QUANTITY * P。PRICE TOTAL  P。DESCRIPTION 



FROM ORDERS O    PART P  CUSTOMER C 



WHERE  O。PARTNUM=P。PARTNUM    AND  O。NAME  =  C。NAME    ORDER  BY  C。NAME 



         NAME           ADDRESS       TOTAL       DESCRIPTION 



         AAA BIKE       10 OLDTOWN    213。50    TIRES 



         AAA BIKE       10 OLDTOWN    2120。00   ROAD BIKE 



         AAA BIKE       10 OLDTOWN    1200。00   TANDEM 



         BIKE SPEC      CPT SHRIVE    542。50    PEDALS 



         BIKE SPEC      CPT SHRIVE    2803。60   MOUNTAIN BIKE 



         BIKE SPEC      CPT SHRIVE    5830。00   ROAD BIKE 



         BIKE SPEC      CPT SHRIVE    2400。00   TANDEM 



         JACKS BIKE     24 EGLIN      7420。00   ROAD BIKE 



         LE SHOPPE      HOMETOWN      2650。00   ROAD BIKE 



         LE SHOPPE      HOMETOWN      3600。00   TANDEM 



         TRUE WHEEL     55O HUSKER     196。00   SEATS 



         TRUE WHEEL     55O HUSKER    2102。70   MOUNTAIN BIKE 



         TRUE WHEEL     55O HUSKER    1590。00   ROAD BIKE 



         TRUE WHEEL     55O HUSKER    1200。00   TANDEM 



分析 



    这是三个表联合后的结果           我们可以所得到的信息来开发票了 



注  在今天的开始 SQL       曾经联合过 TABEL1  和 TABEL2  并生成了一个新表有 X(TABLE1 



   的行数)    Y(TABLE2  的行数)列  联合并没有生成确实存在的表格  但它生成了一个虚 



   拟的表格  对两个表联合           包括自我联合       后会根据 WHERE      所指定的条件生成一个 



   新的集合      SELECT 语句减少了显示的列数  但是 WHERE             语句仍然把所有的列全返 



   回了  在今天的例子中我们的表中只有为数不多的几列                       而现实生活中的数据可能会 



                                                                       130 


…………………………………………………………Page 131……………………………………………………………

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



   有成千上万列         如果你所使用的平台足够快  那么多表联合可能对系统的性能没有影 



    响  可是如果你工作在一个比较慢的平台上  联合可能会导致死机 



不等值联合 



    既然 SQL 支持等值联合          你也许会推想它也支持不等值联合                 你猜对了      等值联合是 



在 WHERE  子句中使用等号          而不等值联合则是在 WHERE  子句中使用除了等号以外的其 



它比较运算符        现下例 



INPUT 



SELECT O。NAME     O。PARTNUM    P。PARTNUM    O。QUANTITY * P。PRICE TOTAL 



FROM ORDERS O     PART P WHERE O。PARTNUM 》 P。PARTNUM 



OUTPUT 



             NAME             PARTNUM      PARTNUM       TOTAL 



             TRUE WHEEL       76           54            162。75 



             BIKE SPEC        76           54            596。75 



             LE SHOPPE        76           54            271。25 



             AAA BIKE         76           54            217。00 



             JACKS BIKE       76           54            759。50 



             TRUE WHEEL       76           42            73。50 



             BIKE SPEC        54           42            245。00 



             BIKE SPEC        76           42            269。50 



             LE SHOPPE        76           42            122。50 



             AAA BIKE         76           42            98。00 



             AAA BIKE         46           42            343。00 



             JACKS BIKE       76           42            343。00 



             TRUE WHEEL       76           46            45。75 



             BIKE SPEC        54           46            152。50 



             BIKE SPEC        76           46            167。75 



             LE SHOPPE        76           46            76。25 



             AAA BIKE         76           46            61。00 



             JACKS BIKE       76           46            213。50 



             TRUE WHEEL       76           23            1051。35 



             TRUE WHEEL       42           23            2803。60 



分析 



    上边的表给出了满足条件 WHERE O。PARTNUM 》 P。PARTNUM 的所有联合内容  结合 



                                                                            131 


…………………………………………………………Page 132……………………………………………………………

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



你上边的自行车行的例子  这些信息似乎没有太多的意义  在现实世界中等值联合的使用 



要远远多于不等值联合  但是你的编程时可能会遇到使用不等值联合的情况 



外部联合与内部联合 



    就像不等值联合与等值联合相对应一样              外部联合是与内部联合相对应的             内部联合 



是指与个表内的行与本表内的数据相互进行联合  产生的结果行数取决于参加联合的行数 



也就是说内部联合的行数取决于 WHERE            子句的结果      外部联合则是表间的联合  如上例 



中的 ORDERS 表与 PART 表的联合       内部联合的例子如下 



INPUT 



SELECT P。PARTNUM  P。DESCRIPTION P。PRICE O。NAME   O。PARTNUM 



FROM PART P  JOIN ORDERS O ON ORDERS。PARTNUM = 54 



OUTPUT 



     PARTNUM     DESCRIPTION     PRICE   NAME         PARTNUM 



     54          PEDALS          54。25   BIKESPEC     54 



     42          SEATS           24。50   BIKESPEC     54 



     46          TIRES           15。25   BIKESPEC     54 



     23          MOUNTAIN BIKE   350。45  BIKESPEC     54 



     76          ROAD BIKE       530。00  BIKESPEC     54 



      10         TANDEM          1200。00 BIKESPEC     54 



注  在这里你使用的语法中的 JOIN  ON  不是 ANSI  标准中所指定的            而是我们所使用的解 



释器的附加语法       你可以用它来指明是内部联合还是外部联合                大多数解释器对些都进行 



了类似的扩充  注意这种类型的联合没有 WHERE 子句 



分析 



    结果表明 PART   表中的所有的行都与 PARTNUM  为 54       的行进行了组合  再来看一个 



外部右联合的例子 



INPUT/OUTPUT 



SELECT P。PARTNUM  P。DESCRIPTION P。PRICE O。NAME  O。PARTNUM  FROM PART P 



RIGHT OUTER JOIN ORDERS O ON ORDERS。PARTNUM = 54 



  PARTNUM     DESCRIPTION        PRICE    NAME              PARTNUM 



                                                                  132 


…………………………………………………………Page 133……………………………………………………………

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



   PARTNUM        DESCRIPTION               PRICE      NAME                    PARTNUM 



                                     TRUE      WHEEL          23 



                                     TRUE      WHEEL          76 



                                     TRUE      WHEEL          10 



                                     TRUE      WHEEL          42 



   54             PEDALS                    54。25      BIKE        SPEC         54 



   42             SEATS                     24。50      BIKE        SPEC         54 



   46             TIRES                     15。25      BIKE        SPEC         54 



   23             MOUNTAIN BIKE             350。45     BIKE        SPEC         54 



   76             ROAD BIKE                 530。00     BIKE        SPEC         54 



   10             TANDEM                    1200。00    BIKE        SPEC         54 



                                     BIKE        SPEC         10 



                                     BIKE        SPEC         23 



                                     BIKE        SPEC         76 



                                     LE            SHOPPE     76 



                                     LE            SHOPPE     10 



                                     AAA        BIKE          10 



                                     AAA        BIKE          76 



                                     AAA        BIKE          46 



                                     JACKS    BIKE            76 



分析 



     这是一种新型的查询              这里我们第一次使用了 RIGHT  OUTER  JOIN                   它会令 SQL  返 



回右边表集内的全部记录                 如果当 ORDERS。PARTNUM54             则补以空值         下边是一个左 



联合的例子 



INPUT/OUTPUT: 



SELECT P。PARTNUM        P。DESCRIPTION      P。PRICE   O。NAME     O。PARTNUM 



FROM PART P LEFT OUTER JOIN ORDERS O ON ORDERS。PARTNUM = 54 



        PARTNUM        DESCRIPTION          PRICE       NAME            PARTNUM 



        54               PEDALS              54。25      BIKE SPEC       54 



        42             SEATS                 24。50      BIKE SPEC       54 



        46             TIRES                 15。25      BIKE SPEC       54 



        23             MOUNTAIN BIKE        350。45      BIKE SPEC       54 



        76             ROAD BIKE            530。00      BIKE SPEC       54 



        10             TANDEM                1200。00    BIKE SPEC       54 



分析 



                                                                                        133 


…………………………………………………………Page 134……………………………………………………………

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



    与内部联合的结果一样            都是六行      因为你使用的是左联合  PART            表决定返回的行 



数  而 PART 表比 ORDERS 表小        所以 SQL 把其余的行数都扔掉了 



    不要对内部联合和外部联合操太多的心  大多数的 SQL 产品会判断应该在你的查询中 



使用哪一种联合         事实上  如果你在过程中使用它               或在程序内使用这          包括存储过程和 



将在第 13 天提到的        高级 SQL 使用         你无需指明联合类型  解释器会为你选择合适的 



语法形式      如果你指明的联合类型  解释器会用你指明的类型来代替优化的类型 



    在一些解释器中使用+号来代替外部联合                   +号的意思就是— — 显示我的全部内容包括 



不匹配的内容  语法如下 



    SYNTAX 



    SQL》 select e。name e。employee_id ep。salary ep。marital_status from e;ployee_tbl e; 



              employee_pay_tbl  ep 



         where e。employee_id = ep。employee_id(+) and e。name like '%MITH' 



分析 



    这条语句将会联合两个表             标有+号的 employee_id   将会全部显示        包括不满足条件的 



记录 



表的自我联合 



    今天的最后一个内容是经常使用的自我联合  它的语法与联合两个表的语法相似                                    例 



如  表 1 的自我联合可以写成如下格式 



    INPUT 



    SELECT  *    FROM  TABLE1 TABLE1 



    OUTPUT 



             
返回目录 上一页 下一页 回到顶部 9 9
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!