一直对T-SQL的聚合函数、group by、having“耿耿于怀",因为在使用它们的时候,我经常性的犯错误。
因此,现在将它们之间的一些小规则在此记录一下,以后碰到问题好查:
1、where与having的区别:
where 的查询条件是在分组之前进行的,换句话说:就是只能针对单行操作.因此,在它里面是不能有聚合函数的。
而having的查询条件是在分组之后进行的,也就是说,它可以针对多行记录操作,,而且,它里面可以使用聚合函数。
特别记注:聚合函数是针对多行操作的,这样一来,为什么where里不能有聚合函数就比较好理解了。
2、group by 与聚合函数
如果查询中包含一个聚合函数,而所选择的列并不在聚合函数中,那么这些列就必须在GROUP BY子句中。
这个想起来也明白:查询既试图使用聚合函数对多行记录进行操作,却又试图从每行中获得某一列的值;那这两个操作是不可能同时完成的。此时必须提供一个GROUP BY子句,然后数据库就可以将这些组中的行传递给聚合函数。
如 select a1,count(a2) from tbl
这时,将会报错,因为a1需要查询,但它不在聚合函数中,因此需要将它加入group by 中。
select a1,count(a2) from tbl group by a1
可以想象这样一个group by的流程:
引擎先从表中获取了符合条件的记录集,然后通过group by 来对相同(列)的多条记录归组(特别注意group by 意味着多条记录)。
group by 完成后的结果,就是原来的多条对应新的一条,但此时,a1仍然是原来的多条。
我们知道,sql一个单元格是不能放多行记录的,那怎么办呢?这就需要采取手段来将多行的a1给归并了,这件事,就是聚合函数干的。
这估计也是“聚合”的由来吧?
----- 终上,我总结,t-sql中,将多行搞成一行的手段包括:group by ,having ,聚合函数。。