由于之前一直是做的大数据相关的产品的开发,对SQL方面的要求又高了很多,之前做项目的时候,涉及到SQL方面的知识就只有CURD操作,也就是创建(Create)、更新(Update)、读取(Read)和删除(Delete)操作,现在我的上司要求我将更多的逻辑处理和操作放到SQL里面进行处理,所以现在对子查询、分组、关联等的理解就加深了点,为了能记住这些,并加深自己的理解,后面的一段时间我会将自己的一些笔记进行整理并分享出来。
首先说下分组
分组是将查询出来的结果集分成若干个小区域,然后对每个小区域进行数据处理
下面是一张原始数据表
经过Group By处理后
select 类别,sum(数量) as 数量之和名称 from A group by 类别
返回的结果如下表,实际上就是分类汇总的结果。
注意点:
1、在select指定的字段要么就要包含在group by语句的后面,作为分组的依据,要么就要包含在聚合函数中(在存在聚合函数时,需要用到group by),至于聚合函数这块,留到以后再做详解
2、where和having的基本区别,因为做分组时,不可避免的要和where还有having打交道,所以这块要先做下区分。where在分组和聚集计算之前选取输入行(它控制哪些行进入聚集计算),而having在分组和聚集之后选取输入行。因此,where子句不能包含聚集函数,因为试图用聚集函数判断那些行将要输入给聚集运算是没有意义的,相反,having子句总是包含聚集函数。
Group By All
select 类别, 摘要, sum(数量) as 数量之和from Agroup by all 类别, 摘要
指定“摘要”字段,其原因在于“多列分组”中包含了“摘要字段”,其执行结果如下表
“多列分组”实际上就是就是按照多列(类别+摘要)合并后的值进行分组,示例4中可以看到“a, a2001, 13”为“a, a2001, 11”和“a, a2001, 2”两条记录的合并。
SQL Server中虽然支持“group by all”,但Microsoft SQL Server 的未来版本中将删除 GROUP BY ALL,避免在新的开发工作中使用 GROUP BY ALL。Access中是不支持“Group By All”的,但Access中同样支持多列分组,上述SQL Server中的SQL在Access可以写成
select 类别, 摘要, sum(数量) AS 数量之和from Agroup by 类别, 摘要