MySQL 函数:字符串、数字、用户定义、存储

什么是函数?

MySQL 不仅仅能存储和检索数据。我们还能在检索或保存数据之前对其进行操作。这时 MySQL 函数就派上用场了。函数本质上是执行某些操作然后返回结果的代码片段。有些函数接受参数,而有些则不接受。

让我们简单看一个 MySQL 函数的例子。默认情况下,MySQL 以“YYYY-MM-DD”的格式存储日期数据类型。假设我们构建了一个应用程序,我们的用户希望日期以“DD-MM-YYYY”的格式返回,我们可以使用 MySQL 内置函数 DATE_FORMAT 来实现这一点。DATE_FORMAT 是 MySQL 中使用最多的函数之一。在后面的课程中我们将详细介绍它。

为什么要使用函数?

Why use Functions

根据引言中的例子,有计算机编程经验的人可能会想:“MySQL 函数有什么用?用脚本/编程语言不是可以达到同样的效果吗?” 确实,我们可以通过在应用程序中编写一些过程/函数来达到这一点。

回到引言中的日期示例,为了让我们的用户获得所需格式的数据,业务层将不得不进行必要的处理。

当应用程序需要与外部系统集成时,这会成为一个问题。当我们使用 DATE_FORMAT 等 MySQL 函数时,可以将该功能嵌入数据库中,任何需要数据的应用程序都可以按所需格式获取。这减少了业务逻辑中的重复工作,并降低了数据不一致性。

我们应该考虑使用MySQL 函数的另一个原因是,它可以帮助减少客户端/服务器应用程序中的网络流量。业务层只需调用存储函数,而无需操作数据。平均而言,使用函数可以极大地提高整体系统性能。

函数类型

内置函数

MySQL 附带了许多内置函数。内置函数就是 MySQL 服务器中已实现的函数。这些函数允许我们对数据执行不同类型的操作。内置函数可以基本分为以下最常用的类别。

  • 字符串函数 – 操作字符串数据类型
  • 数字函数 – 操作数字数据类型
  • 日期函数 – 操作日期数据类型
  • 聚合函数 – 操作所有上述数据类型并生成汇总结果集。
  • 其他函数 – MySQL 还支持其他类型的内置函数,但我们的课程仅限于上述函数。

现在让我们详细了解上面提到的每种函数。我们将使用我们的“Myflixdb”来解释最常用的函数。

字符串函数

我们已经了解了字符串函数的作用。我们将看一个实际的例子。在我们的 movies 表中,电影标题是通过大小写字母组合存储的。假设我们想获取一个返回所有电影标题大写字母的查询列表。我们可以使用“UCASE”函数来实现。它接受一个字符串作为参数,并将所有字母转换为大写。下面的脚本演示了“UCASE”函数的使用。

SELECT `movie_id`,`title`, UCASE(`title`)  FROM `movies`;

HERE

  • UCASE(`title`) 是内置函数,它将 title 作为参数,并以大写字母返回,别名为 `upper_case_title`。

在 MySQL Workbench 中针对 Myflixdb 执行上述脚本,会得到如下结果。

movie_id title UCASE('title')
16 67% Guilty 67% GUILTY
6 Angels and Demons ANGELS AND DEMONS
4 Code Name Black CODE NAME BLACK
5 Daddy's Little Girls DADDY'S LITTLE GIRLS
7 Davinci Code DAVINCI CODE
2 Forgetting Sarah Marshal FORGETTING SARAH MARSHAL
9 Honey mooners HONEY MOONERS
19 movie 3 MOVIE 3
1 Pirates of the Caribean 4 PIRATES OF THE CARIBEAN 4
18 sample movie SAMPLE MOVIE
17 The Great Dictator THE GREAT DICTATOR
3 X-Men X-MEN

MySQL 支持多种字符串函数。有关所有内置字符串函数的完整列表,请参阅 MySQL 网站上的此链接:https://dev.mysqlserver.cn/doc/refman/5.0/en/string-functions.html

数字函数

如前所述,这些函数操作数字数据类型。我们可以在 SQL 语句中执行数学计算。

算术运算符

MySQL 支持以下算术运算符,可用于在 SQL 语句中执行计算。

名称 描述
DIV 整数除法
/ 事业部
减法
+ 加法
* 乘法
% 或 MOD 模数

现在让我们看上面每个运算符的例子。

整数除法 (DIV)

SELECT 23 DIV 6 ;

执行上述脚本会得到以下结果。

3

除法运算符 (/)

现在让我们看除法运算符的例子。我们将修改 DIV 的示例。

SELECT 23 / 6 ;

执行上述脚本会得到以下结果。

3.8333

减法运算符 (-)

现在让我们看减法运算符的例子。我们将使用与前两个示例相同的值。

SELECT 23 - 6 ;

执行上述脚本得到 17

加法运算符 (+)

现在让我们看加法运算符的例子。我们将修改之前的示例。

SELECT 23 + 6 ;

执行上述脚本得到 29

乘法运算符 (*)

现在让我们看乘法运算符的例子。我们将使用与之前示例相同的值。

SELECT 23 * 6 AS `multiplication_result`;

执行上述脚本会得到以下结果。

multiplication_result
138

模运算符 (-)

模运算符将 N 除以 M 并给出余数。现在让我们看模运算符的例子。我们将使用与之前示例相同的值。

SELECT 23 % 6 ;

或者

SELECT 23 MOD 6 ;

执行上述脚本得到 5

现在让我们看一些 MySQL 中常见的数字函数。

Floor – 此函数删除数字的小数部分,并将其四舍五入到最近的较低数字。下面的脚本演示了它的用法。

SELECT FLOOR(23 / 6) AS `floor_result`;

执行上述脚本会得到以下结果。

Floor_result
3

Round – 此函数将带有小数的数字四舍五入到最近的整数。下面的脚本演示了它的用法。

SELECT ROUND(23 / 6) AS `round_result`;

执行上述脚本会得到以下结果。

Round_result
4

Rand – 此函数用于生成一个随机数,每次调用该函数时其值都会改变。下面的脚本演示了它的用法。

SELECT RAND() AS `random_result`;

存储函数

存储函数就像内置函数一样,只是您必须自己定义存储函数。一旦创建了存储函数,就可以像其他任何函数一样在 SQL 语句中使用它。创建存储函数的基本语法如下所示。

CREATE FUNCTION sf_name ([parameter(s)])
   RETURNS data type
   DETERMINISTIC
   STATEMENTS

HERE

  • “CREATE FUNCTION sf_name ([parameter(s)])” 是必需的,它告诉 MySQL 服务器创建一个名为 `sf_name` 的函数,并在括号中定义可选参数。
  • “RETURNS data type” 是必需的,它指定函数应返回的数据类型。
  • “DETERMINISTIC” 表示如果为函数提供相同的参数,它将返回相同的值。
  • “STATEMENTS” 是函数执行的过程代码。

现在让我们看一个实现内置函数的实际示例。假设我们想知道哪些租借的电影已超过归还日期。我们可以创建一个存储函数,该函数接受归还日期作为参数,然后将其与 MySQL 服务器中的当前日期进行比较。如果当前日期小于租借电影日期,则返回“否”,否则返回“是”。下面的脚本有助于我们实现这一点。

DELIMITER |
CREATE FUNCTION sf_past_movie_return_date (return_date DATE)
  RETURNS VARCHAR(3)
   DETERMINISTIC
    BEGIN
     DECLARE sf_value VARCHAR(3);
        IF curdate() > return_date
            THEN SET sf_value = 'Yes';
        ELSEIF  curdate() <= return_date
            THEN SET sf_value = 'No';
        END IF;
     RETURN sf_value;
    END|

执行上述脚本创建了存储函数 `sf_past_movie_return_date`。

现在让我们测试我们的存储函数。

SELECT `movie_id`,`membership_number`,`return_date`,CURDATE() ,sf_past_movie_return_date(`return_date`)  FROM `movierentals`;

在 MySQL Workbench 中针对 myflixdb 执行上述脚本会得到以下结果。

movie_id membership_number return_date CURDATE() sf_past_movie_return_date('return_date')
1 1 NULL 04-08-2012 NULL
2 1 25-06-2012 04-08-2012 yes
2 3 25-06-2012 04-08-2012 yes
2 2 25-06-2012 04-08-2012 yes
3 3 NULL 04-08-2012 NULL

用户定义函数

MySQL 还支持扩展 MySQL 的用户定义函数。用户定义函数是您可以使用 C、C++ 等编程语言创建的函数,然后将其添加到 MySQL 服务器。添加后,它们就可以像任何其他函数一样使用。

摘要

  • 函数使我们能够增强MySQL 的功能。
  • 函数始终返回一个值,并且可以选择接受参数。
  • 内置函数是随 MySQL 一起提供的函数。它们可以根据它们操作的数据类型进行分类,即字符串、日期和数字内置函数。
  • 存储函数由用户在 MySQL 服务器内部创建,并可在 SQL 语句中使用。
  • 用户定义函数在 MySQL 外部创建,并可以集成到 MySQL 服务器中。