T-SQL的一点小备忘

时间:2021-01-01 20:10:01

一直对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 ,聚合函数。。