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
4 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值并没有合计。

时间: 2024-08-03 15:36:02

COUNT(*),count(1),COUNT(ALL expression),COUNT(DISTINCT expression)的相关文章

entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等

前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller表. 在本次学习之前,我们先要了解一个神奇的接口,iqueryable这个接口类似于ienumable,但并不完全相同,Iqueryable是可查询类型需要实现的最重要的接口,在其Count,ToList,ToArray之后才会真正执行查询,所以,为了保证性能,请尽量在最后一步在进行Co

HDU 4588 Count The Carries(找规律,模拟)

题目 大意: 求二进制的a加到b的进位数. 思路: 列出前几个2进制,找规律模拟. #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> #include <stack> #include <vector> using namespace std; int main() { int

关于数据库优化1——关于count(1),count(*),和count(列名)的区别,和关于表中字段顺序的问题

1.关于count(1),count(*),和count(列名)的区别 相信大家总是在工作中,或者是学习中对于count()的到底怎么用更快.一直有很大的疑问,有的人说count(*)更快,也有的人说count(列名)更快,那到底是谁更快,我将会在本文中详细介绍一下到底是count(1),count(*)和count(列明)的区别,和更适合的使用场景. 往常在工作中有人会说count(1)比count(*)会快,或者相反,首先这个结论肯定是错的,实际上count(1)和count(*)并没有区别

sql中奇怪的sum(1),sum(2),count(1),count(6),count(*):统计总数

sql的统计函数 sql统计函数有 count 统计条数,配合group用 sum 累加指定字段数值 但注意sum(1)就特殊 sum(1)等同于count(*) sum(1)统计个数,功能和count(*)一样,但效率上count(*)高.所以尽量少用. 举个小例子 SELECT ad_network_id,,sum(1),count(*),sum(2),count(5) from mapping_table_analytics GROUP BY ad_network_id 运行结果为: 3

SQL编程实例:Access数据库,两张表的统计,count、sum聚合函数的使用,iif的使用,group by的使用

小媛在努力 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 在多媒体数据处理中,数据压缩算法尤为重要.小媛上完课后就想自己发明一个数据压缩算法.她想呀想,终于想到一个方法.在多媒体数据中有很多数据都是重复的,所以她想把连续相同的数据用数据出现的次数和数据本身表示.例如:1 1 1 2 3 3 3 3 3  压缩后及为3 1 1 2 5 3(表示3个1,1个2和5个3).有想法后小媛就希望把它用代码实现了.但是大家都知道小媛现在整天都忙着苦B的复习考研,连电脑都摸不到

count(*),count(1)和count(字段)的区别

count(*),count(1)和count(字段)的区别 之前在写sql语句时,常常使用count(*)来执行查询数据条数,也使用过count(字段)来针对某一特殊字段进行查询,今天接触到了count(1)也可以用来进行数据统计,下来查看资料,对它们有了一定的了解. 很多人认为count(1)执行的效率会比count(*)高,原因是count(*)会存在全表扫描,而count(1)可以针对一个字段进行查询.其实不然,count(1)和count(*)都会对全表进行扫描,统计所有记录的条数,包

count(1),count(*),count(主键) 性能对比

前言 前段时间关于统计数量的sql问题和朋友进行了讨论,网上关于这三种查询方式说法不一,主要有以下两种说法. count(*) = count(主键) > count(1) count(主键) > count(*) > count(1) 今天对这三种方式进行探究. 数据库为mysql 5.7.12,引擎为InnoDB. 建表 CREATE TABLE `user` (   `id` int(32) NOT NULL AUTO_INCREMENT,   `name` varchar(500

使用&quot;立即执行函数&quot;(Immediately-Invoked Function Expression,IIFE)

一.原始写法 模块就是实现特定功能的一组方法. 只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块. function m1(){ //... } function m2(){ //... } 上面的函数m1()和m2(),组成一个模块.使用的时候,直接调用就行了. 这种做法的缺点很明显:"污染"了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系. 二.对象写法 为了解决上面的缺点,可以把模块写成一个对象,所有的模块成员都放到这个对象里面.

static_cast &lt; type-id &gt; ( expression )与reinterpret_cast&lt;type-id&gt; (expression)的区别

static_cast< type-id > ( expression )与reinterpret_cast<type-id> (expression)的区别 1.    static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性.它主要有如下几种用法: ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换. 进行上行转换(把派生类的指针或引用