# 变量

在本教程中，您将了解和学习存储过程中的变量，包括如何声明和使用变量。此外，您将了解变量的作用域(范围)。

变量是一个命名数据对象，变量的值可以在存储过程执行期间更改。我们通常使用[存储过程](http://www.yiibai.com/mysql/stored-procedure.html)中的变量来保存直接/间接结果。 这些变量是存储过程的本地变量。

> 注意：变量必须先声明后，才能使用它。

## 声明变量

要在存储过程中声明一个变量，可以使用`DECLARE`语句，如下所示：

```sql
DECLARE variable_name datatype(size) DEFAULT default_value;
```

下面来更详细地解释上面的语句：

* *首先*，在`DECLARE`关键字后面要指定变量名。变量名必须遵循MySQL表列名称的命名规则。
* *其次*，指定变量的数据类型及其大小。变量可以有任何[MySQL数据类型](http://www.yiibai.com/mysql/data-types.html)，如`INT`，`VARCHAR`，`DATETIME`等。
* **第三**，当声明一个变量时，它的初始值为`NULL`。但是可以使用`DEFAULT`关键字为变量分配默认值。

例如，可以声明一个名为`total_sale`的变量，数据类型为`INT`，默认值为`0`，如下所示：

```sql
DECLARE total_sale INT DEFAULT 0;
```

MySQL允许您使用单个`DECLARE`语句声明共享相同数据类型的两个或多个变量，如下所示：

```sql
DECLARE x, y INT DEFAULT 0;
```

我们声明了两个整数变量`x`和`y`，并将其默认值设置为`0`。

## 分配变量值

当声明了一个变量后，就可以开始使用它了。要为变量分配一个值，可以使用`SET`语句，例如：

```sql
DECLARE total_count INT DEFAULT 0;
SET total_count = 10;
```

上面语句中，分配`total_count`变量的值为`10`。

除了`SET`语句之外，还可以使用`SELECT INTO`语句将查询的结果分配给一个变量。 请参阅以下示例：

```sql
DECLARE total_products INT DEFAULT 0

SELECT COUNT(*) INTO total_products
FROM products
```

在上面的例子中：

* *首先*，声明一个名为`total_products`的变量，并将其值初始化为`0`。
* *然后*，使用`SELECT INTO`语句来分配值给`total_products`变量，从[示例数据库(yiibaidb)](http://www.yiibai.com/mysql/sample-database.html)中的`products`表中选择的产品数量。

## 变量范围(作用域)

一个变量有自己的范围(作用域)，它用来定义它的生命周期。 如果在存储过程中声明一个变量，那么当达到存储过程的`END`语句时，它将超出范围，因此在其它代码块中无法访问。

如果您在`BEGIN END`块内声明一个变量，那么如果达到`END`，它将超出范围。 可以在不同的作用域中声明具有相同名称的两个或多个变量，因为变量仅在自己的作用域中有效。 但是，在不同范围内声明具有相同名称的变量不是很好的编程习惯。

以`@`符号开头的变量是会话变量。直到会话结束前它可用和可访问。

在本教程中，我们向您展示了如何在存储过程中声明变量，并讨论了变量的范围(作用域)。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hezhiqiang-book.gitbook.io/mysql/di-san-zhang/bian-liang.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
