本文正在参加「技术专题19期 漫谈数据库技术」活动
最近一直在写sql,业务逻辑当中对数据的统计需求比价大,比如:
统计每天的访问量,
统计访问量大于5的用户
等等,所以就用了很多count方法,这里把最近使用count的理解和小技巧和大家分享一下。
count的作用
首先,先预热一下,count单词本身具有计数的含义,所以,最初接触count的时候也觉得他就是一个计数的小功能,但是随着最近的使用,发现了count的多态性,啥意思,就是对不同的对象有不同的含义:
1)count可以统计列值的数量,但是不包含空列(值为NULL),比如:
select count(description) from browse_log;
查询浏览记录当中所有商品描述的数量,这个查询其实返回的就是有描述的商品的数量,为null的不进行计算。
- count可以统计表达式有值的结果数。
select count(distinct goods_type) from browse_log;
这里返回的就是商品类型的数量,注意这里的数量指的是去重之后的,就是我们语义上的有几种商品,这个是不是不用使用分组查询了,感觉省下了一大笔呢。
3)count( ) 不是作用就是记录查询结果有多少行,不会每个列都扫描一遍,所以再使用过程当中 count( *)计算行数,实际上比count(字段)性能上和语意上都好很多,所以可以大胆的写:
select count(*) from browse_log where goods_type="零食";
count进阶小技巧
这里举一个案例:
查询销量大于5的商品:
select count(*) from sales_records where sales_volume > 5;
这个时候如果用show status看会发现扫描了8000多行,但是,精彩的来了:
select (select count(*) from sales_records) - count(*) from sales_records where sales_volume < 5;
这样看,会发现查询优化的时候,将子查询作为常数进行处理,这样是不是好很多。
这个案例也是自己在工作的时候发现的,大家如果有啥更好的点子,欢迎一起来讨论。
本文正在参加「技术专题19期 漫谈数据库技术」活动