MySQL 函数与自定义逻辑

MySQLBeginner
立即练习

介绍

在本实验中,你将学习如何在 MySQL 中创建和使用自定义函数。本实验将通过创建一个计算矩形面积的函数来封装数据库中可重用的逻辑。

步骤包括连接到 MySQL 服务器,创建数据库(如果需要),定义带有长度和宽度输入参数的 calculate_rectangle_area 函数,并指定返回数据类型。函数体将计算面积并返回结果。后续步骤将涵盖在 SELECT 查询中使用此函数,使用示例数据测试其输出,最后删除该函数。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 92%。获得了学习者 100% 的好评率。

连接到 MySQL 并创建数据库

在此步骤中,你将连接到 MySQL 服务器并创建一个数据库,你将在其中创建和使用自定义函数。

首先,打开你的终端并以 root 用户身份连接到 MySQL 服务器。在实验开始时运行一次以下命令:

sudo mysql -u root

此命令使用 sudo 以 root 用户身份运行 mysql 客户端。由于此环境中 root 用户未设置密码,你将直接连接到 MySQL shell。你将看到 mysql> 提示符。

在所有后续步骤中都保持在 MySQL shell 中。在实验结束前不要退出。

现在,让我们创建一个名为 my_functions_db 的数据库。此数据库将用于存储我们的表和函数。在 mysql> 提示符下执行以下 SQL 命令:

CREATE DATABASE IF NOT EXISTS my_functions_db;

创建数据库后,选择它,使其成为后续操作的默认数据库:

USE my_functions_db;

你应该会看到一条消息,表明数据库已更改。

现在你已连接到 my_functions_db 数据库,并准备在下一步创建你的自定义函数。

创建计算矩形面积的函数

在此步骤中,你将在 MySQL 中创建一个自定义函数来计算矩形的面积。此函数将接收长度和宽度作为输入,并返回计算出的面积。

请确保你仍然在 MySQL shell 中,并且已按照上一步的说明选择了 my_functions_db 数据库。

现在,让我们创建名为 calculate_rectangle_area 的函数。此函数将接受两个整数参数 lengthwidth,并返回一个表示面积的整数。

在 MySQL shell 中执行以下 SQL 命令:

DELIMITER //

CREATE FUNCTION calculate_rectangle_area (length INT, width INT)
RETURNS INT
DETERMINISTIC
BEGIN
  DECLARE area INT;
  SET area = length * width;
  RETURN area;
END //

DELIMITER ;

让我们分解一下这个命令:

  • DELIMITER //: 这会将语句分隔符从默认的分号 (;) 更改为 //。这是必需的,因为函数定义在其主体中包含分号。
  • CREATE FUNCTION calculate_rectangle_area (length INT, width INT): 这定义了函数名 (calculate_rectangle_area) 及其输入参数 (lengthwidth,均为 INT 类型)。
  • RETURNS INT: 这指定函数将返回一个整数值。
  • DETERMINISTIC: 此关键字表示函数对于相同的输入值将始终产生相同的输出。这有助于 MySQL 优化使用该函数的查询。
  • BEGIN ... END: 此块包含函数的逻辑。
  • DECLARE area INT;: 这在函数内部声明了一个名为 area 的局部变量,类型为 INT
  • SET area = length * width;: 这通过将 lengthwidth 参数相乘来计算面积,并将结果赋给 area 变量。
  • RETURN area;: 这将存储在 area 变量中的值作为函数的输出返回。
  • END //: 这使用临时分隔符 // 标记函数定义的结束。
  • DELIMITER ;: 这将分隔符改回默认的分号 (;)。

执行此命令后,calculate_rectangle_area 函数将在 my_functions_db 数据库中创建。

为了验证函数是否已成功创建,你可以列出当前数据库中的函数:

SHOW FUNCTION STATUS LIKE 'calculate_rectangle_area';

此命令将显示有关该函数的信息,确认其存在。

在 SELECT 查询中使用函数

现在你已经创建了 calculate_rectangle_area 函数,你可以在 SELECT 查询中使用它,根据表中存储的数据来计算矩形的面积。

请继续在同一个 MySQL shell 会话中操作,并确保你仍然在使用 my_functions_db 数据库。

首先,让我们创建一个名为 rectangles 的表来存储不同矩形的尺寸。执行以下 SQL 命令:

CREATE TABLE IF NOT EXISTS rectangles (
  id INT AUTO_INCREMENT PRIMARY KEY,
  length INT,
  width INT
);

此命令创建一个表,其中包含一个自增的 id 作为主键,以及 lengthwidth 列。

接下来,向 rectangles 表中插入一些示例数据:

INSERT INTO rectangles (length, width) VALUES (5, 10);
INSERT INTO rectangles (length, width) VALUES (7, 8);
INSERT INTO rectangles (length, width) VALUES (12, 3);

这些命令向 rectangles 表添加了三行数据,具有不同的长度和宽度值。

现在,你可以在 SELECT 查询中使用 calculate_rectangle_area 函数来检索矩形尺寸及其计算出的面积。执行以下 SQL 命令:

SELECT id, length, width, calculate_rectangle_area(length, width) AS area FROM rectangles;

在此查询中:

  • SELECT id, length, width: 这会从 rectangles 表中选择 idlengthwidth 列。
  • calculate_rectangle_area(length, width): 这会调用 calculate_rectangle_area 函数,将每一行的 lengthwidth 列的值作为参数传递。
  • AS area: 这为函数返回的结果分配了一个别名 area,使输出列更易读。
  • FROM rectangles: 这指定数据应从 rectangles 表中检索。

此查询的输出将显示表中每个矩形的 idlengthwidth 和计算出的 area。你应该会看到类似以下的输出:

+----+--------+-------+------+
| id | length | width | area |
+----+--------+-------+------+
|  1 |      5 |    10 |   50 |
|  2 |      7 |     8 |   56 |
|  3 |     12 |     3 |   36 |
+----+--------+-------+------+

这演示了如何在标准 SQL 查询中有效地使用你的自定义函数来对数据执行计算。

使用示例数据测试函数输出

在此步骤中,你将通过向 rectangles 表插入更多示例数据并验证计算出的面积来进一步测试 calculate_rectangle_area 函数。这有助于确保函数能够正确处理不同的输入值。

请继续在同一个 MySQL shell 会话中操作,并确保你仍然在使用 my_functions_db 数据库。

现在,向 rectangles 表中插入具有不同长度和宽度值的其他行:

INSERT INTO rectangles (length, width) VALUES (10, 10);
INSERT INTO rectangles (length, width) VALUES (2, 5);
INSERT INTO rectangles (length, width) VALUES (15, 4);

这些命令向 rectangles 表添加了另外三行。

现在,再次执行 SELECT 查询,查看所有矩形(包括新添加的矩形)的计算面积:

SELECT id, length, width, calculate_rectangle_area(length, width) AS area FROM rectangles;

输出现在将包含新矩形的面积:

+----+--------+-------+------+
| id | length | width | area |
+----+--------+-------+------+
|  1 |      5 |    10 |   50 |
|  2 |      7 |     8 |   56 |
|  3 |     12 |     3 |   36 |
|  4 |     10 |    10 |  100 |
|  5 |      2 |     5 |   10 |
|  6 |     15 |     4 |   60 |
+----+--------+-------+------+

请检查输出,并确认新行的计算面积是否正确:

  • 对于长度为 10 和宽度为 10,面积为 100 (10 * 10)。
  • 对于长度为 2 和宽度为 5,面积为 10 (2 * 5)。
  • 对于长度为 15 和宽度为 4,面积为 60 (15 * 4)。

此步骤强化了你对如何使用该函数处理不同数据的理解,并确认了其准确性。

删除函数和表

在最后一步,你将通过删除 calculate_rectangle_area 函数和 rectangles 表来清理数据库。这是一个移除不再需要的对象的良好实践。

请继续在同一个 MySQL shell 会话中操作,并确保你仍然在使用 my_functions_db 数据库。

首先,让我们删除 calculate_rectangle_area 函数。执行以下 SQL 命令:

DROP FUNCTION IF EXISTS calculate_rectangle_area;
  • DROP FUNCTION: 此命令用于删除一个函数。
  • IF EXISTS: 如果函数不存在,此子句可以防止错误发生。

接下来,让我们删除 rectangles 表。执行以下 SQL 命令:

DROP TABLE IF EXISTS rectangles;
  • DROP TABLE: 此命令用于删除一个表。
  • IF EXISTS: 如果表不存在,此子句可以防止错误发生。

执行这些命令后,函数和表都将从 my_functions_db 数据库中移除。

为了验证函数已被删除,你可以尝试再次列出函数:

SHOW FUNCTION STATUS LIKE 'calculate_rectangle_area';

此命令现在应该返回一个空结果集,表明该函数已不存在。

为了验证表已被删除,你可以尝试从中进行选择:

SELECT * FROM rectangles;

此命令应该返回一个类似 ERROR 1146 (42S02): Table 'my_functions_db.rectangles' doesn't exist 的错误,表明该表已不存在。

现在你可以通过输入 exit 并按 Enter 来退出 MySQL shell。

你已成功在 MySQL 中创建、使用、测试并删除了一个自定义函数和一个表。

总结

在本实验中,你学习了如何在 MySQL 中创建函数来封装可重用的逻辑。该过程包括连接到 MySQL 服务器,创建数据库(如果需要),然后定义一个带有输入参数、返回数据类型和 DETERMINISTIC 关键字的函数。

具体来说,你创建了 calculate_rectangle_area 函数,该函数接收矩形的长度和宽度作为输入,并返回其面积。函数体包括声明一个局部变量来存储计算出的面积,并使用 RETURN 语句返回结果。

然后,你学习了如何在 SELECT 查询中使用此函数,对存储在表中的数据执行计算。你还使用额外的示例数据测试了该函数,以确保其准确性。最后,你学习了如何删除函数和表来清理你的数据库环境。

本次实验提供了 MySQL 中创建和使用自定义函数的实践入门,这是一项非常有价值的技能,可以封装逻辑并提高数据库操作的效率。