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

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

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




     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 



分析 



    两表的共有字段是 PARTNUM             假如你不知道         或者是不想知道         这个字段      但是你 



又想用 PART 表的 description 字段来工作          这时可以使用子查询  语句如下 



    INPUT/OUTPUT 



    SELECT * FROM ORDERS WHERE PARTNUM = 



    (SELECT PARTNUM FROM PART WHERE DESCRIPTION LIKE 〃ROAD%〃) 



     ORDEREDON       NAME             PARTNUM       QUANTITY      REMARKS 



     19…MAY…1996      TRUE WHEEL      76            3             PAID 



     17…JAN…1996      BIKE SPEC       76            11            PAID 



     17…JAN…1996      LE SHOPPE       76            5             PAID 



     1…JUL…1996       AAA BIKE        76            4             PAID 



     11…JUL…1996      JACKS BIKE      76            14            PAID 



分析 



                                                                              139 


…………………………………………………………Page 140……………………………………………………………

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



    更进一步      如果你使用了在第六天中的概念                  你可以使 PARTNUM       列带有 



DESCRIPTION   这样就会使那些对 PARTNUM 还不太清楚的人看得更明白些                  如下例 



INPUT/OUTPUT 



SELECT O。ORDEREDON   O。PARTNUM   P。DESCRIPTION  O。QUANTITY   O。REMARKS 



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



AND O。PARTNUM =(SELECT PARTNUM FROM PART 



WHERE DESCRIPTION LIKE 〃ROAD%〃) 



   ORDEREDON     PARTNUM      DESCRIPTION   QUANTITY    REMARKS 



   19…MAY…1996   76           ROAD BIKE     3          PAID 



   1…JUL…1996    76           ROAD BIKE     4           PAID 



   17…JAN…1996   76           ROAD BIKE     5           PAID 



   17…JAN…1996   76           ROAD BIKE     11          PAID 



   11…JUL…1996   76           ROAD BIKE     14          PAID 



分析 



    查询的第一部分非常熟悉 



    SELECT O。ORDEREDON   O。PARTNUM   P。DESCRIPTION  O。QUANTITY 



    O。REMARKS FROM ORDERS O    PART P 



    这里使用了别名 O 和 P  来指定了在 ORDERS  和 PART  表中你所感兴趣的 5  列  对于 



你要访问的在两个表中的名字唯一的列别名是没有必要的  可是它可以使你的语句更具有 



可读性  你看到的第一个 WHERE 子句内容如下 



    WHERE O。PARTNUM = P。PARTNUM 



    它是将 ORDERS 与 PART 表进行归并的标准语句            如果你没有使用 WHERE 子句  那 



么你将会得到两个表的记录的所有可能的组合  接下来就是子查询语句                          内容如下 



AND O。PARTNUM =(SELECT PARTNUM FROM PART WHERE DESCRIPTION LIKE 〃ROAD%〃) 



增加的限制使你的 PARTNUM  内容必须与你的子查询所返回的结果相等  子查询则非常简 



单  它要求返回以 ROAD%相符的 PARTNUM            使用 LIKE  语句是一种懒人的办法          使得 



你不必键入 ROAD  BIKE     但是这只是你侥幸         如果在 PART   表中加入了一个新的记录名 



字为 ROADKILL 时呢  这时 PART 表的内容如下 



INPUT/OUTPUT 



    SELECT * FROM PART 



            PARTNUM     DESCRIPTION             PRICE 



                                                                     140 


…………………………………………………………Page 141……………………………………………………………

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



             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 



             77           ROADKILL                   7。99 



如果你没有觉察到这些改变而仍然使用原来的查询的话  你将会得到如下信息 



    multiple rows in singleton select 



你没有得到任何结果  SQL 的响应信息可能不会相同  但是你都会同样地得不到任何结果 



想知道为什么会有这样的结果  请想一个 SQL 引擎的处理规则  你需要重新核查一下你的 



子查询  请输入 



    INPUT/OUTPUT 



    SELECT PARTNUM FROM PART WHERE DESCRIPTION LIKE 〃ROAD%〃 



   PARTNUM 



   76 



   77 



    你会把这个结果赋给 O。PARTNUM =            就是这一步导致的错误 



分析 



    PARTNUM  怎么能同时匹配 76 和 77  呢  解释器一定会给你这样的信息的                       因为你是 



一个懒家伙       当你使用 LIKE     子句的时候       你就已经开始了犯错误的道路               如果你想使用 



比较运算符如》         (SELECT AVG(O。QUANTITY * P。PRICE) 



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



                                                                   142 


…………………………………………………………Page 143……………………………………………………………

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



                    NAME      ORDEREDON      TOTAL 



                 LE SHOPPE    1…JUN…1996   3600。00 



                 BIKE SPEC    30…MAY…1996  2803。60 



                 LE SHOPPE    17…JAN…1996  2650。00 



                 BIKE SPEC    17…JAN…1996  5830。00 



                 JACKS BIKE   11…JUL…1996  7420。00 



分析 



   在这个例子中的 SELECT/FROM/WHERE 子句的区别不太明显 



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



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



    这是归并两个表的常用方法          这种归并是必须的        因为单价在 PART    表上而数量则在 



ORDERS 表上 WHERE 子句用来检测相关性错误 指一个主关键字对应两条记录的情况 



之后则是子查询语句 



   AND 



   O。QUANTITY * P。PRICE》(SELECT AVG(O。QUANTITY * P。PRICE) 



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



    第一个比较表达式是将每一条记录的金额与子查询中的平均金额进行比较                          注意子查 



询中使用归并的原因与主查询是相同的               它严格地遵循着归并的语法          在子查询中没有什 



么秘密可言  它与单独的查询具有相同的语法格式                 事实上     大多数子查询都是作为独立 



查询经过测试确定其只返回一个值以后才作为子查询使用的 



子查询的嵌套 



    嵌套就是将一个子查询嵌入到另一个子查询中去  例如 



    Select * FROM SOMETHING WHERE ( SUBQUERY(SUBQUERY(SUBQUERY))) 



    子查询可被嵌套的深度依你的需要而定              例如   如果你想给那些花费超过了平均价格 



的客户发一个特别通知  你将会使用 CUSTOMERS 表中的如下信息 



INPUT 



    SELECT * FROM CUSTOMER 



OUTPUT 



                                                                   143 


…………………………………………………………Page 144……………………………………………………………

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



      NAME           ADDRESS        STATE      ZIP      PHONE     REMARKS 



  TRUE WHEEL       55O HUSKER        NE      58702     555…4545  NONE 



  BIKE SPEC        CPT SHRIVE        LA      45678     555…1234  NONE 



  LE SHOPPE        HOMETOWN          KS      54678     555…1278  NONE 



  AAA BIKE         10 OLDTOWN        NE      56784     555…3421  JOHN…MGR 



  JACKS BIKE       24 EGLIN          FL      34567     555…2314  NONE 



你只需要对上边你的查找定单的查询做一点改动即可 



INPUT/OUTPUT 



SELECT ALL C。NAME     C。ADDRESS    C。STATE   C。ZIP FROM CUSTOMER C 



WHERE C。NAME IN 



    (SELECT O。NAME FROM ORDERS O       PART P 



     WHERE O。PARTNUM = P。PARTNUM 



    AND 



    O。QUANTITY * P。PRICE》 (SELECT AVG(O。QUANTITY * P。PRICE) 



                                                    FROM  ORDERS  O PART P 



                                                    WHERE  O。PARTNUM  =  P。PARTNUM)) 



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