如何在MySQL中声明变量?

时间:2012-08-01 07:47:52

标签: mysql sql

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

我想写一些像:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

8 个答案:

答案 0 :(得分:516)

MySQL中主要有三种类型的变量:

  1. User-defined variables(以@为前缀):

    您可以访问任何用户定义的变量,而无需声明或 初始化它。如果你引用一个尚未变量的变量 初始化时,它的值为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查询中使用它们。

  2. Local Variables(无前缀):

    之前需要使用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. Server System Variables(以@@为前缀):

    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;
    

答案 1 :(得分:21)

  

SET

SET @var_name = value 

OR

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值

答案 2 :(得分:11)

使用设置选择

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

示例:

{{1}}

答案 3 :(得分:2)

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

实施例。 DECLARE id INT unsigned DEFAULT 1;

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

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

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

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

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

答案 4 :(得分:2)

不同类型的变量:

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

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

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

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

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

  

SET @countTotal =(从nGrams中选择COUNT(*)个);

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

  

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

答案 5 :(得分:0)

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

1.x

答案 6 :(得分:0)

设置值

 declare Regione int;   
 set Regione=(select  id from users
 where id=1) ;
 select Regione ;

答案 7 :(得分:0)

  • 声明: final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, layoutType, 0, // I HAVE CHANGED THIS FROM NOT FOCUS TO ZERO PixelFormat.TRANSLUCENT); params.gravity = Gravity.TOP | Gravity.START; params.x = 0; // Initial Position of window params.y = 100; // Initial Position of window mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); mWindowManager.addView(mFloatingWidget, params);

  • 用法: SET @a = 1;