group by的使用说明

系统 1430 0

 

SQL HAVING 出现的原因

  在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

SQL HAVING 语法

      
        SELECT
      
      
         column_name, aggregate_function(column_name)


      
      
        FROM
      
      
         table_name


      
      
        WHERE
      
      
         column_name operator value


      
      
        GROUP
      
      
        BY
      
      
         column_name


      
      
        HAVING
      
       aggregate_function(column_name) operator value
    

SQL HAVING 实例

我们拥有下面这个 "Orders" 表:

O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter

现在,我们希望查找订单总金额少于 2000 的客户。

我们使用如下 SQL 语句:

      
        SELECT
      
       Customer,
      
        SUM
      
      (OrderPrice) 
      
        FROM
      
      
         Orders


      
      
        GROUP
      
      
        BY
      
      
         Customer


      
      
        HAVING
      
      
        SUM
      
      (OrderPrice)
      
        <
      
      
        2000
      
    

结果集类似:

Customer SUM(OrderPrice)
Carter 1700

现在我们希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额。

我们在 SQL 语句中增加了一个普通的 WHERE 子句:

      
        SELECT
      
       Customer,
      
        SUM
      
      (OrderPrice) 
      
        FROM
      
      
         Orders


      
      
        WHERE
      
       Customer
      
        =
      
      
        '
      
      
        Bush
      
      
        '
      
      
        OR
      
       Customer
      
        =
      
      
        '
      
      
        Adams
      
      
        '
      
      
        GROUP
      
      
        BY
      
      
         Customer


      
      
        HAVING
      
      
        SUM
      
      (OrderPrice)
      
        >
      
      
        1500
      
    

结果集:

Customer SUM(OrderPrice)
Bush 2000
Adams 2000

 


  在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;
    

 

如果你对何时应该使用WHERE,何时使用HAVING仍旧很迷惑,请遵照下面的说明:  

  WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。 

  HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。

 

PS: 因为我遇到了这个问题,现在已经解决了,所以还是记录哈。

 

group by的使用说明


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论