• COUNT(*),count(1),COUNT(ALL expression),COUNT(DISTINCT expression)


    创建一个测试表

     1 IF OBJECT_ID( 'dbo.T1' , 'U'
     2             )IS NOT NULL
     3     BEGIN
     4         DROP TABLE dbo.T1;
     5     END;
     6 GO
     7 CREATE TABLE dbo.T1( column_1 int ,column_2 varchar(30));
     8 GO
     9 
    10 
    11 INSERT INTO dbo.T1( column_1 , column_2                 )
    12 VALUES( 1 , '123') , ( 2 , '1234') , ( 3 , '12345');
    13 
    14 INSERT INTO dbo.T1( column_1)
    15 VALUES(1) , (2);
    16 
    17 INSERT INTO dbo.T1( column_2)
    18 VALUES( '1234');
    19 
    20 GO
    21 SELECT *
    22   FROM dbo.T1; 
    23 GO


    使用各种count的方式对比结果(注意只是结果,不考虑性能,以及增加索引对于性能的影响

    关于下面两者性能的对比:

    SQLSERVER 里SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好?

    1 SELECT COUNT(*)AS 'count(*)', COUNT(1)AS 'count(1)' , COUNT( column_1)AS column_1 , COUNT( DISTINCT column_1) AS column_1DISTINCT
    2     FROM dbo.T1;
    3  SELECT * FROM dbo.T1;

    count(*) count(1) column_1 column_1DISTINCT
    6 6 5 3

    可以看到count(*) 和count(1)在结果上是一致的,都是包含NULL值合计。

    COUNT(ALL expression) 即 COUNT( column_1),为非NULL值得合计

    COUNT(DISTINCT expression) 即 COUNT( DISTINCT column_1), 去除重复值,去除NULL后的合计结果

    可以等同于以下写法

    1 WITH groupby_CTE( columngroup)
    2     AS (SELECT DISTINCT column_2 AS columngroup
    3            FROM dbo.T1
    4            WHERE column_2 IS NOT NULL
    5            )
    6     SELECT COUNT( *
    7                 )
    8       FROM groupby_CTE;


    MSDN 对其解释

    COUNT (Transact-SQL)
    COUNT(*) 返回组中的项数。                包括 NULL 值和重复项。

    COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非 Null 值的数量。                           

    COUNT(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非 Null 值的数量。

    以下是在聚合数据操作后的展现

    1 select column_1,count(column_1) as 'countcolumn_1',count(*) as 'count(*)'
    2 from dbo.T1
    3 group by column_1

    column_1 countcolumn_1 count(*)
    NULL 0 1
    1 2 2
    2 2 2
    3 1 1

    可以看到的NULL值并没有合计。

  • 相关阅读:
    Codeforces Round #485 (Div. 2) C题求三元组(思维)
    MongoDB设置访问权限、设置用户
    与MySQL交互(felixge/node-mysql)
    centos Supervisor
    Async详解之一:流程控制
    C# Socket连接请求超时机制
    tcp-client-c++
    C#TCPClient应用-一个简单的消息发送和接收
    centos下各种c++库文件的安装
    AngularJS与RequireJS集成方案
  • 原文地址:https://www.cnblogs.com/SignalTips/p/4281751.html
Copyright © 2020-2023  润新知