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

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

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

      15…MAY…1996     TRUE WHEEL        23          6 PAID 



      19…MAY…1996     TRUE WHEEL        76          3 PAID 



        2…SEP…1996    TRUE WHEEL        10          1 PAID 



      30…JUN…1996     TRUE WHEEL        42          8 PAID 



      30…JUN…1996     BIKE SPEC         54          10 PAID 



      30…MAY…1996     BIKE SPEC         10          2 PAID 



      30…MAY…1996     BIKE SPEC         23          8 PAID 



      17…JAN…1996     BIKE SPEC         76          11 PAID 



      17…JAN…1996     LE SHOPPE         76          5 PAID 



        1…JUN…1996    LE SHOPPE         10          3 PAID 



        1…JUN…1996    AAA BIKE          10          1 PAID 



        1…JUL…1996    AAA BIKE          76          4 PAID 



        1…JUL…1996    AAA BIKE          46          14 PAID 



      11…JUL…1996     JACKS BIKE        76          14 PAID 



    这样做的好处是你可以用三个专职人员或部门来维护属于他们自己的数据                                    你也无需 



与数据库管理员来套交情好让他看管你那庞大的                        多部门的数据库         另外的优点就是由于 



网路的发展  每个表都可以放在不同的机器上  所有它可以在适当的地点由对它的内部数 



据熟悉的人来进行维护            而不是像大型机那样需要一队的专家来进行维护 



    现在将 PARTS 表与 ORDERS 表进行联合 



    INPUT/OUTPUT 



    SELECT  O。ORDEREDON      O。NAME    O。PARTNUM    P。PARTNUM    P。DESCRIPTION 



    FROM    ORDERS    O  PART   P 



ORDEREDON       NAME             PARTNUM         PARTNUM         DESCRIPTION 



15…MAY…1996     TRUE WHEEL       23              54              PEDALS 



19…MAY…1996     TRUE WHEEL       76              54              PEDALS 



  2…SEP…1996    TRUE WHEEL       10              54              PEDALS 



30…JUN…1996     TRUE WHEEL       42              54              PEDALS 



                                                                             124 


…………………………………………………………Page 125……………………………………………………………

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



ORDEREDON     NAME           PARTNUM       PARTNUM       DESCRIPTION 



30…JUN…1996   BIKE SPEC     54             54            PEDALS 



30…MAY…1996   BIKE SPEC     10             54            PEDALS 



30…MAY…1996   BIKE SPEC     23             54            PEDALS 



17…JAN…1996   BIKE SPEC     76             54            PEDALS 



17…JAN…1996   LE SHOPPE     76             54            PEDALS 



  1…JUN…1996  LE SHOPPE     10             54            PEDALS 



  1…JUN…1996  AAA BIKE      10             54            PEDALS 



  1…JUL…1996  AAA BIKE      76             54            PEDALS 



  1…JUL…1996  AAA BIKE      46             54            PEDALS 



11…JUL…1996   JACKS BIKE    76             54            PEDALS 



分析 



    上表只是结果集的一部分          实际上记录数应该有 14        定单行数       6 零件行数  =84 



行  它与今天的早些时候 TABEL1  与 TABEL2  的联合类似  这条语句的结果仍然没有太大 



的用处  在我们对这种语句深入之前             我们先回想并讨论一下别名的问题 



正确地找到列 



    当你将 TABLE1 与 TABLE2 联合以后      你使用 SELECT *  来选择了表中的所有列  在 



联合表 ORDER 和 PART  时  SELECT 看起来不太好懂 



    SELECT O。ORDEREDON   O。NAME   O。PARTNUM   P。PARTNUM  P。DESCRIPTION 



    SQL 可以知道 ORDEREDON 和 NAME  是在 ORDER 表中而 DESCRIPTION  则存在于 



PART 表中  但是 PARTNUM     呢  它在两个表中都有啊         如果你想使用在两个表中都存在 



的列  你必须使用别名来说明你想要的是哪一列                 常用的办法为每一个表分配一个简单的 



字符   就像你在 FROM 子句中所做的那样 



    FROM  ORDERS   O  PART  P 



    你可以在每一列中都使用这个字符             就像你刚才在 SELECT      中所做的那样      SELECT 



子句也可以写成下边的形式 



    SELECT  ORDEREDON   NAME   O。PARTNUM   P。PARTNUM  DESCRIPTION 



    可是不要忘记  有时你会不得不回过头来对查询进行维护                    所以让它更具有可读性并 



没有什么害处  还是不要使用这种省略的形式吧 



                                                                   125 


…………………………………………………………Page 126……………………………………………………………

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



等值联合 



    下边的表是 ORDERS 与 PARTS 表的联合结果的片断               作为缺货的情况 



30…JUN…1996    TRUEWHEEL       42             54             PEDALS 



30…JUN…1996    BIKESPEC        54             54             PEDALS 



30…MAY…1996    BIKESPEC        10             54             PEDALS 



注意到 PARTNUM 是两个表的共有字段              如果输入如下的语句会有什么结果呢 



    INPUT 



    SELECT  O。ORDEREDON    O。NAME   O。PARTNUM    P。PARTNUM   P。DESCRIPTION 



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



    OUTPUT 



  ORDEREDON      NAME            PARTNUM     PARTNUM     DESCRIPTION 



  1…JUN…1996      AAA BIKE       10          10          TANDEM 



  30…MAY…1996     BIKE SPEC      10          10          TANDEM 



  2…SEP…1996      TRUE WHEEL     10          10          TANDEM 



  1…JUN…1996      LE SHOPPE      10          10          TANDEM 



  30…MAY…1996     BIKE SPEC      23          23          MOUNTAIN BIKE 



  15…MAY…1996     TRUE WHEEL     23          23          MOUNTAIN BIKE 



  30…JUN…1996     TRUE WHEEL     42          42          SEATS 



  1…JUL…1996      AAA BIKE       46          46          TIRES 



  30…JUN…1996     BIKE SPEC      54          54          PEDALS 



  1…JUL…1996      AAA BIKE       76          76          ROAD BIKE 



  17…JAN…1996     BIKE SPEC      76          76          ROAD BIKE 



  19…MAY…1996     TRUE WHEEL     76          76          ROAD BIKE 



  11…JUL…1996     JACKS BIKE     76          76          ROAD BIKE 



  17…JAN…1996     LE SHOPPE      76          76          ROAD BIKE 



分析 



    利用在两个表中都存在的 PARTNUM            列  我们得到了存储在 ORDERS          表中的的信息 



以及在 PARTS    中的与 ORDERS     相关的信息      它表明了你已经定出的零件数量              这种联合 



操作称为等值联合         因为它只显示第一个表中的数据以及第二个表中的  存在于第一个表 



中的数值 



    你也可以使用 WHERE 子句对其结果进行更大的限制  例如 



    INPUT/OUTPUT 



    SELECT  O。ORDEREDON    O。NAME   O。PARTNUM    P。PARTNUM   P。DESCRIPTION 



                                                                         126 


…………………………………………………………Page 127……………………………………………………………

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



    FROM   ORDERS    O  PARTP  WHERE    O。PARTNUM    P。PARTNUM 



    AND   O。PARTNUM=76 



ORDEREDON       NAME           PARTNUM         PARTNUMDES     DESCRIPTION 



1…JUL…1996      AAABIKE        76              76             ROADBIKE 



17…JAN…1996     BIKESPEC       76              76             ROADBIKE 



19…MAY…1996     TRUEWHEEL      76              76             ROADBIKE 



11…JUL…1996     JACKSBIKE      76              76             ROADBIKE 



17…JAN…1996     LESHOPPE       76              76             ROADBIKE 



    PARTNUM 为 76  的零件描述不是非常准确  你不想把它作为零件出售                      我们非常愦憾 



在发现在许多数据库系统中需要最终用户知道一些非常晦涩的代码                             而该代码所代表的东 



西原本就有着自己的           非常清楚明白的名字          请不要像他们那样做            这一行代码也可以 



写成如下方式 



    INPUT/OUTPUT 



    SELECT  O。ORDEREDON    O。NAME    O。PARTNUM    P。PARTNUM   P。DESCRIPTION 



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



    AND   P。DESCRIPTION     ROAD   BIKE 



ORDEREDON       NAME           PARTNUM         PARTNUMDES     DESCRIPTION 



1…JUL…1996      AAABIKE        76              76             ROADBIKE 



17…JAN…1996     BIKESPEC       76              76             ROADBIKE 



19…MAY…1996     TRUEWHEEL      76              76             ROADBIKE 



11…JUL…1996     JACKSBIKE      76              76             ROADBIKE 



17…JAN…1996     LESHOPPE       76              76             ROADBIKE 



    顺着这个思路        我们来看一下一个或多个表是如何进行联合的                        在下边的例子中 



employee_id 显然是唯一标识列        因为你可以有在同一个公司  有相同薪水并且他们的名字 



也相同的雇员  但是他们会各自拥有他们自己的 employee_id                   所以如果要对这两个表进行 



联合    我们应该使用 employee_id 列 



EMPLOYEE_TABLE                         EMPLOYEE_PAY_TABLE 



EMPLOYEE_ID                            EMPLOYEE_ID 



LAST _NAME                             SALARY 



FIRST _NAME                            DEPARTMENT 



MIDDLE_NAME                            SUPERVISOR 



                                       MARITAL_STATUS 



INPUT 



                                                                         127 


…………………………………………………………Page 128……………………………………………………………

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



SELECT E。EMPLOYEE_ID   E。LAST_NAME    EP。SALARY FROM EMPLOYEE_TBL E 



EMPLOYEE_PAY_TBL  EP    WHERE      E。EMPLOYEE_ID  =  EP。EMPLOYEE_ID 



AND E。LAST_NAME = 'SMITH'; 



OUTPUT 



E。EMPLOYEE_ID            E。LAST_NAME              EP。SALARY 



13245                    SMITH                    35000。00 



技巧    如果你在联合表的时候没有使用 WHERE             子句    你执行的其实是笛卡尔联合            也就 



     是笛卡尔叉积  这种联合会对 FROM  中指出的表进行完全的组合  如果每个表有 200 



     个记录的话      那么所得到的结果将会有 40000         行  200   200  这太大了  所以除非 



     你确实是想对表中的所有记录进行联合                否则一定不要忘记使用 WHERE 子句 



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



的工作了  找一下我们卖 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 



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