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

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

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






     Local Utilities                          1 



     Local Utilities                          1 



     Local Utilities                          1 



     Ma Bell                                  1 



     Ma Bell                                  1 



     Reading R。R                              1 



分析 



    这个愚蠢的查询显示的记录与你在表中输入的记录数一样多  这表明你可以在 GROUP 



BY 中使用 AMOUNT          尽管在 SELECT  中没有提到过该字段  现在试着将 AMOUNT  字段 



从 GROUN 部分移动到 SELECT 部分               如下例 



     SELECT   PAYEE    AMOUNT      COUNT     AMOUNT      FROM    CHECKS    GROUP     BY 



PAYEE 



    Dynamic SQL Error 



    …SQL error code = …104 



    …invalid column reference 



SQL 不能运行查询           因为在 SELECT      中出现的字段没有在 GROUP  BY  中指出  所以我们 



不得不采用下边的方法进行分组 



    INPUT/OUTPUT 



     SELECT    PAYEE    AMOUNT      REMARKS      FROM    CHECKS     WHERE      PAYEE 



  Cash 



                PAYEE           AMOUNT           REMARKS 



                Cash            25               Wild Night Out 



                Cash            60               Trip to Boston 



                Cash            34               Trip to Dayton 



     如果你的用户要求你将这三行数据输出并按 PAYEE 进行分组的话                                 那么请问数据并不 



重复的 REMARKS  字段的内容应该放在哪里  切记                        当进行分组以后由于这三行数据是同 



一组  所以结果只有一行  SQL 无法在同时为你做两种工作  所以它会说  Error #31                                   Can't 



do two things at once。 



EMAIL   wyhsillypig@163。                                                          110 


…………………………………………………………Page 111……………………………………………………………

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



HAVING 子句 



如何对你需要进行分组的数据进行限制呢  这里我们使用 ORGCHART  表                            内容如下 



    INPUT 



    SELECT   *  FROM    ORGCHART 



    OUTPUT 



 NAME             TEAM             SALARY       SICKLEAVE     ANNUALLEAVE 



 ADAMS            RESEARCH           34000。00             34                12 



 WILKES           MARKETING          31000。00             40                 9 



 STOKES           MARKETING          36000。00             20                19 



 MEZA             COLLECTIONS        40000。00             30                27 



 MERRICK          RESEARCH           45000。00             20                17 



 RICHARDSON       MARKETING          42000。00             25                18 



 FURY             COLLECTIONS        35000。00             22                14 



 PRECOURT         PR                 37500。00             24                24 



    如果你想对输出的结果进行分组并显示每一组的平均工资  你可以输入如下语句 



    INPUT/OUTPUT 



    SELECT   TEAM    AVG   SALARY    FROM   ORGCHART     GROUP    BY   TEAM 



                        TEAM               AVG 



                        COLLECTIONS        37500。00 



                        MARKETING          36333。33 



                        PR                 37500。00 



                        RESEARCH           39500。00 



    下边的这条语句的目的是返回分组后平均工资低于 38000 的组 



    INPUT/OUTPUT 



    SELECT   TEAM    AVG   SALARY      FROM   ORGCHART 



    WHERE    AVG   SALARY      38000  GROUP    BY  TEAM 



    Dynamic SQL Error 



    …SQL error code = …104 



    …Invalid aggregate reference 



分析 



EMAIL  wyhsillypig@163。                                                  111 


…………………………………………………………Page 112……………………………………………………………

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



    错误产生的原因是由于汇总函数不能工作在 WHERE                子句中    如果想要让这个查询工 



作的话    我们需要一些新东西――HAVING  子句            输入下边的查询就会得到你想要的结果 



了 



INPUT/OUTPUT 



SELECT  TEAM   AVG  SALARY   FROM   ORGCHART   GROUP   BY  TEAM 



HAVING  AVG   SALARY    38000 



                     TEAM              AVG 



                     COLLECTIONS       37500。00 



                     MARKETING         36333。33 



                     PR                37500。00 



分析 



    HAVING 子句允许你将汇总函数作为条件  但是如果 HAVING 后边没有汇总函数时会 



有什么结果呢  看下例 



    INPUT/OUTPUT 



    SELECT  TEAM  AVG   SALARY  FROM   ORGCHART    GROUP  BY   TEAM 



    HAVING  SALARY   38000 



             TEAM                 AVG 



             PR                   37500。00 



分析 



  为什么这一次的结果与上一次的不同  子句 HAVING  AVG(SALARY)  《  38000  是对每一 



组的 SALARY  求平均数并将数值大于 38000         的组返回  正像你所想到的那样            HAVING 



SALARY  《  38000 则是用另外一种处理方式  所以就会有不同的结果               根据 SQL 的解释规 



则  如果用户要求对分组数据执行 HAVING  SALARY  《  38000         它么它会对数据库中的每 



个记录均进行检查        并且剔除 SALARY 大于 38000  的  这样的话就只有 PR 符合条件了 



在其它组中都至少有一条 SALARY 大于 38000          的记录     并不是所有的解释器都执行这条 



语句  ACCESS 就不能— — 译者 



    INPUT/OUTPUT 



    SELECT  NAME   TEAM  SALARY   FROM   ORGCHART   ORDER   BY  TEAM 



           NAME            TEAM             SALARY 



           FURY            COLLECTIONS      35000。00 



           MEZA            COLLECTIONS      40000。00 



EMAIL wyhsillypig@163。                                          112 


…………………………………………………………Page 113……………………………………………………………

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



           WILKES         MARKETING         31000。00 



           STOKES         MARKETING         36000。00 



           RICHARDSON     MARKETING         42000。00 



           PRECOURT       PR                37500。00 



           ADAMS          RESEARCH          34000。00 



           MERRICK        RESEARCH          45000。00 



    分析 



    结果就是除了 PR       外所有的组都被剔除了           事实上你的要求是返回组中内容 



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