文章目录
5.2 MySQL存储函数
在MySQL中,存储函数(Stored Function)是一种用户定义的函数,它可以在SQL语句中被调用,就像内置的MySQL函数一样。存储函数在创建时保存在数据库中,可以用于计算和返回一个值。
创建存储函数
创建存储函数的基本语法如下:
CREATE FUNCTION function_name (参数列表)
RETURNS 返回类型
BEGIN
-- 函数体,包含SQL语句和逻辑
RETURN 返回值;
END
例如,创建一个存储函数来计算两个数的和:
DELIMITER $$
CREATE FUNCTION `add_two_numbers`(a INT, b INT)
RETURNS INT
BEGIN
RETURN a + b;
END$$
DELIMITER ;
在这个例子中,我们使用DELIMITER
来改变语句的结束符号,这样就可以在函数体中使用分号(;
)而不会结束函数定义。
使用存储函数
一旦存储函数被创建,你就可以在SQL语句中像使用内置函数一样使用它:
SELECT add_two_numbers(3, 4);
这将返回7。
删除存储函数
如果你需要删除存储函数,可以使用DROP FUNCTION
语句:
DROP FUNCTION IF EXISTS `add_two_numbers`;
注意事项
- 存储函数不能执行有副作用的操作,如修改数据。
- 存储函数不能包含事务控制语句,如
COMMIT
或ROLLBACK
。 - 存储函数可以调用其他存储函数,但不能调用存储过程。
- 存储函数在定义时必须指定返回类型。
5.2.1 常量与变量
在MySQL中,常量是那些在定义后不会改变值的数据项。常量可以是字符串、数值、日期和时间、布尔值或空值(NULL)。以下是MySQL中不同类型的常量:
1. 字符串常量
字符串常量是由单引号(')或双引号(")包围的文本。在MySQL中,单引号和双引号都可以用来定义字符串常量,但推荐使用单引号。
示例:
SELECT 'Moonshot AI' AS string_constant;
2. 数值常量
数值常量是表示数字的常量,可以是整数或浮点数。整数没有小数点,而浮点数包含小数点。
示例:
SELECT 100 AS integer_constant;
SELECT 3.14 AS floating_point_constant;
3. 日期和时间常量
日期和时间常量可以是标准的日期和时间格式,也可以是其他格式,只要它们可以用MySQL的日期和时间函数解析。
示例:
SELECT '2024-05-23' AS date_constant;
SELECT '15:30:00' AS time_constant;
SELECT '2024-05-23 15:30:00' AS datetime_constant;
4. 布尔值常量
MySQL中的布尔值常量实际上是整数的别名,其中TRUE
等同于1
,FALSE
等同于0
。
示例:
SELECT TRUE AS boolean_true;
SELECT FALSE AS boolean_false;
5. 空值(NULL)
NULL
是一个特殊的值,表示未知或不存在的值。在SQL中,NULL
用于表示缺失或不适用的数据。
示例:
SELECT NULL AS null_constant;
在MySQL中,NULL
与布尔值FALSE
不同。NULL
表示“没有值”,而FALSE
表示“假”。例如,NULL
在比较操作中不等于FALSE
:
SELECT NULL = FALSE; -- 返回NULL,因为NULL与任何值(包括FALSE)都不相等
在编写SQL查询时,了解这些常量的类型和用法是非常重要的,因为它们是构建查询和表达式的基础。
在MySQL中,变量可以用于存储用户定义的值,这些值在查询、存储过程、函数或整个会话中可以被检索和修改。变量分为两种类型:局部变量和全局变量。
1. 局部变量
局部变量只在定义它们的存储程序(如存储过程或函数)中可见。它们在存储程序被调用时创建,并在存储程序结束时销毁。
创建和使用局部变量的示例:
类型 | 描述 | 代码示例 | 预期结果 |
---|---|---|---|
局部变量 | 在存储过程中使用,用于临时存储数据 | SET @local_var = 10; | @local_var 的值为 10 |
SELECT @local_var; | 10 |
存储过程示例:
DELIMITER $$
CREATE PROCEDURE GetEmployeeCount()
BEGIN
DECLARE emp_count INT;
SELECT COUNT(*) INTO emp_count FROM employees;
SELECT emp_count;
END$$
DELIMITER ;
在这个例子中,emp_count
是一个局部变量,用于存储从employees
表中检索到的员工数量。
2. 全局变量
全局变量在数据库服务器的整个会话中都是可见的。它们可以在任何存储程序或查询中被检索和修改。
创建和使用全局变量的示例:
类型 | 描述 | 代码示例 | 预期结果 |
---|---|---|---|
全局变量 | 在会话中全局可见,用于存储跨多个查询或存储程序的数据 | SET @global_var = 20; | @global_var 的值为 20 |
SELECT @global_var; | 20 |
设置和检索全局变量的示例:
SET @global_var = 20;
SELECT @global_var;
在这个例子中,@global_var
是一个全局变量,可以在当前会话的任何地方被检索和修改。
注意事项
- 局部变量通常以
@
符号开头,后面紧跟变量名。 - 全局变量也以
@
符号开头,但可以通过特定的命令设置为全局,或者在任何存储程序之外设置和检索。 - 在存储过程中,使用
DECLARE
语句来定义局部变量。 - 变量可以在
SET
语句中赋值,也可以在SELECT ... INTO
语句中赋值。 - 变量的值在会话期间持续存在,除非被显式改变或会话结束。
5.2.2 语句块、注释和重置语句结束标记
在MySQL中,语句块、注释和重置语句结束标记是编写复杂SQL语句和程序时常用的工具。
1. 语句块
语句块允许你将多个SQL语句组合在一起执行。在存储过程和函数中,你可以使用语句块来组织代码,使其更加模块化和易于理解。
示例:
DELIMITER $$
CREATE PROCEDURE MyProcedure()
BEGIN
-- 语句块开始
SELECT 'Hello' AS greeting;
SELECT 'World' AS subject;
-- 语句块结束
END$$
DELIMITER ;
在这个例子中,BEGIN
和END
关键字之间的部分是一个语句块,包含了两个SELECT
语句。
2. 注释
注释是用来解释代码的文本,它们会被MySQL服务器忽略。注释可以帮助其他开发者理解代码的意图,也可以用于临时禁用代码。
单行注释示例:
-- 这是一个单行注释
SELECT * FROM table_name; -- 这也是一个单行注释
多行注释示例:
/* 这是一个多行注释
它可以跨越多行。
这里还有一部分注释。 */
SELECT * FROM table_name;
3. 重置语句结束标记
在MySQL中,语句结束标记默认是分号(;
)。但是,当你创建存储过程或函数时,你可能需要在代码中使用分号,而又不想立即结束整个存储过程或函数的定义。这时,你可以使用DELIMITER
语句来改变语句结束标记。
重置语句结束标记的示例:
DELIMITER //
CREATE PROCEDURE MyProcedure()
BEGIN
SELECT 'Hello World';
END //
DELIMITER ;
在这个例子中,首先将语句结束标记从;
改为//
。这样就可以在存储过程的定义中使用分号,而不会导致存储过程定义的结束。完成存储过程的定义后,再次将语句结束标记重置为;
。
注意事项
- 语句块只能用在存储过程、函数、触发器等数据库对象中。
- 注释不会影响SQL语句的执行,它们只是提供额外的信息。
- 重置语句结束标记通常只在定义存储过程、函数或触发器时使用。
- 使用
DELIMITER
时,新的结束标记必须是一个不在你定义的代码中出现的字符或字符串序列。
5.2.3 存储函数的操作
在MySQL中,存储函数是一种用户定义的函数,它可以在SQL语句中被调用。以下是操作存储函数的基本步骤:
1. 创建存储函数
创建存储函数的基本语法如下:
CREATE FUNCTION function_name (参数列表)
RETURNS 返回类型
BEGIN
-- 函数体,包含SQL语句和逻辑
RETURN 返回值;
END
示例:
创建一个存储函数来计算两个数的和:
DELIMITER $$
CREATE FUNCTION `add_numbers`(a INT, b INT)
RETURNS INT
BEGIN
RETURN a + b;
END$$
DELIMITER ;
在这个例子中,我们首先使用DELIMITER
改变了语句的结束标记,以便在函数定义中使用分号(;
)。
2. 调用存储函数
一旦存储函数被创建,你就可以在SQL语句中像使用内置函数一样使用它:
SELECT add_numbers(3, 4);
这将返回7。
3. 删除存储函数
如果你需要删除存储函数,可以使用DROP FUNCTION
语句:
DROP FUNCTION IF EXISTS `add_numbers`;
这个语句会删除名为add_numbers
的存储函数。使用IF EXISTS
是一个好习惯,因为它可以防止在函数不存在时产生错误。
注意事项
- 在创建存储函数时,确保函数体内的逻辑是正确的,并且返回了正确的数据类型。
- 存储函数不能执行有副作用的操作,如修改数据。
- 存储函数可以调用其他存储函数,但不能调用存储过程。
- 在调用存储函数时,你可以像调用内置函数一样在任何地方使用它,包括
SELECT
、INSERT
、UPDATE
和DELETE
语句中。 - 删除存储函数时,确保没有其他数据库对象依赖于它,否则可能会产生错误。