zoukankan      html  css  js  c++  java
  • TSQL的一点小备忘

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


      

  • 相关阅读:
    python实例
    date命令
    unbuntu禁用ipv6
    Oracle学习(一)
    深入浅出区块链笔记
    sqlserver索引
    Go学习(16):网络编程
    Go学习(15):并发与包
    Go学习(14):defer
    Go学习(13):异常
  • 原文地址:https://www.cnblogs.com/McJeremy/p/1611435.html
Copyright © 2011-2022 走看看