SQL 语句GROUP BY 和 HAVING

SQL GROUP BY与HAVING详解
本文详细介绍了SQL语言中的GROUP BY与HAVING子句的使用方法,包括如何利用聚合函数进行数据汇总,并通过HAVING子句对汇总后的数据进行过滤。
在介绍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 和 HAVING 子句。

SQL实例:

一、显示每个地区的总人口数和总面积: SELECT region, SUM(population), SUM(area)

FROM bbc

GROUP BY region


先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。

二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。 SELECT region, SUM(population), SUM(area)

FROM bbc

GROUP BY region

HAVING SUM(area)>1000000


在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。

相反,HAVING子句可以让我们筛选成组后的各组数据
http://meta.cnblogs.com
http://blog.youkuaiyun.com/metababy
=========
再附加一个经典的SQL技巧性文章

取n到m条记录的语句

1.
select   top   m   *   from   tablename   where   id   not   in   (select   top   n   id   from   tablename)

2.
select   top   m   *   into   临时表(或表变量)   from   tablename   order   by   columnname   --   将top   m笔插入
set   rowcount   n
select   *   from   表变量   order   by   columnname   desc

3.
select   top   n   *   from  
(select   top   m   *   from   tablename   order   by   columnname)   a
order   by   columnname   desc


4.如果tablename里没有其他identity列,那么:
select   identity(int)   id0,*   into   #temp   from   tablename

取n到m条的语句为:
select   *   from   #temp   where   id0   >=n   and   id0   <=   m

如果你在执行select   identity(int)   id0,*   into   #temp   from   tablename这条语句的时候报错,那是因为你的DB中间的select   into/bulkcopy属性没有打开要先执行:
exec   sp_dboption   你的DB名字, "select   into/bulkcopy ",true


5.如果表里有identity属性,那么简单:
select   *   from   tablename   where   identitycol   between   n   and   m  

 

比如一个表有100条记录怎么取其中的第30至第40条记录??
select   top   10   *   from   (selet   top   40   *   from   table)   order   by   id   desc 

### SQL中的HAVINGGROUP BY子句 #### GROUP BY 子句的作用 `GROUP BY` 子句用于将查询的结果集按照一个或多个列分组,通常与聚合函数一起使用来计算每组的数据汇总信息。例如,在订单表中按会员ID (`member_id`) 进行分组可以统计每位会员下的不同订单数量。 ```sql SELECT member_id, COUNT(DISTINCT order_id) AS distinct_order_count FROM orders GROUP BY member_id; ``` 此语句会返回每个 `member_id` 及其对应的唯一订单数[^2]。 #### HAVING 子句的功能 `HAVING` 子句用来过滤由 `GROUP BY` 创建的各组数据。它类似于 `WHERE` 子句,但是作用于已经完成分组后的记录集合上,并且可以在条件表达式里包含聚合函数。这意味着如果想要基于某个聚合结果设置筛选标准,则必须通过 `HAVING` 来实现而不是 `WHERE`。 考虑这样一个场景:找出至少有两次购买行为的不同客户列表: ```sql SELECT member_id FROM orders GROUP BY member_id HAVING COUNT(order_id) >= 2; ``` 上述命令先依据 `member_id` 对订单进行了分类处理并计数;接着利用 `HAVING` 设置了一个门槛——只有那些拥有两个及以上订单条目的成员才会被选入最终输出结果集中[^1]。 #### 主要差异对比 - **应用时机**:`WHERE` 是在执行任何分组操作之前应用于单个行上的条件判断;而 `HAVING` 则是在完成了分组之后针对整个组进行进一步的选择。 - **支持的操作**:由于 `HAVING` 处理的是经过分组后的数据,因此它可以安全地运用各种类型的聚合函数作为逻辑运算的一部分,这正是 `WHERE` 所不具备的能力之一。 - **性能考量**:当不需要做额外的过滤时仅需保留必要的 `GROUP BY`,因为引入不必要的 `HAVING` 或者复杂的组合可能会降低查询效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值