MySQL - 变量



通常,变量是在程序中存储某些信息的容器。变量的值可以根据需要更改多次。每个变量都有一个数据类型,指定我们可以存储在其中的数据类型,例如整数、字符串、浮点数等。

  • 在某些编程语言(如 Java、C、C++ 等)中,我们需要在为变量赋值之前声明变量的数据类型。

  • 在像 Python 这样的语言中,变量的数据类型是根据分配给它的值推断出来的。无需单独声明数据类型。

  • 在 MySQL 中,无需声明数据类型,我们可以使用 SET 语句简单地定义一个带有值的变量。

MySQL 中的变量

变量的主要目的是标记一个或多个内存位置并在其中存储数据,以便可以在整个程序中使用它。

我们用来声明和定义变量的字符称为字面量,字面量可以是除特殊字符、数字和保留关键字之外的任何内容。

在 MySQL 中,有三种类型的变量。下面描述了相同的内容:

  • 用户定义变量

  • 局部变量

  • 系统变量

用户定义变量

用户定义变量允许我们在一个语句中存储一个值,然后在另一个语句中引用它。为此,MySQL 提供了 SET 和 SELECT 命令来声明变量。这些变量名将以符号“@”作为前缀。我们可以根据情况使用 = 或 := 符号。用户定义的数据类型可以是以下任何一种:整数、十进制、布尔值等。

语法

以下是使用 SET 语句在 MySQL 中声明用户定义变量的语法:

SELECT @variable_name = value

示例

在以下查询中,我们使用 SET 语句为变量赋值,如下所示:

SET @Name = 'Michael';

使用 SELECT 语句,我们可以显示 @name 变量的值:

SELECT @Name;

输出

上面查询的输出如下所示:

@Name
Michael

示例

在这里,我们使用 SELECT 语句为变量赋值:

SELECT @test := 10;

输出

执行给定查询后,输出将显示如下:

@test := 10
10

示例

让我们使用以下查询创建一个名为 CUSTOMERS 的表:

CREATE TABLE CUSTOMERS(
   ID INT AUTO_INCREMENT PRIMARY KEY,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2)
);

现在,让我们使用 INSERT INTO 语句将值插入到上面创建的表中:

INSERT INTO CUSTOMERS (NAME, AGE, ADDRESS, SALARY) VALUES 
('Ramesh', 32, 'Ahmedabad', 2000.00),
('Khilan', 25, 'Delhi', 1500.00),
('Kaushik', 23, 'Kota', 2000.00),
('Chaitali', 25, 'Mumbai', 6500.00),
('Hardik', 27, 'Bhopal', 8500.00),
('Komal', 22, 'Hyderabad', 4500.00),
('Muffy', 24, 'Indore', 10000.00);

CUSTOMERS 表创建如下:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

现在,让我们使用 SELECT 语句声明一个名为 @max_salary 的变量,以显示 CUSTOMERS 表中的最大工资值:

SELECT @max_salary := MAX(salary) FROM CUSTOMERS;

然后,我们将选择表中工资等于@max_salary 变量的记录:

SELECT * FROM CUSTOMERS WHERE SALARY = @max_salary;

输出

上面查询的输出如下所示:

ID NAME AGE ADDRESS SALARY
7 Muffy 24 Indore 10000.00

局部变量

可以使用DECLARE 关键字声明 MySQL 局部变量。当我们声明局部变量时,不会使用 @ 符号作为前缀。此变量是强类型变量,这意味着我们绝对需要声明数据类型。

可以在声明变量时使用 MySQL DEFAULT 关键字来设置变量的默认值。这是一个可选参数,如果我们不定义它,则初始值将为NULL

语法

以下是 MySQL 中声明局部变量的语法:

DECLARE variable_name1, variabale_name2, ...

data_type [DEFAULT default_value];

示例

在下面的示例中,我们在存储过程中使用 DECLARE 语句。

DELIMITER //
CREATE PROCEDURE salaries()
BEGIN
   DECLARE Ramesh INT;
   DECLARE Khilan INT DEFAULT 30000;
   DECLARE Kaushik INT;
   DECLARE Chaitali INT;
   DECLARE Total INT;
   SET Ramesh = 20000;
   SET Kaushik = 25000;
   SET Chaitali = 29000;
   SET Total = Ramesh+Khilan+Kaushik+Chaitali;
   SELECT Total,Ramesh,Khilan,Kaushik,Chaitali;
END //

现在,让我们使用以下查询调用存储过程:

CALL salaries() //;

输出

以下是输出:

总数 Ramesh Khilan Kaushik Chaitali
104000 20000 30000 25000 29000

系统变量

MySQL **系统变量**是由 MySQL 预定义的。这些变量包含我们需要的数据,以便与数据库一起工作。每个 MySQL 系统变量都有一个默认值。

MySQL 中的 SET 命令可以在运行时用于动态更改系统变量的值。

SHOW VARIABLES 命令有两个可用的变量作用域修饰符。它们是 GLOBAL 和 SESSION。

  • GLOBAL 变量在整个生命周期内都处于活动状态。

  • SESSION 变量仅在当前会话中可用。

以下是显示 MySQL 中所有系统变量的命令:

SHOW [GLOBAL | SESSION] VARIABLES;

示例

在下面的示例中,让我们使用 SHOW VARIABLES 查询显示现有的全局系统变量:

SHOW VARIABLES LIKE '%table%';

变量以如下表格式显示:

变量名
big_tables OFF
default_table_encryption OFF
innodb_file_per_table ON
innodb_ft_aux_table
innodb_ft_server_stopword_table
innodb_ft_user_stopword_table
innodb_table_locks ON
innodb_temp_tablespaces_dir .\#innodb_temp\
innodb_undo_tablespaces 2
innodb_validate_tablespace_paths ON
lower_case_table_names 1
max_heap_table_size 16777216
old_alter_table OFF
performance_schema_max_table_handles -1
performance_schema_max_table_instances -1
performance_schema_max_table_lock_stat -1
show_create_table_skip_secondary_engine OFF
show_create_table_verbosity OFF
table_definition_cache 2000
table_encryption_privilege_check OFF
table_open_cache 4000
table_open_cache_instances 16
tablespace_definition_cache 256
temptable_max_mmap 1073741824
temptable_max_ram 1073741824
temptable_use_mmap ON
tmp_table_size 99614720
updatable_views_with_limit YES

现在,使用下面的查询,我们将获取 MySQL "key_buffer_size" 变量的当前值:

SELECT @@key_buffer_size;

输出

以下是上述查询的输出:

@@key_buffer_size
8388608
广告