zoukankan      html  css  js  c++  java
  • TSQL 聚合函数忽略NULL值

    max,min,sum,avg聚合函数会忽略null值,但不代表聚合函数不返回null值,如果表为空表,或聚合列都是null,则返回null。count 聚合函数忽略null值,如果聚合列都是null或表为空表,则返回0。

    共性:Null values are ignored.

    一,聚合函数忽略NULL值

    示例数据表

    create table dbo.ftip
    ( ID int)

    1,当表中没有任何数据时,聚合函数的返回值

    select max(ft.ID),min(ft.ID),sum(ft.ID),AVG(ft.ID),count(ft.ID)
    from dbo.ftip ft with(NOLOCK)

    2,当表中存在数据时,聚合函数对null值得处理

    2.1, 表中数据只有null

    insert into dbo.ftip
    values(null)
    select max(ft.ID),min(ft.ID),sum(ft.ID),AVG(ft.ID),count(ft.ID)
    from dbo.ftip ft with(NOLOCK)

     2.2 表中的数据含有null,也含有非null

    insert into dbo.ftip
    values(1)
    
    select max(ft.ID),min(ft.ID),sum(ft.ID),AVG(ft.ID),count(ft.ID)
    from dbo.ftip ft with(NOLOCK)

    3,count(*)或count(0)的特殊之处,不检查null值,返回分组的总行数

    select count(ft.ID),count(0),count(*)
    from dbo.ftip ft with(NOLOCK)

    4,在group by子句中,SQL Server 认为所有的null值是相同的,所有的null值分到同一个组中。

    select ft.ID,count(ft.ID),count(0),count(*),max(ft.ID),min(ft.ID),sum(ft.ID),AVG(ft.ID)
    from dbo.ftip ft with(NOLOCK)
    group by ft.ID

    5,聚合函数会忽略Null值,对非NULL的值进行聚合。

    insert into dbo.ftip
    values(2)
    
    select max(ft.ID),min(ft.ID),sum(ft.ID),AVG(ft.ID),count(ft.ID)
    from dbo.ftip ft with(NOLOCK)

    二,聚合函数Count的不同写法

    Count有三种写法:count(*),count(expression),count(column_name),计数说明:

    • Count(expression) ,count(column_name)计数的机制是:计算 expression,或表中column_name的值是否为NULL,如果为NULL则不计数,如果不是NULL则会计数;
    • count(*),返回表中行的数目。Specifies that all rows should be counted to return the total number of rows in a table,即使有null或duplicate value,也会计算在内;
    • 如果Expression或column_name的值不是null,count(expression),count(column_name)和count(*)返回的结果是相同的;

    1,创建示例数据

    create table dbo.test
    (id int)
    
    insert into dbo.test
    values(1),(2),(null)

    2,测试 count(expression)

    DECLARE @var int=null
    select count(@var) from dbo.test

    结果分析:返回的结果是0,原因是expression是null,count函数对null值不计数。

    3,测试count(0),count(*)

    select count(*), count(0) 
    from dbo.test

    结果分析:返回的结果都是3,说明count(*)计算表的行数,不排除null值或duplicate值。由于0是非null值,count(0)和count(*)执行结果是相同的。

    4,测试count(column_name)

    select count(id) 
    from dbo.test

    结果分析:返回的结果是2,从表中取出id值,如果为null,则不计数;如果不是null,则计数。

    参照文档:

    COUNT (Transact-SQL)

    Select count(*)和Count(1)的区别和执行方式

  • 相关阅读:
    win7系统如何一键清理系统垃圾【系统天地】
    win7无法正常关机的解决方法【系统天地】
    win10系统开机停在请稍候解决教程【系统天地】
    Win7系统一直提示盗版怎么办【系统天地】
    windows8 flash修复怎么操作【系统天地】
    win7电脑运行速度慢如何解决【系统天地】
    Win10系统如何自动清理垃圾缓存文件【系统天地】
    Win7启用NFS服务设置的方法【系统天地】
    win7系统获得管理员取得所有权的方法【系统天地】
    Ubuntu16.04+hadoop2.7.3环境搭建
  • 原文地址:https://www.cnblogs.com/wangsicongde/p/7551297.html
Copyright © 2011-2022 走看看