关于group by 和having(数据库)

本文介绍了SQL语言中的GROUP BY和HAVING子句的应用方法。GROUP BY用于对数据进行分组,配合聚合函数如SUM和COUNT使用;HAVING则用于对分组后的数据进行筛选。文章通过具体示例解释了如何使用这两个子句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      在介绍GROUP BY 和 HAVING 子句前,先说说sql语言中一种特殊的函数:聚合函数,例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。

SELECT SUM(population) FROM bbc

 

  这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有国家的总人口数。

  通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值,也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值。

  HAVING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是作用在GROUP BY 子句和HAVING子句前.

  而 HAVING子句在聚合后对组记录进行筛选。

  需要注意的是:group by会把该组同名的数据合并输出。看下表(checks):

           CHECKNUM           PAYEE             AMOUNT            REMARKS
                1                     Ma Bell                150            Have sons next time
                2                   Reading R.R .        245.34           train to Chicago
                3                       Ma Bell              200.33           Cellular Phone
               16                       Cash                  25                Wild Night Out
               17                     Joans Gas            25.1                  Gas
                8                        Cash                    60                Trip to Boston
               21                       Cash                    34                Trip to Dayton
               25                     Joans Gas           15.75                Gas

   >SELECT PAYEE, SUM(AMOUNT), COUNT (PAYEE) FROM CHECKS
   >GROUP BY PAYEE;

     执行后结果为:

               PAYEE                               SUM                          COUNT
               Ma Bell                            350.34                          2

               Reading R.R .                    245.34                        1
                 Cash                                119                            3
                Joans Gas                       40.85                           2
    但是:当我们对多个列进行分组时,例如执行:

    >SELECT PAYEE, SUM(AMOUNT), COUNT (PAYEE) FROM CHECKS
    >GROUP BY PAYEE,REMARKS;

    结果又不一样,将不被合并输出,因为在REMARKS列中记录不同,不能被合并。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值