count(1)和count(*)的区别

5 篇文章 0 订阅
订阅专栏

 在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会阐述这三者的作用,关系以及背后的原理。

    往常我经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count( *)会带来全表扫描。而实际上如何写Count并没有区别。

    Count(1)和Count(*)实际上的意思是,评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。比如我们看代码1所示,在Count中指定NULL(优化器不允许显式指定NULL,因此需要赋值给变量才能指定)。

DECLARE @xx INT
SET @xx=NULL
 
SELECT COUNT(@xx) FROM [AdventureWorks2012].[Sales].[SalesOrderHeader]

代码清单1.Count中指定NULL

 

     由于所有行都为NULL,则结果全不计数为0,结果如图1所示。

image

图1.显而易见,结果为0

 

    因此当你指定Count(*) 或者Count(1)或者无论Count(‘anything’)时结果都会一样,因为这些值都不为NULL,如图2所示。

image

图2.只要在Count中指定非NULL表达式,结果没有任何区别

 

 

那Count列呢?

    对于Count(列)来说,同样适用于上面规则,评估列中每一行的值是否为NULL,如果为NULL则不计数,不为NULL则计数。因此Count(列)会计算列或这列的组合不为空的计数。

 

那Count(*)具体如何执行?

    前面提到Count( )有不为NULL的值时,在SQL Server中只需要找出具体表中不为NULL的行数即可,也就是所有行(如果一行值全为NULL则该行相当于不存在)。那么最简单的执行办法是找一列NOT NULL的列,如果该列有索引,则使用该索引,当然,为了性能,SQL Server会选择最窄的索引以减少IO。

    我们在Adventureworks2012示例数据库的[Person].[Address]表上删除所有的非聚集索引,在ModifyDate这个数据类型为DateTime的列上建立索引,我们看执行计划,如图3所示:

image

图3.使用了CreateDate的索引

 

    我们继续在StateProvinceID列上建立索引,该列为INT列,占4字节,相比之前8字节 DateTime类型的列更短,因此SQL Server选择了StateProvinceID索引。如图4所示。

image

图4.选择了更短的StateProvinceID索引

 

    因此,如果某个表上Count(*)用的比较多时,考虑在一个最短的列建立一个单列索引,会极大的提升性能。

Select count(*)、Count(1)和Count(列)的区别及执行方式
12-15
在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会阐述这三者的作用,关系以及背后的原理。     往常我经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count( *)会带来全表扫描。而实际上如何写Count并没有区别。     Count(1)和Count(*)实际上的意思是,评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。比如我们看代码1所示,在Count中指定NULL(优化器不允许显式指
Select count(*)和Count(1)的区别和执行方式
weixin_33726943的博客
02-10 1874
    在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会阐述这三者的作用,关系以及背后的原理。     往常我经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count( *)会带来全表扫描。而实际上如何写Count并没有区别。   ...
count(1) count(* ) count(字段) 的区别
最新发布
刘皇叔说Java的博客
08-30 746
COUNT(1)和COUNT(*): 统计所有行的数量,无论行内数据是否为NULL。COUNT(字段): 只统计特定字段中非NULL的行数量。在实际使用中,COUNT(*)是最常见的选择,适合大多数场景。COUNT(字段)则在需要排除NULL值时非常有用。
(count(*)和count(1)的区别
weixin_52860572的博客
06-06 6395
(count(*)和count(1)的区别
count(*) count(1)与count(字段)的区别
weixin_46200547的博客
08-31 6071
一、执行结果 count(*) 和count(1) 都是统计行数,而count(col) 是统计col列非null的行数 二、执行计划 MyISAM与InnoDB,正如在不同的存储引擎中,count(*)函数的执行是不同的 在MyISAM存储引擎中,count(*)函数是直接读取数据表保存的行记录数并返回,效率很高,但是如果添加了where条件的话,MyISAM表也不能返回得很快。 在InnoDB存储引擎中,count(*)函数是先从内存中读取表中的数据到内存缓冲区,然后扫描全表获得行记录数。在使用coun
MySQL中count(*)、count(1)和count(col)的区别汇总
09-09
本篇文章将详细解释COUNT(*)、COUNT(1)以及COUNT(column)这三种不同用法的区别。 1. COUNT(*) COUNT(*)是最常见的用法,它会计算表中所有非NULL的行。这意味着,即使列中有NULL值,COUNT(*)也会将其计入总数。在...
sql server中Select count(*)和Count(1)的区别和执行方式
12-15
在SQL Server中,`SELECT COUNT(*)` 和 `COUNT(1)` 是两种常见的聚合函数,用于统计表中的行数。虽然在大多数情况下它们的结果相同,但它们的执行方式和背后的原理存在细微差别,这也是数据库优化中常常讨论的话题。...
count(1)、count(*)与count(列名)的执行区别详解
01-19
执行效果: 1. count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时...所以没必要去count(1),用count(*),sql会帮你完成优化的 因此: count(1)和count(*)基本没有差别!
select count (1) 与select count(*)区别
budaoweng0609的博客
05-11 6022
count(1),其实就是计算一共有多少符合条件的行。1并不是表示第一个字段,而是表示一个固定值。其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1。同理,count(2),也可以,得到的值完全一样,count('x'),count('y')都是可以的。一样的理解方式。在你这个语句理都可以使用,返回的值完全是一样的。就是计数。count(*),执行时会...
MyBatis pageHelper自动在SQL外层包装SELECT count(0)的Bug?
qq_23204557的博客
09-06 4678
如题所述,今天使用MyBatis pageHelper插件分页时,发现底层的SQL外面莫名其妙又包上了一层SELECT count(0),导致没有返回预期中的结果。在网上查阅了一些资料,说这是pageHelper的一个bug,解决方法是在分页前调用PageHelper.clearPage()。我确实按此解决了问题,但奇怪的是当我去掉这句想重现bug时也失败了。 ...
pagehelper问题20220415
stjiayc的博客
04-15 540
pagehelper不分页问题
区别count(1) 和 count(*)和count(列名)
CharlesCFA的博客
02-17 2554
执行效果上: count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL; count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL; count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。 所以呢,count(1)和count(*)之间没有区别,因为他们两个都不会过滤空值,但count(列名)就有区别了,因为count(列名)会去过滤空值
count(*)、count(1)和count(列名)的区别
人间不值得
10-25 1897
count(*)和count(1)执行机制存在差异,count()函数在传入*,1,2,'abc'等值都会返回相同的结果;区别在于count(*)在传入*时,MySQL优化器会找到最小的那棵索引树进行遍历.对于 count(1) 和 count(*) ,效率相当,建议尽量使用 count(*),因为 MySQL 优化器会选择最小的索引树进行统计,针对此操作进行优化。:count(*)和count(1)都是统计表中所有记录的行数,不论其是否包含null值。count(列名)和。)) :其实是 count(
查询count(1)、count(*)、count(列名) 详解
Gorden的博客
06-01 5968
count函数 1.count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和count(*)的效果是一样的。 但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),不过差不了多少。 如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用...
MySQL--select count(*)、count(1)、count(列名) 的区别你知道吗?
weixin_42118323的博客
03-18 2187
【强制】不要使用 count(列名)或 count(常量)来替代 count(), count()是 SQL92 定义的 标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。说明: count(*)会统计值为 NULL 的行,而count(列名)不会统计此列为 NULL 值的行。如果再面试中,你回答会扫描全表,那不好意思,可能面试官只能要你回去等通知了。count()函数使用小建议:无特殊要求的时候,建议无脑使用 count(*)。列值没有为空的时候,三种查询结果一致。
count(1)和count(*)和count(列名)的区别
_江屿_
12-07 358
1、执行效果上: count(1),其实就是计算一共有多少符合条件的行。 1并不是表示第一个字段,而是表示一个固定值。 其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1。count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。 2、执行效率上: 他们之间根据不同情况会有些许区别,MySQL 会对count()做优化。(1)如果表中只有一列,则count()效率最优。(2)如果表有多
select count(1)、count(*)、count(column)
m0_57015193的博客
08-15 773
count(*):先把星号翻译为具体字段名字,多了一步翻译,效率差点 count(1):计算有多少符合条件的行,可以理解为每行数据存在某个值固定的字段,计算有多少个固定值 从结果来说: count(*) 和 count(1) 没区别,都不会过滤 NULL count(column) 会过滤 NULL 从速度来说: 如果只有一列,count(*) 效率最高 多列时,count(1) 效率高于 count(*) 如果列为主键,count(column) 效率最高 如果列不为主键,count(1) 效率比
count1和count*
06-02
`count1` 和 `count*` 是两个不同的变量名,可能代表不同的变量。 `count1` 可能是一个整型变量,用于存储一个整数值,例如: ```c++ int count1 = 10; ``` `count*` 可能是一个指针变量,用于存储另一个变量的...
写文章

热门文章

  • StringUtils.isNotBlank(XX) 27773
  • 关于ecplise中导入项目之后出现的jsp文件有错误问题 11625
  • 算法之数字反转问题 5075
  • count(1)和count(*)的区别 3082
  • SSh中 一对多关联外键添加,修改保存失败问题 2788

分类专栏

  • Ajax
  • java 22篇
  • javabean 2篇
  • 算法 5篇
  • 数据库 2篇
  • eclipse 2篇
  • ssh 3篇
  • ssm 5篇
  • 设计模式
  • java设计模式

最新评论

  • 个人学习传智博客新巴巴运动网系列---ssm框架

    qq_42747250: 能给我一份课前资料和项目文档吗?谢谢 2636317752@qq.com(QQ邮箱)

  • 关于SSH,插入数据时,,遇到的关于date的问题

    超级无敌宇宙霹雳极度美丽动人怡: 我的mysql已经是最新的1.9了 但是还是会报错 显示当前的时分秒和选中的日期报错 有什么解决方法吗

  • SSh中 一对多关联外键添加,修改保存失败问题

    上厕所写代码的码虫: 可以使用ServletActionContext.getrequest().getParamer("")来获取jsp页面的值吧

  • SSh中 一对多关联外键添加,修改保存失败问题

    上厕所写代码的码虫: s

  • 个人学习传智博客新巴巴运动网系列---ssm框架

    爱弹吉他的程序猿: 你好,能把源码发我一下吗,谢谢! 718173990(QQ邮箱,我写邮箱地址被屏蔽了,麻烦发的时候加上邮箱后缀,谢谢啦!)

大家在看

  • 山东大学大数据安全实验五:AES字节替代 533
  • jsp高校大学生求职系统u1pg7--程序+源码+数据库+调试部署+开发环境
  • 2024黑五网一时间新出炉!大促营销怎么准备? 317
  • jsp高校大学生实习信息管理系统v9i3k程序+源码+数据库+调试部署+开发环境
  • 自学黑客(网络安全/信息安全),一般人我劝你还是算了吧 793

最新文章

  • 关于java中instance of的使用
  • 数据库语句中的 where 1=1
  • java代理模式
2017年25篇
2016年27篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家合肥雕塑玻璃钢雕塑厂鹤壁锻铜玻璃钢卡通雕塑品质玻璃钢雕塑规格北京鱼人玻璃钢雕塑制作玻璃钢传统人物雕塑厂家电话玻璃钢雕塑价格是多少杭州玻璃钢雕塑公司暴力熊玻璃钢雕塑图晋城铜玻璃钢人物雕塑公司四川户内玻璃钢雕塑哪家便宜许昌仿古玻璃钢雕塑深圳自发光动物玻璃钢雕塑供应商玻璃钢雕塑100种玻璃钢人像雕塑哪家便宜晋中玻璃钢仿铜雕塑定制南昌玻璃钢卡通人物雕塑雕塑玻璃钢的英文桔子玻璃钢卡通雕塑定制厂家山西高质量玻璃钢雕塑定做价格花朵玻璃钢彩绘雕塑小品云南景观玻璃钢雕塑设计玻璃钢雕塑狼晋城太湖石玻璃钢雕塑厂家河南玻璃钢花盆研究玻璃钢牛角雕塑夺艺雕塑玻璃钢人物订做河南特色商场美陈研发公司四川商场美陈花器福建常见商场美陈供货商滁州儿童玻璃钢雕塑设计香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化