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

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

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





         17              Joans Gas          25。1       Gas 



         9              Abes Cleaners       24。35      X…Tra Starch 



         20             Abes Cleaners       10。5       All Dry Clean 



         8               Cash               60         Trip to Boston 



         21              Cash               34         Trip to Dayton 



         30              Local Utilities    87。5       Water 



         31              Local Utilities    34         Sewer 



         25              Joans Gas          15。75      Gas 



你会输入如下语句 



    INPUT/OUTPUT 



    SELECT    SUM    AMOUNT     FROM    CHECKS 



                                    SUM 



                                    1159。87 



分析 



    这条语句返回了对 AMOUNT             列的合计结果  可是如果你想知道的是对每一个 PAYEE 



花了多少钱时又该怎么办呢                使用 GROUP  BY  语句可以帮助你  对本例它的使用方法如 



下 



    INPUT/OUTPUT 



    SELECT    PAYEE    SUM   AMOUNT      FROM    CHECKS    GROUP     BY   PAYEE 



                       PAYEE              SUM 



EMAIL   wyhsillypig@163。                                                      106 


…………………………………………………………Page 107……………………………………………………………

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



                       Abes Cleaners       34。849998 



                       Cash                119 



                       Joans Gas           40。849998 



                       Joes Stale  Dent   150 



                       Local Utilities     219。5 



                       Ma Bell             350。33002 



                       Reading R。R         。245。34 



    SELECT    子句有一个正常的列              之后是一个汇总函数              如果它的后边只有 FROM 



CHECKS 子句的话  那么你将会看到 



    INPUT/OUTPUT 



    SELECT    PAYEE    SUM    AMOUNT      FROM    CHECKS 



    Dynamic    SQL   Error 



    …SQL error code = …104 



    …invalid column reference 



分析 



    该信息表明 SQL  无法把正常的列和汇总函数结合在一起  这时就需要 GROUP  BY 子 



句 它可以对 SELECT  的结果进行分组后在应用汇总函数 查询 SELECT * FROM CHECKS 



返回了 14 行  而 SELECT         PAYEE    SUM    AMOUNT     FROM    CHECKS     GROUP     BY 



PAYEE    则把返回的 14 行分成了 7 组  然后对每组应用了汇总函数 



    INPUT/OUTPUT 



    SELECT    PAYEE    SUM    AMOUNT       COUNT    PAYEE    FROM     CHECKS 



    GROUP     BY   PAYEE 



              PAYEE                   SUM                 COUNT 



              Abes Cleaners           34。849998           2 



              Cash                    119                 3 



              Joans Gas               40。849998           2 



              Joes Stale  Dent       150                 1 



              Local Utilities         219。5               3 



              Ma Bell                 350。33002           2 



              Reading R。R             。245。34             1 



分析 



    SQL  现在越来越变得有用了  在上一个例子中                       我们只是应用 GROUP  BY  对数据结 



果进行了唯一的分组  注意结果是按 PAYEE 排序的  GROUP  BY 也可以像 ORDER  BY 那 



EMAIL   wyhsillypig@163。                                                        107 


…………………………………………………………Page 108……………………………………………………………

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



样工作     如果我们对多个列进行分组会有什么结果呢  请看 



    INPUT/OUTPUT 



    SELECT    PAYEE   SUM    AMOUNT      COUNT    PAYEE   FROM    CHECKS 



    GROUP    BY   PAYEE   REMARKS 



                   PAYEE               SUM           COUNT 



                   Abes Cleaners       10。5          1 



                   Abes Cleaners       24。35         1 



                   Cash                60            1 



                   Cash                34            1 



                   Cash                25            1 



                   Joans Gas           40。849998     2 



                   Joes Stale  Dent   150           1 



                   Local Utilities     98            1 



                   Local Utilities     34            1 



                   Local Utilities     87。5          1 



                   Ma Bell             200。33        1 



                   Ma Bell             150           1 



                   Reading R。R         。245。34       1 



分析 



    输出结果由原来的将 14 行分成 7 组变成了 13 组                   为什么它会多出了这么多组呢  我 



们来看一下 



    INPUT/OUTPUT 



    SELECT    PAYEE   REMARKS     FROM    CHECKS    WHERE    PAYEE     Joans Gas 



                          PAYEE         REMARKS 



                          Joans Gas     Gas 



                          Joans Gas     Gas 



分析 



    你可以看到这两个记录的内容是完全一样的  所以在运行 GROUP BY 以后把它们合并 



成了一个记录  而其它行则是唯一的  所以合并以后仍然是唯一的 



    下例是对 REMARKS 进行分组并找出组中的最大值和最小值 



    INPUT/OUTPUT 



    SELECT    MIN   AMOUNT       MAX    AMOUNT     FROM    CHECKS     GROUP    BY 



REMARKS 



EMAIL  wyhsillypig@163。                                                     108 


…………………………………………………………Page 109……………………………………………………………

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



                            MIN            MAX 



                            245。34         245。34 



                             10。5           10。5 



                            200。33         200。33 



                             15。75          98 



                             150            150 



                             150            150 



                             34             34 



                             60             60 



                             34             34 



                             87。5           87。5 



                            25             25 



                            24。35          24。35 



    如果我们在分组时指定的列名与 SELECT                   中所指定的列名不相同时会有什么情况发生 



呢 



    INPUT/OUTPUT 



    SELECT    PAYEE    MAX    AMOUNT       MIN   AMOUNT     FROM     CHECKS 



    GROUP     BY   REMARKS 



    Dynamic   SQL   Error 



    …SQL error code = …104 



    …invalid column reference 



分析 



    查询无法对 REMARK 进行分组                当查询在 REMARK  字段中找到了两个重复的数值 



但它们的 PAYEE 不同  这表明 GAS 有两个 PAYEE                  这将会导致错误的产生 



    规则是      当要求分组结果返回多个数值时不能在在 SELECT                       子句中使用除分组列以外 



的列  这将会导致错误的返回值                 你可以使用在 SELECT  中未列出的列进行分组  例如 



    INPUT/OUTPUT 



    SELECT    PAYEE    COUNT    AMOUNT        FROM    CHECKS 



    GROUP BY PAYEE; AMOUNT; 



    PAYEE                                   COUNT 



    Abes Cleaners                           1 



    Abes Cleaners                           1 



    Cash                                    1 



EMAIL   wyhsillypig@163。                                                       109 


…………………………………………………………Page 110……………………………………………………………

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



     Cash                                     1 



     Cash                                     1 



     Joans Gas                                1 



     Joans Gas                                1 



     Joes Stale  Dent                        1 



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