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

新手上路,请多包涵

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

我想写一些类似的东西:

 SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

原文由 cdub 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 696
2 个回答

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

  1. 用户定义的变量(前缀为 @ ):

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

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

它们可用于 SELECT 使用 高级 MySQL 用户变量技术 的查询。

  1. 局部变量(无前缀):

局部变量需要在访问之前使用 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. 服务器系统变量(前缀为 @@ ):

    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;

原文由 Omesh 发布,翻译遵循 CC BY-SA 3.0 许可协议

我想在这里给出我的答案,以便人们可以尝试,我认为更容易理解的 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 );

原文由 Jean Carlos Souza 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题