如何查询MySQL clientes表中年龄超过平均年龄38.2的西班牙客户姓名
正确SQL写法
你可以直接将全表平均年龄的计算作为子查询放到WHERE条件中,实现需求的语句如下:
-- 兼容所有MySQL版本的写法 SELECT nombre, apellidos FROM clientes WHERE pais_nacimiento = 'Spain' -- 逐行计算当前客户周岁 AND (YEAR(CURDATE()) - YEAR(fecha_nacimiento) - (RIGHT(CURDATE(), 5) < RIGHT(fecha_nacimiento, 5))) -- 和全表平均周岁对比 > ( SELECT AVG(YEAR(CURDATE()) - YEAR(fecha_nacimiento) - (RIGHT(CURDATE(), 5) < RIGHT(fecha_nacimiento, 5))) FROM clientes );
如果需要返回拼接后的完整姓名,可以将SELECT后的字段替换为CONCAT(nombre, ' ', apellidos) AS 客户姓名。
原语句错误原因
你之前编写的语句只返回1条数据,是因为在SELECT列表中直接使用了聚合函数AVG()但没有指定GROUP BY子句,此时MySQL会将整张表作为一个分组聚合,最终仅返回聚合后的单行结果。同时你计算平均年龄时没有对齐已有的周岁计算逻辑,忽略了生日是否已过的判断,会导致平均年龄计算有误差。
MySQL 8.0+简化写法
如果使用的是MySQL 8.0及以上版本,可以用CTE抽离重复的年龄计算逻辑,可读性更高:
WITH client_age AS ( SELECT *, YEAR(CURDATE()) - YEAR(fecha_nacimiento) - (RIGHT(CURDATE(), 5) < RIGHT(fecha_nacimiento, 5)) AS age FROM clientes ) SELECT nombre, apellidos FROM client_age WHERE pais_nacimiento = 'Spain' AND age > (SELECT AVG(age) FROM client_age);
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

