group by和having

1.Mysql中having和group by的用法

当sql语句中使用聚合函数,然后又需要对

聚合函数的记录集进行筛选过滤时,这个时候就需要用到having子句。如果是在聚合函数前过滤记录用where,在聚合函数后对组记录数据进行筛选就需要用到

having和group by组合。也可以换个角度理解,where是对真实表的数据进行过滤,而having是依赖于聚合函数生成的二维表数据进行过滤。

总结:where作用于表数据过滤,having作用于组数据过滤。where在分组和聚合之前选取数据,having在聚合和分组之后选取分组数据。

2、where、聚合函数、having在from后面的执行顺序

where > 聚合函数 > having

若需要对聚合函数对group by的结果进行过滤,只能使用having。Having语句通常与Group by语句联合使用,用来过滤Group by语句返回的结果集,having语句的存在弥补了where关键字不能与聚合函数联合使用的不足。

例如:查询平均成绩大于60分的同学的学号和平均成绩

select s_id, AVG(s_score) s_avg from Score group by s_id Having AVG(s_score) > 60;

如果将Having改成where 就会报错,因为where的执行顺序大于聚合函数。

例如:显示每个地区的总人口数和总面积.

SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region

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

  1. 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。

//在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,having子句可以让我们筛选成组后的各组数据

SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region HAVING SUM(area)>1000000

//先用group by 对email进行分组,在用having来过滤大于1的,这样查找出来的就是重复的记录了

select uid,email,count(*) as ct from `edm_user081217` GROUP BY email HAVING ct > 1

    • 使用where和from注意事项

where后不能跟聚合函数,因为where执行顺序大于聚合函数。

where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即“在分组之前进行过滤数据”,条件中不能包含聚合函数,使用where条件显示特定的行。

having子句的作用是筛选满足条件的组,即“在分组之后过滤数据”,条件中经常包含聚合函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值