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

数据库里到底怎么弄个变量,感觉好像没那么简单啊?

咱们别管那些专业的术语,就用最直白的话来拆解一下。

你只是在数据库里临时查点东西,想用一个“中间结果”

想象一下,你打开数据库的查询工具(比如Navicat、DBeaver或者命令行),想写一段SQL语句来查数据,写着写着,你发现有一段很长的计算或者一个查询结果,在后面好几处地方都要用到,你肯定会想:“要是能把这个结果存成个变量,后面直接用它多省事儿!”

这时候,你的“变量”其实就是SQL中的用户定义变量或者局部变量。

  1. 用户定义变量(比如在MySQL里): 这有点像给一个临时结果贴个标签,语法很简单,用 符号开头。

    • 怎么“弄”: SET @我的变量名 = 值; 这个“值”可以是一个数字、一串文字,甚至是从另一个查询里查出来的结果。

    • 怎么用: 在后面的SQL语句里,直接用 @我的变量名 来代替那个值。

      数据库里到底怎么弄个变量,感觉好像没那么简单啊?

    • 举个例子: 你想找出所有比公司平均工资高的员工。

      -- 先把平均工资算出来,存成变量
      SET @平均工资 = (SELECT AVG(工资) FROM 员工表);
      -- 然后直接用这个变量来查
      SELECT * FROM 员工表 WHERE 工资 > @平均工资;
    • 特点: 这种变量在你这次连接数据库的期间一直有效,关掉查询窗口就没了,它就是个临时的便利贴。

  2. 局部变量(比如在SQL Server的存储过程里): 这个就更像编程里的变量了,但它通常被包裹在一个更大的“程序块”里,比如存储过程函数,你不能在随便一个查询里单独用它。

    • 怎么“弄”: 先用 DECLARE 关键字声明一下变量,告诉数据库它的名字和类型(比如是整数还是字符串),然后再用 SET 或者 SELECT 给它赋值。

    • 怎么用: 在它所在的存储过程或函数内部使用。

      数据库里到底怎么弄个变量,感觉好像没那么简单啊?

    • 举个例子(这是一个简单的存储过程框架):

      CREATE PROCEDURE 查询高工资员工
      AS
      BEGIN
        -- 1. 声明变量
        DECLARE @平均工资 DECIMAL(10,2);
        -- 2. 给变量赋值
        SELECT @平均工资 = AVG(工资) FROM 员工表;
        -- 3. 使用变量
        SELECT * FROM 员工表 WHERE 工资 > @平均工资;
      END
    • 特点: 它的生命周期只在这个存储过程执行的过程中,执行完就销毁,作用是让这段数据库内部的“小程序”能进行逻辑计算。

小结一下这个场景: 在这种临时查询或编写数据库程序的情况下,“变量”就是为了方便和实现逻辑而存在的临时储物格


你想在数据库里永久地存一个以后要反复用的“变量”

你的应用系统有一个“网站维护开关”,当开关打开时,所有用户看到“网站维护中”的页面;开关关闭时,网站正常访问,这个开关的值(开或关)就是一个需要永久存储、并能被应用程序随时读取的“变量”。

这时候,你的“变量”其实就是一张特殊的表里的一行记录。

数据库里到底怎么弄个变量,感觉好像没那么简单啊?

这是最常用、也是最“数据库”的做法,你别把它想复杂了,就是这么简单直接。

  • 怎么“弄”:

    1. 专门创建一张小表,比如就叫 系统配置表
    2. 这张表就两三个字段就够了:配置项名称(比如就叫“网站维护状态”)、配置值(比如是“on”或“off”)、 maybe再加个说明
    3. 你提前在这张表里插好一条记录:名称=“网站维护状态”, 值=“off”。
  • 怎么用:

    • 应用程序(比如你的Java、Python后端代码) 需要判断时,就执行一条简单的查询:SELECT 配置值 FROM 系统配置表 WHERE 配置项名称 = '网站维护状态';
    • 代码拿到这个“off”或“on”的值,就知道该显示维护页面还是正常页面了。
    • 要修改变量值(比如打开维护模式),管理员要么直接去数据库里执行 UPDATE 系统配置表 SET 配置值 = 'on' WHERE ...,要么通过一个管理员后台界面操作,后台再去执行这个更新语句。
  • 特点: 这种方法的好处是:

    • 持久化: 数据库重启了,这个值还在。
    • 共享性: 所有连接到数据库的应用程序都能读取到同一个值,保证了统一。
    • 管理方便: 可以直接用SQL操作,非常灵活。

为什么感觉“不简单”?

你现在可能明白了,之所以觉得不简单,是因为“数据库变量”没有一个唯一的答案,它不是一个像编程语言里 int a = 10; 那样标准化的东西。

  • 当你临时和数据库对话时,你用 @变量 这样的便利贴。
  • 当你教数据库做一套复杂动作(写存储过程)时,你用 DECLARE 声明的局部变量作为步骤中的临时容器。
  • 当你希望应用系统有一个全局的、永久的状态需要记录时,你直接用一张来充当这个“变量”,这才是最正宗、最强大的数据库思维方式。

下次再想在数据库里“弄个变量”,先问自己:“我这个变量,是用来干嘛的?” 根据答案,选择上面最适合的那张“面孔”就行了,它确实没那么简单,但拆解开来,每一种方法其实都很直观。