ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我想写一些类似的东西:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;
不要忘记您可能需要“允许用户变量 = True”。

M
Manos Nikolaidis

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

用户定义的变量(以@为前缀):您可以访问任何用户定义的变量,而无需声明或初始化它。如果你引用一个没有被初始化的变量,它的值是 NULL 和一个字符串类型。 SELECT @var_any_var_name 您可以使用 SET 或 SELECT 语句初始化变量: SET @start = 1, @finish = 10;或选择 @start := 1, @finish := 10; SELECT * FROM places WHERE place BETWEEN @start AND @finish;可以从一组有限的数据类型中为用户变量分配一个值:整数、十进制、浮点、二进制或非二进制字符串,或 NULL 值。用户定义的变量是特定于会话的。也就是说,一个客户端定义的用户变量不能被其他客户端看到或使用。它们可用于使用高级 MySQL 用户变量技术的 SELECT 查询。局部变量(无前缀):局部变量需要在访问之前使用 DECLARE 声明。它们可以用作存储过程中的局部变量和输入参数:DELIMITER // CREATE PROCEDURE sp_test(var1 INT) BEGIN DECLARE start INT unsigned DEFAULT 1; DECLARE finish INT 无符号 DEFAULT 10;选择 var1,开始,完成; SELECT * FROM places WHERE place BETWEEN start and finish;结尾; // 分隔符;调用 sp_test(5);如果缺少 DEFAULT 子句,则初始值为 NULL。局部变量的范围是声明它的 BEGIN ... END 块。服务器系统变量(以@@ 为前缀):MySQL 服务器维护许多配置为默认值的系统变量。它们可以是 GLOBAL、SESSION 或 BOTH 类型。全局变量影响服务器的整体操作,而会话变量影响其对单个客户端连接的操作。要查看正在运行的服务器使用的当前值,请使用 SHOW VARIABLES 语句或 SELECT @@var_name。显示变量,如“%wait_timeout%”;选择@@sort_buffer_size;它们可以在服务器启动时使用命令行或选项文件中的选项进行设置。大多数可以在服务器运行时使用 SET GLOBAL 或 SET SESSION 动态更改: -- 将值设置为全局变量的语法: SET GLOBAL sort_buffer_size=1000000; SET @@global.sort_buffer_size=1000000; -- 将值设置为会话变量的语法:SET sort_buffer_size=1000000;设置会话排序缓冲区大小=1000000; SET @@sort_buffer_size=1000000; SET @@local.sort_buffer_size=10000;


不知何故,= 运算符对我不起作用。当我使用 := 运算符时效果很好。
= 运算符仅适用于 SET 子句。要在 SELECT 查询中为变量赋值,您可以使用 := 运算符,例如 SELECT @start := 1
您能否澄清一下这是什么意思:“无需声明用前缀 @ 表示的用户定义的会话变量”?
@billynoah我假设这意味着用户定义的会话变量(以@开头)不需要显式声明;您可以立即分配给它们,就好像它们已经被声明一样。
您可以使用这样的 select 语句的结果分配一个变量: SET @subscriptionId = (select subscriptionId from User where emailAddress='ac@tmail.com');
b
bortunac

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

=:= 有什么区别?
我想对于 mysql SELECT 语法是必要的,以将 =(比较)的含义与 :=(asign)分开
在某些情况下,变量中留下的值可能与返回的最后一行不对应。例如,SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10 似乎在 order-by 完成之前评估变量分配,因此 @var 的返回值甚至可能与任何返回的行无关。但是,文档没有说明在什么条件下会发生这种情况。
M
Mohammad Mahdi KouchakYazdi

使用设置或选择

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

例子 :

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

m
mohammadAli

不同类型的变量:

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

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

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

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

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

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

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

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


y
yaya

声明:SET @a = 1;

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


t 用于表,c 用于列?
@carloswm85 是的
I
Imran Javed

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

Set @Ids = '';

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

H
Hari Lakkakula

设定值

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