如何在mysql中声明一个变量,以便我的第二个查询可以使用它?
我想写一些类似的东西:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
MySQL 中的变量主要分为三类:
用户定义的变量(以 为前缀@
):
您可以访问任何用户定义的变量,而无需声明或初始化它。如果你引用一个没有被初始化的变量,它的值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 用户变量技术的查询。
局部变量(无前缀):
局部变量需要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
是声明它的块。
服务器系统变量(以 为前缀@@
):
MySQL 服务器维护许多配置为默认值的系统变量。它们可以是类型GLOBAL
,SESSION
或BOTH
。
全局变量影响服务器的整体操作,而会话变量影响其对单个客户端连接的操作。
要查看正在运行的服务器使用的当前值,请使用SHOW VARIABLES
语句 或SELECT @@var_name
。
SHOW VARIABLES LIKE '%wait_timeout%';
SELECT @@sort_buffer_size;
它们可以在服务器启动时使用命令行或选项文件中的选项进行设置。它们中的大多数可以在服务器运行时使用SET GLOBAL
or动态更改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;
放
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;
...
使用设置或选择
SET @counter := 100;
SELECT @variable_name := value;
例子 :
SELECT @price := MAX(product.price)
FROM product
不同类型的变量:
DECLARE 仅允许在 BEGIN ... END 复合语句中使用,并且必须位于其开头,在任何其他语句之前。
因此,如果您正在定义一个存储程序并且确实需要一个“局部变量”,则需要删除 @ 字符并确保您的 DECLARE 语句位于程序块的开头。否则,要使用“用户变量”,请删除 DECLARE 语句。
此外,您需要将查询括在括号中,以便将其作为子查询执行:
SET @countTotal = (SELECT COUNT(*) FROM nGrams);
否则,您可以使用 SELECT ... INTO:
从 nGrams 中选择 COUNT(*) 到 @countTotal;
宣布:
SET @a = 1;
用法:
INSERT INTO `t` (`c`) VALUES (@a);
对于任何在 concat_ws 函数中使用 @variable 来获取连接值的人,不要忘记用空值重新初始化它。否则,它可以对同一会话使用旧值。
Set @Ids = '';
select
@Ids := concat_ws(',',@Ids,tbl.Id),
tbl.Col1,
...
from mytable tbl;
declare @Regione int;
set @Regione=(select id from users
where id=1) ;
select @Regione ;