SQL-DML-分组数据(having区分where)、子查询(区分自联结)

分组使用的语句:group by…having…
1、Group by分组的作用:允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。用于结合聚集函数,根据一个或多个列对结果集进行分组
Group by x :意思是将所有具有相同X字段值的记录放到一个分组里。
Group by x,y:意思是将所有具有相同X字段值和Y字段值的记录放到一个分组
里。

2、给group by配套使用的过滤分组:having

  • having支持所有where操作符

  • where在数据分组前进行过滤,having在数据分组后进行过滤。Where排除的行不包括在分组中,这可能会改变计算值,从而影响having子句中基于这些值过滤掉的分组。

3、规定:

  • 在group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换言之,指定的所有列都一起计算,所以不能从个别的列取回数据。
  • group by子句中列出的每个列都必须是检索列或有效表达式(但不能是聚集函数)。若在select中使用表达式,必须在group by子句中指定相同的表达式,不能使用别名。
  • 除聚集计算语句外,select语句中的每个列都必须在group by子句中给出
  • 如果分组列中具有null值,则null将作为一个分组返回。如果列中有多行null值,他们将分为一组。
  • group by子句必须在where之后,order by之前
  • 使用with rollup可以得到每个分组及每个分组汇总级别(针对每个分组)的值

因此常见select语句格式汇总:
Select 列名称
from 表名称
(join…on…)
where 条件格式
group by 列名称
having 条件格式
order by 列名称
limit 行数
4、group by…having…、where、聚集函数等容易混淆的概念区分
解惑出处:https://blog.csdn.net/bluishglc/article/details/6011269#commentBox
我们知道,聚集函数也叫列函数,它们都是基于整列数据进行计算的。
而where子句是对数据行进行过滤的,在数据分组前进行,在筛选过程中不依赖(没有)已经筛选完毕的结果集。但是聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!而where子句还处于“确定”结果集的过程中,因而不能使用聚集函数,所以聚集函数不能出现在where子句中不能同时出现。
与where子句不能出现聚集函数正相反的是,我们几乎看不到不使用聚集函数的having子句(几乎每个聚集函数都要使用having子句)。为什么?因为having在数据分组后进行过滤,对数据行进行过滤,where子句可以独立完成,剩下的往往都是需要根据结果集自身的统计数据进一步筛选了,这时,几乎都需要通过having子句配合聚集函数来完成。
另外,对于having子句再多说一点:没有使用group by而直接使用having子句的例子是不太多见,因为如果没有group by,那么整个结果集就是一个分组,但是这种例子也不是没有,比如当我们需要对“现有的”整个结果集进行“二次筛选”时,就会直接使用having子句了。
例如:查询一个Forum最新的Post的SQL为
select p.*
from
Forum f
left join Thread t on f.id = t.forumId
left join Post p on t.id = p.threadId
where f.id = 2
having max(p.creationTime);
5、Select语句中子查询

  • 子查询总是从内向外处理
  • 子查询一般与in操作符结合使用,也可以用于其他操作符
  • 子查询的select语句不能使用order by子句,order by子句只能对最终查询结果排序
  • 子查询和自联结通常可以互相转换-具体可参见《SQL-DML-联结》
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值