首页 文章

如何在MySQL中声明变量?

提问于
浏览
263

如何在mysql中声明一个变量,以便我的第二个查询可以使用它?

我想写一些类似的东西:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

5 回答

  • 450

    MySQL中主要有三种变量:

    • User-defined variables (prefixed with @):

    您可以访问任何用户定义的变量,而无需声明或初始化它 . 如果引用尚未初始化的变量,则其值为 NULL 且为字符串类型 .

    SELECT @var_any_var_name
    

    您可以使用 SETSELECT 语句初始化变量:

    SET @start = 1, @finish = 10;
    

    要么

    SELECT @start := 1, @finish := 10;
    
    SELECT * FROM places WHERE place BETWEEN @start AND @finish;
    

    可以从一组有限的数据类型为用户变量分配值:整数,十进制,浮点,二进制或非二进制字符串或NULL值 .

    用户定义的变量是特定于会话的 . 也就是说,其他客户端无法看到或使用由一个客户端定义的用户变量 .

    它们可以在使用Advanced MySQL user variable techniquesSELECT 查询中使用 .

    • Local Variables (no prefix) :

    在访问局部变量之前,需要使用 DECLARE 声明局部变量 .

    它们可以用作局部变量和存储过程中的输入参数:

    DELIMITER //
    
    CREATE PROCEDURE sp_test(var1 INT) 
    BEGIN   
        DECLARE start  INT unsigned DEFAULT 1;  
        DECLARE finish INT unsigned DEFAULT 10;
    
        SELECT  var1, start, finish;
    
        SELECT * FROM places WHERE place BETWEEN start AND finish; 
    END; //
    
    DELIMITER ;
    
    CALL sp_test(5);
    

    如果缺少 DEFAULT 子句,则初始值为 NULL .

    局部变量的范围是声明它的 BEGIN ... END 块 .

    • Server System Variables (prefixed with @@):

    MySQL服务器将许多system variables配置为默认值 . 它们的类型可以是 GLOBALSESSIONBOTH .

    全局变量会影响服务器的整体操作,而会话变量会影响其对各个客户端连接的操作 .

    要查看正在运行的服务器使用的当前值,请使用 SHOW VARIABLES 语句或 SELECT @@var_name .

    SHOW VARIABLES LIKE '%wait_timeout%';
    
    SELECT @@sort_buffer_size;
    

    可以使用命令行或选项文件中的选项在服务器启动时设置它们 . 当服务器使用 SET GLOBALSET SESSION 运行时,大多数都可以动态更改:

    -- Syntax to Set value to a Global variable:
    SET GLOBAL sort_buffer_size=1000000;
    SET @@global.sort_buffer_size=1000000;
    
    -- Syntax to Set value to a Session variable:
    SET sort_buffer_size=1000000;
    SET SESSION sort_buffer_size=1000000;
    SET @@sort_buffer_size=1000000;
    SET @@local.sort_buffer_size=10000;
    
  • 8

    SET

    SET @var_name = value
    

    要么

    SET @var := value
    

    接受运算符 =:=


    选择

    SELECT col1, @var_name := col2 from tb_name WHERE "conditon";
    

    如果找到多个记录集只有col2中的最后一个值是keep(override);

    SELECT col1, col2 INTO @var_name, col3 FROM .....
    

    在这种情况下,select的结果不包含col2值

  • 0

    使用 setselect

    SET @counter := 100;
    SELECT @variable_name := value;
    

    例如:

    SELECT @price := MAX(product.price)
    FROM product
    
  • 2

    DECLARE var_name [,var_name] ... type [DEFAULT value]此语句声明存储程序中的局部变量 .

    防爆 . DECLARE id INT unsigned DEFAULT 1;

    要为变量提供默认值,请包含DEFAULT子句 . 该值可以指定为表达式;它不一定是常数 . 如果缺少DEFAULT子句,则初始值为NULL .

    局部变量被视为关于数据类型和溢出检查的存储例程参数 .

    变量声明必须出现在游标或处理程序声明之前 .

    局部变量名称不区分大小写 . 允许的字符和引用规则与其他标识符相同

    局部变量的范围是BEGIN ... END块,在其中声明它 . 除了那些声明具有相同名称的变量的块之外,可以在嵌套在声明块中的块中引用该变量 .

  • 16

    对于在concat_ws函数中使用@variable来获取连接值的任何人,不要忘记使用空值重新初始化它 . 否则它可以使用旧值进行同一会话 .

    Set @Ids = '';
    
    select 
      @Ids := concat_ws(',',@Ids,tbl.Id),
      tbl.Col1,
      ...
    from mytable tbl;
    

相关问题