SQL里变量怎么定义赋值还有调用,简单说说那些事儿
- 问答
- 2026-01-10 22:37:56
- 2
(主要依据MySQL、SQL Server和Oracle的常见用法,但不同数据库有细微差别)
在SQL里捣鼓数据的时候,有时候光写死的数据不行,得用“变量”这个东西,你可以把变量想象成一个临时的、有名字的小盒子,你先把这个小盒子声明出来,告诉数据库系统:“喂,我这儿要有个小盒子了,它准备装什么类型的东西(比如数字、文字还是日期)。”然后你就可以往这个小盒子里放一个值,也就是“赋值”,之后,在需要用到这个值的地方,你不用再把值写一遍,直接喊这个小盒子的名字,系统就知道该用里面的值了,这事儿说白了,就是为了让SQL语句更灵活、更容易重复使用,也更容易维护。
变量的定义(声明)
你得把这个“小盒子”造出来,这个过程叫定义或声明,关键是你得说清楚这个盒子是装什么货色的,也就是指定它的“数据类型”,是装整数的(INT),还是装字符的(VARCHAR),或者是装日期的(DATE),不同的数据库管理系统,声明变量的语法不太一样,但思路都差不多。
-
在微软的 SQL Server 和 Sybase 里(根据微软官方技术文档),通常是在一个批处理或存储过程里,用
DECLARE关键字来声明,格式大概是:DECLARE @变量名 数据类型,注意,变量名前面必须带一个符号,这是它的标志,你想声明一个装整数名叫myNumber的变量,就写DECLARE @myNumber INT;,想声明一个装字符串,比如最长10个字符的变量,就叫myName,那就写DECLARE @myName VARCHAR(10);,你可以一次只声明一个,也可以一口气声明好几个,中间用逗号隔开,DECLARE @a INT, @b VARCHAR(20), @c DATE;。 -
在 Oracle 数据库里(参考Oracle官方PL/SQL文档),变量的声明通常在PL/SQL代码块(比如存储过程、函数或匿名块)的声明部分(
DECLAREsection)进行,格式是变量名 数据类型 [:= 初始值];,Oracle里的变量名一般前面没有那个符号。my_count NUMBER;或者直接给它个初始值my_name VARCHAR2(50) := '张三';。 -
在 MySQL 里(根据MySQL参考手册),情况稍微特殊点,在普通的SQL脚本里,你可以使用用户自定义变量,这类变量名字前面加个符号就行,比如
@my_var,但它不需要用DECLARE来提前声明,可以直接拿来用(数据类型由赋的值动态决定),如果在存储过程或函数这些更结构化的程序块里,定义局部变量的话,那就需要在一个BEGIN ... END块的开头部分,使用DECLARE来明确定义,格式类似DECLARE 变量名 数据类型 [DEFAULT 默认值];,而且这种局部变量前面没有符号。
给变量赋值
盒子造好了,是空的,接下来就得往里塞东西了,这就是赋值,赋值的基本思想就是把一个值(可以是具体的数、文字,也可以是另一个变量的值,甚至是一个查询语句的结果)装到变量里。

-
最常见的赋值操作符是
SET,在 SQL Server 和 MySQL 的存储过程中,经常这么干,比如在SQL Server里:SET @myNumber = 10;或者SET @myName = '李四';,在MySQL的存储过程里给局部变量赋值也一样:SET my_local_var = 100;。 -
还有一个常用的方法是使用
SELECT ... INTO ...,这种方式特别适合把从数据库表里查询出来的一个值直接赋给变量,比如你想把员工表里编号为101的员工的姓名找出来,存到变量里,在SQL Server里可以写SELECT employee_name INTO @emp_name FROM employees WHERE employee_id = 101;,这条语句执行后,如果找到了编号101的员工,他的姓名就会被放进变量@emp_name里,在Oracle的PL/SQL里,也常用SELECT ... INTO ...的格式。 -
在 Oracle 里,除了
SELECT INTO,在声明变量时直接用 赋值也很普遍,比如上面提到过的my_value NUMBER := 100;,在代码块里后续要改变量值,也用变量名 := 新值;,my_value := my_value + 50;。 -
对于 MySQL 的用户自定义变量(带@的),除了用
SET,还可以在普通的SELECT查询里直接赋值,SELECT @total := COUNT(*) FROM users;,这个查询会把用户表的总记录数赋给变量@total。
调用(使用)变量

变量赋值之后,就可以在各种SQL语句里像使用普通值一样使用它了,这就是调用。
-
在查询条件(WHERE子句)里:这是非常常见的用法,你提前把一个部门编号赋给了变量
@dept_id,那么查询这个部门的所有员工就可以写:SELECT * FROM employees WHERE department_id = @dept_id;,这样,你只需要修改变量@dept_id的值,就能查询不同部门的员工,不用每次都重写整个SQL语句。 -
在计算或表达式里:比如你声明了两个变量
@price和@quantity,分别放了单价和数量,那么计算总价就可以写SET @total_amount = @price * @quantity;。 -
在插入(INSERT)或更新(UPDATE)数据时:你可以用变量的值来作为要插入或更新的数据。
UPDATE products SET stock = stock - @purchase_qty WHERE product_id = @pid;这句就是用变量@purchase_qty(购买数量)和@pid(产品ID)来更新产品库存。 -
输出或显示变量的值:在SQL Server里,可以用
PRINT @myVariable;来在消息窗口显示变量值,在MySQL里,可以用SELECT @myVariable;来像查询结果一样返回变量值,在Oracle的PL/SQL里,可以用DBMS_OUTPUT.PUT_LINE(my_variable);来输出。
需要注意的几个点:
- 作用域:变量不是在哪都能用的,它有自己的“活动范围”,叫作用域,在SQL Server里,用
DECLARE在一个批处理里声明的变量,只能在这个批处理里用,在存储过程里声明的变量,通常只在这个存储过程内部有效,出了这个范围,变量就失效了。 - 生命周期:变量通常只在当前数据库连接会话期间存在,你断开再重连,之前声明的那些变量就都没了。
- 数据类型匹配:你往变量里赋值的时候,得保证值的类型和声明的类型是匹配的,你不能把一个字符串硬塞进一个声明为数字的变量里,那样会出错。
- NULL值:如果声明变量时没给初始值,很多情况下变量的初始值是NULL(空值),在运算或逻辑判断时要小心处理NULL值。
在SQL里玩转变量,就是三步曲:先声明(告诉系统我要个什么样的小盒子),再赋值(往盒子里放东西),最后调用(在需要的地方喊盒子的名字用它),虽然不同数据库的语法细节有差异,但这个核心逻辑是相通的,熟练使用变量,能让你的SQL脚本变得更聪明、更强大。
本文由凤伟才于2026-01-10发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/78327.html
