上一篇
想象一下,你正在处理一个百万级数据的订单表,需要:
如果每次计算都写子查询,SQL会变得像意大利面一样复杂,这时候,MySQL变量就像你的临时助手,帮你存储中间结果,让SQL逻辑清晰如流水。
定义方式:@变量名
(以@开头)
作用域:当前连接有效,断开后自动消失
适用场景:跨语句传递值、临时存储计算结果
-- 统计当天订单总数 SELECT @order_count := COUNT(*) FROM orders WHERE order_date = CURDATE(); -- 计算平均订单金额 SELECT @avg_amount := AVG(amount) FROM orders WHERE order_date = CURDATE(); -- 找出最高单笔订单 SELECT @max_order := amount FROM orders WHERE order_date = CURDATE() ORDER BY amount DESC LIMIT 1; -- 最终输出 SELECT @order_count AS '订单总数', @avg_amount AS '平均金额', @max_order AS '最高订单';
定义方式:DECLARE 变量名 数据类型 [DEFAULT 默认值];
作用域:仅在声明它的BEGIN...END
块内有效
适用场景:存储过程/函数内部的复杂逻辑处理
DELIMITER $$ CREATE PROCEDURE CalculateDeptSalary(IN dept_id INT) BEGIN -- 声明局部变量 DECLARE total_salary DECIMAL(10,2) DEFAULT 0; DECLARE employee_count INT DEFAULT 0; -- 计算部门总工资和人数 SELECT SUM(salary), COUNT(*) INTO total_salary, employee_count FROM employees WHERE department_id = dept_id; -- 输出结果 SELECT dept_id AS '部门ID', total_salary / employee_count AS '平均工资' FROM DUAL; END $$ DELIMITER ;
SET @var = 1;
即可使用DECLARE
必须在BEGIN
块的最前面SET @var = 1;
✅ SELECT @var := column FROM table;
✅ SELECT column INTO @var FROM table;
✅ SELECT @var = column FROM table;
❌(必须用:=)-- 用户变量存储中间结果 SET @start_date = '2025-08-01'; SET @end_date = '2025-08-31';
-- 局部变量处理详细逻辑 DELIMITER $$ CREATE PROCEDURE ReportSales() BEGIN DECLARE total_sales DECIMAL(12,2) DEFAULT 0; DECLARE daily_avg DECIMAL(10,2) DEFAULT 0;
SELECT SUM(amount) INTO total_sales FROM sales WHERE sale_date BETWEEN @start_date AND @end_date;
SELECT total_sales / DATEDIFF(@end_date, @start_date) + 1 INTO daily_avg;
SELECT total_sales AS '总销售额', daily_avg AS '日均销售额'; END $$ DELIMITER ;
## 📚 变量选择的黄金法则
| **变量类型** | **定义方式** | **作用域** | **典型场景** |
|--------------|--------------------|--------------------|----------------------------------|
| 用户变量 | `@var_name` | 当前会话 | 跨语句计算、临时结果存储 |
| 局部变量 | `DECLARE var_name` | `BEGIN...END`块 | 存储过程/函数内部的复杂逻辑处理 |
***:用户变量是你的“全局临时助手”,局部变量是你的“局部计算专家”,合理搭配使用,能让SQL效率提升30%以上!
本文由 业务大全 于2025-08-26发表在【云服务器提供商】,文中图片由(业务大全)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://xdh.7tqx.com/wenda/738450.html
发表评论