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                                                 
    以上的注意部分为本人在项目开发过程中经验所得.
  • 相关阅读:
    第42天:焦点图
    第41天:匀速、缓动运动和图片无缝滚动
    第40天:字符串操作:截取字符串
    MyBatis一级缓存(转载)
    Mycat 做简单的读写分离(转载)
    ui设计的好网站(转载)
    Java面试常问的问题(转载)
    ios学习的博客地址
    策略模式
    dubbo框架的简单介绍
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7480913.html
Copyright © 2011-2022 走看看