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

如何使用MySQL变量保存平均年龄并删除年龄低于均值的行

删除Persons表中年龄低于平均年龄的记录(含变量用法修正)

原代码的问题

你的代码失效核心原因有两点:

  1. 赋值@age时,select TIMESTAMPDIFF(YEAR, birthDate, CURDATE()) from Persons返回多行结果,但MySQL用户变量只会保留最后一行的计算值,无法对应每个用户的年龄。
  2. 基于错误的@age计算出的@avgAge并非全表的平均年龄,导致后续删除逻辑完全错误。

方案1:直接子查询(最简高效)

无需变量,直接嵌套子查询计算平均年龄并作为过滤条件:

START TRANSACTION;
DELETE FROM Persons
WHERE TIMESTAMPDIFF(YEAR, birthDate, CURDATE()) < (
    SELECT AVG(TIMESTAMPDIFF(YEAR, birthDate, CURDATE())) 
    FROM Persons
);
-- 确认删除结果正确后执行COMMIT,否则保持ROLLBACK
-- COMMIT;
ROLLBACK;

方案2:正确使用变量存储平均年龄

如果一定要用变量,需先计算并存储全表的平均年龄,再用该变量匹配每个用户的年龄:

-- 先计算全表平均年龄并存入变量
SET @avgAge = (
    SELECT AVG(TIMESTAMPDIFF(YEAR, birthDate, CURDATE())) 
    FROM Persons
);

START TRANSACTION;
DELETE FROM Persons
WHERE TIMESTAMPDIFF(YEAR, birthDate, CURDATE()) < @avgAge;
-- 确认后执行COMMIT,否则ROLLBACK
-- COMMIT;
ROLLBACK;

内容的提问来源于stack exchange,提问作者Or Shalmayev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:35:19