如何在MySQL中声明一个变量?

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

我想这样写:

SET start = 1;
SET finish = 10;


SELECT * FROM places WHERE place BETWEEN start AND finish;
950606 次浏览

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

  1. < p > 用户定义变量(前缀为@):

    您可以访问任何用户定义的变量,而无需声明或 初始化它。如果你引用的变量没有被 初始化后,它的值为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值

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

    它们可以使用高级MySQL用户变量技术SELECT查询中使用

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

    本地变量需要在前面使用DECLARE声明 访问它。< / p > 它们可以用作局部变量和输入参数 在存储过程中:

    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. < p > 服务器系统变量(前缀为@@):

    MySQL服务器维护许多系统变量配置为默认值。 它们的类型可以是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;
    

使用选择

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

例子:

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

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

操作符: =都被接受


选择

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

如果多个记录集只发现col2中的最后一个值是keep(覆盖);

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;
...

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

Set @Ids = '';


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

SET Value

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

不同类型的变量:

  • 局部变量(它们没有@前缀)是强类型的,并且作用域局限于声明它们的存储程序块。请注意,正如声明的语法中所记录的:

DECLARE只允许在BEGIN…END复合语句,必须在其开头,在任何其他语句之前。

  • 用户变量(前缀@)是松散类型和范围的会话。注意,它们既不需要声明,也不能声明——直接使用即可。

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

此外,你需要把你的查询用圆括号括起来,以便作为子查询执行:

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

或者,你可以使用SELECT…成:

SELECT COUNT(*) INTO @countTotal FROM nGrams

    <李> < p >声明: 李SET @a = 1; < / p > < / > <李> < p >用法: 李INSERT INTO `t` (`c`) VALUES (@a); < / p > < / >

我想在这里给出我的答案,这样人们就可以尝试一下,我认为MySql的解决方案更容易理解:

set @countVal =  (select count(*) from STATION);
/**
499/2 = 249,5 -> 250 -- ceil
499/2 = 249,5 + 1 = 250,5 -- floor 250


500/2 = 250 -- ceil 250
= 250 + 1 = 251 -- flor 251
**/
set @ceilVal = ceil(@countVal/2);
set @floorVal = floor( (@countVal/2) + 1);
SELECT ROUND(AVG( latitude ),4) FROM
(SELECT @lineNum:= @lineNum + 1 as id,
lat_n as latitude
FROM STATION s, ( SELECT @lineNum :=0 ) pivot
ORDER BY lat_n) as a
WHERE id IN ( @ceilVal, @floorVal );