SQL基础总结(五):汇总和分组数据

本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)

-------------------------

只对单个值进行操作的是标量函数。

对一组值进行操作以产生一个汇总值的是SQL聚合函数或集合函数。

可以对行的集合进行聚合,这些行可以是:

1. 表中所有的行。

2. 那些由Group by子句创建的行。

3. 那些由where子句指定的行。

 

筛选组使用Having子句。没有聚合的查询一行接一行的处理,聚合查询将表作为整体,并从中构造新行。

 

除了count(*)以外,所有聚合函数都将忽略空值,count(expr)count(*)绝对不会返回空值,而是返回一个正整数或零。

 

如果集合中没有行或者只有包含的行,其它的聚合函数将返回空值。

聚合表达式不能出现在WHERE子句里。

不能在SELECT子句中混合使用非聚合表达式和聚合表达式。

对于分组列可以混合使用非聚合表达式和聚合表达式。

不可以嵌套聚合函数。

不可以在聚合表达式中使用子查询,AVG(SELECT …)是非法的。

 

使用MIN()查找最小值。

 

使用MAX()查找最大值。

 

使用SUM()计算总和。

 

使用AVG()计算平均值,即算数平均值,等于集合中量的总和除以集合中量的个数。

如果一行没有,则平均值是空值,而不是设想的零。

不应该在SQL或宿主语言中自己编写统计程序。

 

使用COUNT()统计行数。

COUNT(expr)返回expr不为空的行数。

COUNT(*)返回集合中全部行的个数,包括空值和重复值。

 

使用DISTINCT()聚合不重复的值。

对于SUMAVGCOUNTDISTINCT在计算总和、平均值或统计行数之前消除重复值。对于MINMAXDISTINCT没有意义。

不能对COUNT(*)使用DISTINCT,但是可以用COUNT(DISTINCT expr)统计非空行的个数。

 

GROUP BY子句位于WHERE子句之后、ORDER BY子句之前。分组列可以是列名或派生列。输入表中的列无法出现在聚合查询的SELECT子句中,除非它们也被包含在group by子句中。

 

如果分组列包含多个空值,空值将被放进一个分组中。分组包含多个空值并不意味着空值彼此相等。

 

在包含GROUP BY子句的查询中使用WHERE子句,在分组前消除行。

不能在GROUP BY子句中使用列别名。

 

出现在columns中的非聚合列也必须出现在grouping_columns中。

 

COUNT(expr)统计非空值,而COUNT(*)统计包括空值在内的所有值。GROUP BY认可空值,并且为其创建一个空值分组。

 

使用WHERE子句将不想分组的行排斥在外,使用HAVING子句在分组后筛选行。

 

GROUP BY查询中,一个聚合函数返回多个值被称为矢量聚合,在缺少GROUP BY子句的查询中,一个聚合函数返回单个值被称为标量聚合。

 

应该为经常分组的列创建索引。

 

WHERE查询条件在分组产生以前就被应用,而HAVING搜索条件在分组产生之后才被应用。在分组前使用WHERE可以减少分组后的行数,因此更高效。

 

除了HAVING可以包含聚合函数以外,HAVING语法类似于WHERE语法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值