首页 > 数据库 >SQL基础总结(五):汇总和分组数据

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

时间:2023-09-14 14:04:12浏览次数:45  
标签:COUNT 聚合 SQL 汇总 空值 分组 子句 WHERE


本系列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()聚合不重复的值。

对于SUM、AVG、COUNT,DISTINCT在计算总和、平均值或统计行数之前消除重复值。对于MIN和MAX,DISTINCT没有意义。

不能对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语法。

标签:COUNT,聚合,SQL,汇总,空值,分组,子句,WHERE
From: https://blog.51cto.com/u_6978506/7469727

相关文章

  • SQL基础总结(十一):视图
      本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------除了ORDERBY子句通常是被禁止的,几乎所有有效的SELECT语句都可以定义视图。可以嵌套视图,视图的SELECT语句......
  • SQL基础总结(九):插入更新删除行及创建更新删除表
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------插入更新删除行 使用INSERT插入行INSERTINTOtableVALUES(value1,value2,value3…);INSERTINTOtable(col......
  • SQL基础总结(八):集合操作
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------使用UNION合并行UNION操作将两个查询返回的结果合并成一个结果。UNION从结果中去掉重复的行,UNIONALL不去掉重......
  • SQL基础总结(十):索引
      本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------对于以下列创建索引是恰当的,这些列经常被:查询、排序、分组、联结、用来计算顺序统计(MIN、MAX或中值)。对于......
  • MySQL篇:bug2_ Navicate无法添加或更新子行-外键约束失败
    问题产生原因Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。解决办法解决方法是在Mysql中取消外键约束:SETFOREIGN_KEY_CHECKS=0;再添加值,然后再设置外键约束:SETFOREIGN_KEY_CHECKS=1;查看当前FOREIGN_KEY_CHECKS的值可用如下命令:SELECT@@FOR......
  • N天爆肝数据库——MySQL(2)
    (N天爆肝数据库——MySQL(2))链接:link这是csdn专栏链接,大家可以看一看,提提意见本篇文章,主要对DMLDQL进行知识总结和学习。期待和大家一起学习进步。DML-介绍DML(数据库操作语言),用来对数据库中表的数据记录进行增删改操作。添加数据(INSERT)修改数据(UPDATE)删除数据(DELET......
  • Citrix SQL数据库查询和替换修改字段
    1如下图,右键指定库新建查询即可2粘贴底部代码后,如下,点击执行查询即可--查看Citrix站点数据库如下表内容字段select*fromchb_config.Controllers;select*fromADIdentitySchema.Services;select*fromHostingUnitServiceSchema.Services;select*fromAppLibrarySchem......
  • freeswitch 编译安装问题汇总
    要编译,却没有configure文件,这是需要生成configure文件。按以下顺序执行命令即可生成configure文件。1.aclocal2.autoconf3.autoheader4.automake--add-missing5../configure6.make7.makeinstall项目https://github.com/kamalmostafa/minimodem就是这样的一个......
  • SQL Server关于AlwaysOn的理解-读写分离的误区(一)
    前言很多人认为AlwaysOn在同步提交模式下数据是实时同步的,也就是说在主副本写入数据后可以在辅助副本立即查询到。因此期望实现一个彻底的读写分离策略,即所有的写语句在主副本上,所有的只读语句分离到辅助副本上。这是一个认知误区,本文通过原理和测试进行解释。实现原理从下图......
  • oracle 分页 sql
    select*from(select*from(selectt.*,rownumlinenumfromgal_messagest)rwherer.linenum<200)awherea.linenum>100Note:一定要给rownum一个别名linenum,否则r.rownum或a.rownum会出错.OracleConnectBy用法参照:[url]http://www.cublog.cn/u1/54706/showart......