如何在MySQL中声明变量?

qacovj5a  于 2022-12-26  发布在  Mysql
关注(0)|答案(8)|浏览(205)

如何在MySQL中声明变量,以便我的第二个查询可以使用它?
我想这样写:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;
6mw9ycah

6mw9ycah1#

MySQL中主要有三种类型的变量:
1.User-defined variables(前缀为@):
您可以访问任何用户定义的变量,而无需声明或初始化它。如果您引用尚未初始化的变量,则它的值为NULL,类型为string。

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查询。
1.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块。
1.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;
4szc88ey

4szc88ey2#

设置

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

运算符**=:=**都可以接受
选择

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

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

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

在这种情况下,Select的结果不包含col2
Ex两种方法均使用
-- TRIGGER_BEFORE_INSERT ---根据计算设置列值

...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col = IFNULL( @NR, 0 ) + 1;
...
zwghvu4y

zwghvu4y3#

使用设置选择

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

示例:

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

z4bn682m4#

不同类型的变量:

*局部变量(没有@前缀)是强类型的,作用域是声明它们的存储程序块。注意,如DECLARE Syntax下所述:

DECLARE只能在开始... END复合语句中使用,并且必须位于该语句的开头,在任何其他语句之前。

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

因此,如果您正在定义存储程序,并且确实需要“局部变量”,则需要删除@字符,并确保DECLARE语句位于程序块的开头。否则,要使用“用户变量”,请删除DECLARE语句。
此外,您需要将查询括在括号中,以便将其作为子查询执行:
设置@计数总计=(从nGrams中选择计数());
或者,您可以使用SELECT... INTO:
从nGrams中选择计数(
)至@countTotal;

axzmvihb

axzmvihb5#

  • 宣布:SET @a = 1;
  • 用法:INSERT INTOt(c) VALUES (@a);
puruo6ea

puruo6ea6#

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

Set @Ids = '';

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

vhmi4jdf7#

我想给予我的awnswer在这里,所以人们可以尝试,解决方案的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 );
ki1q1bka

ki1q1bka8#

设置值

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

相关问题