489

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

我想写一些类似的东西:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;
4

7 回答 7

796

MySQL 中的变量主要分为三类:

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

    您可以访问任何用户定义的变量,而无需声明或初始化它。如果你引用一个没有被初始化的变量,它的值NULL和类型是字符串。

    SELECT @var_any_var_name
    

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

    SET @start = 1, @finish = 10;    
    

    或者

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

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

    用户定义的变量是特定于会话的。也就是说,一个客户端定义的用户变量不能被其他客户端看到或使用。

    它们可用于SELECT使用高级 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);
    

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

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

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

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

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

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

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

    它们可以在服务器启动时使用命令行或选项文件中的选项进行设置。它们中的大多数可以在服务器运行时使用SET GLOBALor动态更改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;
    
于 2012-08-01T07:48:27.897 回答
49

SET @var_name = value;     /* or */     SET @var_name := value;

运算符=:=都被接受


选择

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

如果找到多个记录集,则仅保留 col2 中的最后一个值(覆盖);

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

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


前两种方法都使用

-- TRIGGER_BEFORE_INSERT --- 从计算中设置列值

...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col =  IFNULL( @NR, 0 ) + 1;
...
于 2017-01-19T11:10:48.197 回答
21

使用设置选择

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

例子 :

SELECT @price := MAX(product.price)
FROM product 
于 2016-12-23T17:26:03.920 回答
10

不同类型的变量:

  • 局部变量(不以 @ 为前缀)是强类型的,并且作用域仅限于声明它们的存储程序块。请注意,如DECLARE Syntax下所述:

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

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

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

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

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

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

从 nGrams 中选择 COUNT(*) 到 @countTotal;

于 2019-08-06T12:14:43.743 回答
5
  • 宣布: SET @a = 1;

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

于 2019-11-09T12:38:42.547 回答
3

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

Set @Ids = '';

select 
  @Ids := concat_ws(',',@Ids,tbl.Id),
  tbl.Col1,
  ...
from mytable tbl;
于 2018-11-27T17:01:30.050 回答
-3

设定值

 declare @Regione int;   
 set @Regione=(select  id from users
 where id=1) ;
 select @Regione ;
于 2019-05-30T12:31:43.587 回答