当前位置:首页 > 问答 > 正文

SQL里变量怎么定义赋值还有调用,简单说说那些事儿

(主要依据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代码块(比如存储过程、函数或匿名块)的声明部分(DECLARE section)进行,格式是 变量名 数据类型 [:= 初始值];,Oracle里的变量名一般前面没有那个符号。my_count NUMBER; 或者直接给它个初始值 my_name VARCHAR2(50) := '张三';

  • 在 MySQL 里(根据MySQL参考手册),情况稍微特殊点,在普通的SQL脚本里,你可以使用用户自定义变量,这类变量名字前面加个符号就行,比如@my_var,但它不需要用DECLARE来提前声明,可以直接拿来用(数据类型由赋的值动态决定),如果在存储过程或函数这些更结构化的程序块里,定义局部变量的话,那就需要在一个BEGIN ... END块的开头部分,使用DECLARE来明确定义,格式类似 DECLARE 变量名 数据类型 [DEFAULT 默认值];,而且这种局部变量前面没有符号。

给变量赋值

盒子造好了,是空的,接下来就得往里塞东西了,这就是赋值,赋值的基本思想就是把一个值(可以是具体的数、文字,也可以是另一个变量的值,甚至是一个查询语句的结果)装到变量里。

SQL里变量怎么定义赋值还有调用,简单说说那些事儿

  • 最常见的赋值操作符是 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里变量怎么定义赋值还有调用,简单说说那些事儿

变量赋值之后,就可以在各种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); 来输出。

需要注意的几个点:

  1. 作用域:变量不是在哪都能用的,它有自己的“活动范围”,叫作用域,在SQL Server里,用DECLARE在一个批处理里声明的变量,只能在这个批处理里用,在存储过程里声明的变量,通常只在这个存储过程内部有效,出了这个范围,变量就失效了。
  2. 生命周期:变量通常只在当前数据库连接会话期间存在,你断开再重连,之前声明的那些变量就都没了。
  3. 数据类型匹配:你往变量里赋值的时候,得保证值的类型和声明的类型是匹配的,你不能把一个字符串硬塞进一个声明为数字的变量里,那样会出错。
  4. NULL值:如果声明变量时没给初始值,很多情况下变量的初始值是NULL(空值),在运算或逻辑判断时要小心处理NULL值。

在SQL里玩转变量,就是三步曲:先声明(告诉系统我要个什么样的小盒子),再赋值(往盒子里放东西),最后调用(在需要的地方喊盒子的名字用它),虽然不同数据库的语法细节有差异,但这个核心逻辑是相通的,熟练使用变量,能让你的SQL脚本变得更聪明、更强大。