You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:18:06