数据库聚合函数有哪些:常用就这几个不用记太偏门的
上次帮实习生改SQL的时候,才发现他连数据库聚合函数有哪些都搞不清,写个统计语句嵌套了三层子查询,跑十分钟都出不来结果。坐在他旁边看他删了写写了删,屏幕上的光标晃的我眼睛疼,忍不住凑过去看了一眼,好家伙,为了算个用户下单总数,他居然先查了所有订单,然后在代码里循环计数,这要是订单量上了百万,服务器不得直接炸了。
真的,没用的东西别背。
刚毕业那会准备面试,在网上找了个所谓的“聚合函数大全”,足足二十多个,什么STDDEV求标准差、VARIANCE求方差、JSON_ARRAYAGG拼JSON数组,还有一堆现在连名字都记不住的,背了整整三天,吃饭的时候都在念叨,就怕面试的时候被问到。结果真到面试的时候,面试官根本没问那些冷门的,上来就问COUNT(*)和COUNT(1)有没有区别,当时直接卡壳了,背的那些函数名一个都用不上,站在那脸憋的通红,最后面试官摇了摇头,说基础还是不扎实,回去再练练吧。
进了公司之后才发现,工作里根本用不上那么多花里胡哨的函数。日常做统计,翻来覆去就是那几个,COUNT用来计数,SUM用来求和,AVG算平均值,MAX和MIN找最大最小值,最多偶尔需要把同一个用户的多个订单号拼在一起,用个GROUP_CONCAT,剩下的那些背过的冷门函数,五六年了,一次都没用到过。有次闲的没事,想试试那个JSON_ARRAYAGG,写了个语句跑了一下,结果数据量一大直接超时了,后来还是老老实实拆成两个查询搞定的,从那之后就再也不琢磨那些没用的东西了。
踩过最大的坑还是COUNT的用法。有次做月度订单统计,顺手写了个COUNT(order_id),结果统计出来的订单数比运营那边的数少了十七个,运营拿着报表来找我,说就差这十七个订单,活动预算差了好几万,让我赶紧改。查了一下午,从数据源到查询条件翻了个遍,最后才发现,有十七个异常订单的order_id是NULL,COUNT(字段)会自动忽略NULL值,所以就没统计进去,换成COUNT(*)之后数据立刻就对了。那天加班到九点,改完之后把COUNT的几种用法写在便签上贴在显示器上,贴了整整一年,就怕再犯同样的错。
还有SUM的时候也容易出问题,有次统计用户充值金额,没注意字段类型,把存成字符串的金额直接加了,结果出来的数比实际多了好几倍,查了半天才发现,字符串类型的数字求和的时候,MySQL会自动转成数值,但是如果字符串里有非数字的字符,就会当成0处理,有的数据存的时候带了个人民币符号,转的时候直接变成0了,有的又转对了,最后出来的数完全不对,折腾到半夜才把所有数据修正过来。
现在再有人问我聚合函数有哪些,就给他列五个,多一个都不写。反正那些偏门的,真用到了再查文档也来得及,背那么多,除了面试的时候装装样子,平时一点用都没有。