使用mysql中的avg函数求平均值的教程

AVG语法:SELECT AVG(column_name) FROM table_name; 计算students表score列平均值:SELECT AVG(score) FROM students; 按class列分组计算平均值:SELECT class, AVG(score) FROM students GROUP BY class;
注意:AVG忽略NULL值。
实操提醒:计算前确认列非空。

MySQL中avg函数计算平均数mysql中avg

哟,这avg函数啊,我当年刚接手一个旅游公司的数据库,那会儿数据量不大,也就几百条记录,但老板非让我算个平均评分。
当时就傻了,找了个老同事请教,他手把手教我用这个avg。

你就说吧,比如有个表叫reviews,里面存客户对酒店的评分,列名叫rating,就是个数字。
我直接用 sql SELECT AVG(rating) AS avg_rating FROM reviews;
就行了。
这语句跑出来,给我返回个平均值,比如4 .7 分,嘿,老板还挺满意,就在汇报材料里写上了。
这函数简单粗暴,用着真方便。

但后来有一次,有个表数据量特别大,几百万条。
我还在用同样的语句查平均分,结果死活出不来,卡得我电脑直冒烟。
后来才知道,avg函数在数据量大的时候得加个索引,不然真的会卡死。
这事儿给我敲了个警钟,现在用avg前,我总先看看数据量多少,数据量大还得先确认索引加对了没。

哦对了,还有个时候我差点用错。
有一次想算 distinct 的平均分,比如有些客户给了重复评分,我想算个不同的评分的平均值。
当时我就懵了,忘了加 DISTINCT 关键字,结果算出来全是重复评分的平均值。
幸亏同事提醒我,赶紧改了语句: sql SELECT AVG(DISTINCT rating) AS unique_avg_rating FROM reviews;
这才对了。
这函数用着是真方便,但细节处不注意,照样能踩坑。

深入探讨MySQL中的伪列现象mysql中伪列

聊数据库呢?伪列这事儿吧,说多了也绕,咱就聊聊我碰到的实际坑。

记得到前几年,我在一个电商项目上,搞一个报表,得显示每个用户的总消费金额。
但光有总金额不够,还得显示个“平均每月消费”啥的,给运营看。
表里没现成的月消费字段啊。
咋办?
我就琢磨着,在SQL里自己算呗。
用SUM加起来,然后除以用户注册到现在的月份数。
那个月份数,你得知道,不能瞎算,得用一个函数算出来,比如TIMESTAMPDIFF或者啥来着,看系统怎么支持。
这个月份数,它就不是表里本来就有的列,你得在SELECT里临时算出来,这就是个伪列。

比如我写的SQL大概是这样,具体忘了,就打个比方:
sql SELECT user_id, SUM(payment_amount) AS total_spent, SUM(payment_amount) / TIMESTAMPDIFF(MONTH, registration_date, CURDATE()) AS avg_monthly_spent FROM user_orders GROUP BY user_id;
你看,total_spent是加出来的总消费,avg_monthly_spent这个,就是我临时算出来的“平均每月消费”,它就不是user_orders表里有的列,得在查询的时候算出来,返回给报表用。
这个avg_monthly_spent,在数据库里就不存在,就是个计算出来的值,这就是伪列。

为啥要用?因为直接在数据库里算,比拿到数据到外面算,肯定快啊。
而且清晰,一行SQL的事,报表那边直接要啥就算啥,不用额外写程序逻辑。
我这回用着还行,没出啥大问题。

还有个坑是,你起别名的时候,得注意。
不能跟表里真实的列名重名了,不然就乱了。
我这回就没出这茬,但也有见过别人写SQL,name这个字段,结果起了个name的别名,最后取出来的数据跟预期不一样,真是头大。

再比如,我碰到过一次,用CONCAT函数拼接字符串做伪列。
就是想把用户的姓和名拼在一起,表里分开存的。
写法大概是这样:
sql SELECT user_id, CONCAT(last_name, first_name) AS full_name FROM users;
这个full_name也是伪列,数据库里没这列,是查出来临时拼的。

所以你看,伪列这东西,不是啥神秘玩意儿,就是你在SELECT里算出来的,不是表里本来就有的列。
用好了,SQL能写得更灵活,也能解决很多实时计算的需求。
但起别名这事儿,得细心点,别自己搞混了。

我这十年,碰得最多的就是这种简单的算术计算、条件判断(比如用CASE WHEN),或者字符串拼接的伪列。
复杂点的,比如嵌套查询什么的,虽然也能算,但感觉跟“伪列”的范畴有点远了。
你问更复杂的,这块我没碰过,我不敢乱讲。

总之,伪列这玩意儿,用对地方,挺方便的。
别瞎起别名,注意性能(虽然一般影响不大,但特别复杂的计算除外),基本就问题不大。