如何在MySQL中声明变量?

cdu*_*dub 346 mysql sql

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

我想写一些类似的东西:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;
Run Code Online (Sandbox Code Playgroud)

Ome*_*esh 582

MySQL中主要有三种变量:

  1. 用户定义的变量(前缀为@):

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

    SELECT @var_any_var_name
    
    Run Code Online (Sandbox Code Playgroud)

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

    SET @start = 1, @finish = 10;    
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    SELECT @start := 1, @finish := 10;
    
    SELECT * FROM places WHERE place BETWEEN @start AND @finish;
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    它们可以在SELECT使用Advanced MySQL用户变量技术的查询中使用.

  2. 局部变量(无前缀):

    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);
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  3. 服务器系统变量(前缀@@):

    MySQL服务器维护许多配置为默认值的系统变量.它们可以是类型GLOBAL,SESSIONBOTH.

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

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

    SHOW VARIABLES LIKE '%wait_timeout%';
    
    SELECT @@sort_buffer_size;
    
    Run Code Online (Sandbox Code Playgroud)

    可以使用命令行或选项文件中的选项在服务器启动时设置它们.在服务器运行时,大多数都可以动态更改SET GLOBAL或使用SET 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;
    
    Run Code Online (Sandbox Code Playgroud)

  • `=`运算符仅适用于`SET`子句.要为`SELECT`查询中的变量赋值,可以使用`:=`运算符,例如`SELECT @start:= 1` (23认同)
  • 某种程度上````=````运算符对我不起作用.当我使用````=````运算符时它工作正常. (3认同)
  • @billynoah我假设它意味着用户定义的会话变量(以@开头)不需要显式声明; 您可以立即分配给他们,就像他们已经被宣布一样. (3认同)
  • 您能否澄清一下这意味着什么:"不需要声明用前缀@"表示的用户定义的会话变量? (2认同)
  • 您可以使用以下select语句的结果分配变量:SET @subscriptionId =(从User中选择subscriptionId,其中emailAddress='ac@tmail.com'); (2认同)

bor*_*nac 25

SET @var_name = value 
Run Code Online (Sandbox Code Playgroud)

要么

SET @var := value
Run Code Online (Sandbox Code Playgroud)

operator =:=都被接受


选择

SELECT col1, @var_name := col2 from tb_name WHERE "conditon";
Run Code Online (Sandbox Code Playgroud)

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

SELECT col1, col2 INTO @var_name, col3 FROM .....
Run Code Online (Sandbox Code Playgroud)

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

  • `=` 和 `:=` 有什么区别? (3认同)
  • 我想对于mysql SELECT语法是必要的,以将=(比较)的含义与:=(asign)分开 (2认同)
  • 在某些情况下,变量中保留的值可能与返回的最后一行不对应。例如,“SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10”似乎在排序依据完成之前评估变量赋值,以便返回@var 的值甚至可能与任何返回的行都不相关。不过,文档没有说明在什么条件下会发生这种情况。 (2认同)

Kou*_*zdi 13

使用设置选择

SET @counter := 100;
SELECT @variable_name := value;
Run Code Online (Sandbox Code Playgroud)

例如:

SELECT @price := MAX(product.price)
FROM product 
Run Code Online (Sandbox Code Playgroud)


yay*_*aya 11

  • 宣布: SET @a = 1;

  • 用法: INSERT INTO `t` (`c`) VALUES (@a);


小智 8

不同类型的变量:

  • 局部变量(没有@ 前缀)是强类型的,并且作用域限定在声明它们的存储程序块中。请注意,如DECLARE Syntax 中所述

DECLARE 只允许在 BEGIN ... END 复合语句中使用,并且必须在其开头,在任何其他语句之前。

  • 用户变量(以@ 为前缀)是松散类型的并且作用域为会话。请注意,它们既不需要也不能声明——只需直接使用它们即可。

因此,如果您正在定义一个存储程序并且确实需要一个“局部变量”,您将需要删除 @ 字符并确保您的 DECLARE 语句位于程序块的开头。否则,要使用“用户变量”,请删除 DECLARE 语句。

此外,您需要将查询括在括号中,以便将其作为子查询执行:

SET @countTotal = (SELECT COUNT(*) FROM nGrams);

否则,您可以使用 SELECT ... INTO:

SELECT COUNT(*) INTO @countTotal FROM nGrams;