zoukankan      html  css  js  c++  java
  • [转载]查询之order by,group by和having的使用(二)

    四、GROUP BY...被附加于SQL是因为聚会函数(如SUM)每次都返回所有列值的合计,没有GROUP BY函数是不可能找到列值的单个分组的合计数。
    语法
    SELECT column,SUM(column) FROM table GROUP BY column

    -----------------------------------------------
    GROUP BY示例
    这个"Sales"表:

    Company     Amount
    W3Schools     5500
    IBM     4500
    W3Schools     7100

    和这个SQL语句:

    SELECT Company, SUM(Amount) FROM Sales

    返回这个结果:

    Company     SUM(Amount)
    W3Schools     17100
    IBM           17100
    W3Schools     17100

    上面的代码是不正确的,因为被返回的列不是部分合计。GROUP BY子句将解决这个问题。

    SELECT Company,SUM(Amount) FROM Sales            GROUP BY Company

    返回结果:

    Company     SUM(Amount)
    W3Schools     12600
    IBM     4500


     


    五、SQL Group by学习及相关应注意的地方
     
       在select语句中可以使用group by子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by子句可以将查询结果分组,并返回行的汇总信息Oracle按照group by子句中指定的表达式的值分组查询结果。

      在带有group by子句的查询语句中,在select列表中指定的列要么是group by子句中指定的列,要么包含聚组函数

       select max(sal),job emp group by job;
       (注意max(sal),job的job并非一定要出现,但有意义)

      查询语句的select和group by ,having子句是聚组函数唯一出现的地方,在where子句中不能使用聚组函数。

      select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;

     当在gropu by子句中使用having子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having与where子句类似,均用于设置限定条件
     
      where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
      having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。

     查询每个部门的每种职位的雇员数
      select deptno,job,count(*) from emp group by deptno,job;

    注意:

            group by不能对别名进行分组排序.举例如下:

    错误SQL:

    SELECT to_char(BASICROLL.ROLLDATE,'yyyy-mm') AS YEARDATE,

       DEPTDICT.CNNAME DEPTNAME,
        COUNT(BASICROLL.ID) AS PROJCOUNT

    FROM BASICROLL LEFT JOIN DEPTDICT ON BASICROLL.ARRDEPTDICTID=DEPTDICT.ID

    WHERE DEPTDICT.CNNAME <> '无'

    GROUP BY YEARDATE, DEPTDICT.CNNAME                      1
    ORDER BY YEARDATE DESC                                                  2

     作者原意是将记录按年月,部门进行分组.并倒序排序.但上面的GROUP BY因为用了别名,所以会提示SQL语法错误.如果将上面1,2二句改成:   

    GROUP BY BASICROLL.ROLLDATE, DEPTDICT.CNNAME                      3

    ORDER BY BASICROLL.ROLLDATE  DESC                                                4

    如上3,4二句,又会不合原意,因为BASICROLL.ROLLDATE 包括了年月日.这样分组得出的是按年月日来分组,而不是单纯的年月了.所以正确的SQL应该是这样的.

    正确的SQL

    SELECT to_char(BASICROLL.ROLLDATE,'yyyy-mm') AS YEARDATE,

       DEPTDICT.CNNAME DEPTNAME,
        COUNT(BASICROLL.ID) AS PROJCOUNT

    FROM BASICROLL LEFT JOIN DEPTDICT ON BASICROLL.ARRDEPTDICTID=DEPTDICT.ID

    WHERE DEPTDICT.CNNAME <> '无'

    GROUP BY to_char(BASICROLL.ROLLDATE,'yyyy-mm'), DEPTDICT.CNNAME                     

    ORDER BY to_char(BASICROLL.ROLLDATE,'yyyy-mm') DESC                                                 
    以上的注意部分为本人在项目开发过程中经验所得.
  • 相关阅读:
    洛谷—— P2234 [HNOI2002]营业额统计
    BZOJ——3555: [Ctsc2014]企鹅QQ
    CodeVs——T 4919 线段树练习4
    python(35)- 异常处理
    August 29th 2016 Week 36th Monday
    August 28th 2016 Week 36th Sunday
    August 27th 2016 Week 35th Saturday
    August 26th 2016 Week 35th Friday
    August 25th 2016 Week 35th Thursday
    August 24th 2016 Week 35th Wednesday
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7480913.html
Copyright © 2011-2022 走看看