MySQL中声明变量的正确形式是啥:declare vs @ vs set? [复制]

Posted

技术标签:

【中文标题】MySQL中声明变量的正确形式是啥:declare vs @ vs set? [复制]【英文标题】:What is the correct form of declaring variables in MySQL: declare vs @ vs set? [duplicate]MySQL中声明变量的正确形式是什么:declare vs @ vs set? [复制] 【发布时间】:2021-01-16 00:38:43 【问题描述】:

我正在尝试学习 mysql,在做了一些数据库之后,我有以下问题。

在过程或函数中声明 变量 时,我可以这样做:

    使用@ 符号,像这样:SET @varname = varcontent 使用DECLARE关键字,像这样:DECLARE varname vartype 直接使用SET而不使用DECLARE,像这样SET varname = varcontent

我的疑问是:

哪种类型的语法是正确的,使用DECLARE@SET? 正确的做法是什么?

另外,我希望您能推荐一些关于 MySQL 的良好做法。

【问题讨论】:

如果您不声明 varname,您的第三个选项将失败。 【参考方案1】:

varname@varname 是两个不同的变量!


@varname - 用户定义的变量。

一直存在。即使它没有被初始化和/或使用,在这种情况下它也有 NULL 值。 IE。它不需要在声明中。

没有数据类型(或者它有动态数据类型)。通过分配另一个数据类型的值可以轻松更改数据类型。

此变量具有连接范围。 IE。它在连接存在之前一直存在,并且在显式更改之前不会更改其值。每个连接都有自己的同名变量,它们不会相互干扰。

例如,您可以将其设置为某个值,然后在调用的存储过程中使用/更改此值,然后在过程完成后在外部代码中使用过程中更改的值。

varname - 本地(声明的)变量

不存在于匿名代码中,仅存在于复合(BEGIN-END)代码块中。必须在块的开头显式声明。在区块结束时被销毁。局部变量的特殊类型是函数/过程参数 - 它在函数/过程头中声明并存在于函数/过程代码块中。

具有明确的数据类型。无法重新声明。

具有定义的块的范围。

如果某个范围内存在同名的变量和列,则该变量具有优先级并屏蔽该列,因此如果需要访问该列,则必须指定表别名。


在大多数构造中,可以使用任何变量类型。但有时只能使用其中一种类型 - 请参阅用户手册。


1. 像set @varname= varcontent一样使用@

这个语句用一些值初始化用户定义的变量。

2. 使用 declare varname vartype 之类的声明

此语句声明局部变量。可能位于 BEGIN-END 块的开头。不为变量设置值(为 NULL)。

3.直接使用set varname=varcontent而不声明

导致错误。

【讨论】:

感谢帮助

以上是关于MySQL中声明变量的正确形式是啥:declare vs @ vs set? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

declare 在SQL中是啥意思,怎么用?

oracle sql语法 ①中的:1代表啥;②中声明的变量类型是啥;③中的赋值语法是啥

在catch子句中声明e变量的正确方法是啥[关闭]

mysql 变量设置问题

MySQL存储过程变量定义

MySQL-5.7 游标及DECLARE