赞
踩
在sql语句中有一个聚合函数count();这个函数里面可以写*,可以写数字(不仅仅只可以写1),可以写具体字段,他们之间有什么区别呢?
查阅资料得知,count(*)与count(1)在各种数据库服务器底层中,效果是一样的。就是分组后,能查出数据,就会记录1条,依次往上加。所以就算只有一个字段有值,也会被+1。在外连接查询的时候,经常会碰到很多字段为空(null)的情况。所以这个时候就得根据需求来确定count函数里面写什么。
count(具体字段)这种写法的意思是,只有当具体字段的值不为空(null)的时候,才会+1。所以有时候分组查询了很多条数据,但是那个具体字段一直是null的话,那么count(具体字段)返回的还是0。
这种情况在外连接里经常碰到,这个时候,用count(*或数字)与count(具体字段)所返回的值是有可能不同的,不同就在于具体字段有没有空(null)。有几个空(null),那么count(具体字段)就会比count(*或数字)少几条数据。
总结:
count(*)与count(数字)这种写法更容易理解的含义是:返回该分组数据的总条数,有多少条,就会返回多少(字段全是null的是不存在的,所以有多少条数据,就会返回多少)。
count(具体字段)这种写法更容易理解的含义是:返回该具体字段在分组数据中不为空(null)的条数,有多少条不为空(null),就会返回多少。
性能方面:count(*)的性能等于count(数字)大于count(具体字段)
因为在sql的引擎中,分完组之后,count(*)与count(数字)其实结果就已经出来了,但是如果写了count(具体字段),引擎还会在遍历一遍分完组的数据,统计具体字段不为空(null)的条数,然后返回出来。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。