SELECT @start := 1, @finish := 10;
SELECT * FROM places WHERE place BETWEEN @start AND @finish;
用户变量可以从一组有限的数据类型中赋值:整数、十进制、浮点、二进制或非二进制字符串或NULL值。 用户定义变量是特定于会话的。也就是说,由一个客户机定义的用户变量不能被其他客户机看到或使用。 它们可用于使用Advanced MySQL user variable techniques的SELECT查询。 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);
-- 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 @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 );
8条答案
按热度按时间6mw9ycah1#
MySQL中主要有三种类型的变量:
1.User-defined variables(前缀为
@
):您可以访问任何用户定义的变量,而无需声明或初始化它。如果您引用尚未初始化的变量,则它的值为
NULL
,类型为string。可以使用
SET
或SELECT
语句初始化变量:或
用户变量可以从一组有限的数据类型中赋值:整数、十进制、浮点、二进制或非二进制字符串或NULL值。
用户定义变量是特定于会话的。也就是说,由一个客户机定义的用户变量不能被其他客户机看到或使用。
它们可用于使用Advanced MySQL user variable techniques的
SELECT
查询。1.Local Variables(无前缀):
在访问局部变量之前,需要使用
DECLARE
声明它。它们可以用作局部变量和存储过程中的输入参数:
如果缺少
DEFAULT
子句,则初始值为NULL
。局部变量的作用域是声明它的
BEGIN ... END
块。1.Server System Variables(前缀为
@@
):MySQL服务器维护许多配置为默认值的system variables。它们可以是
GLOBAL
、SESSION
或BOTH
类型。全局变量影响服务器的整体操作,而会话变量影响服务器对单个客户端连接的操作。
要查看正在运行的服务器所使用的当前值,请使用
SHOW VARIABLES
语句或SELECT @@var_name
。它们可以在服务器启动时使用命令行或选项文件中的选项进行设置。其中大部分可以在服务器运行时使用
SET GLOBAL
或SET SESSION
进行动态更改:4szc88ey2#
设置
运算符**=和:=**都可以接受
选择
如果发现多个记录集,则仅保留
col2
中的最后一个值(覆盖);在这种情况下,
Select
的结果不包含col2
值Ex两种方法均使用
-- TRIGGER_BEFORE_INSERT ---根据计算设置列值
zwghvu4y3#
使用设置或选择
示例:
z4bn682m4#
不同类型的变量:
*局部变量(没有@前缀)是强类型的,作用域是声明它们的存储程序块。注意,如DECLARE Syntax下所述:
DECLARE只能在开始... END复合语句中使用,并且必须位于该语句的开头,在任何其他语句之前。
*用户变量(前缀为@)是松散类型的,作用域为会话。请注意,它们既不需要也不可以声明-直接使用即可。
因此,如果您正在定义存储程序,并且确实需要“局部变量”,则需要删除@字符,并确保DECLARE语句位于程序块的开头。否则,要使用“用户变量”,请删除DECLARE语句。
此外,您需要将查询括在括号中,以便将其作为子查询执行:
设置@计数总计=(从nGrams中选择计数());
或者,您可以使用SELECT... INTO:
从nGrams中选择计数()至@countTotal;
axzmvihb5#
SET @a = 1;
INSERT INTO
t(
c) VALUES (@a);
puruo6ea6#
对于任何在concat_ws函数中使用@variable来获取连接值的人,不要忘记用空值重新初始化它。否则,它可以在同一会话中使用旧值。
vhmi4jdf7#
我想给予我的awnswer在这里,所以人们可以尝试,解决方案的MySql,我认为是更容易理解:
ki1q1bka8#
设置值