MySQL 函数:字符串、数字、用户定义、存储
什么是函数?
MySQL 不仅仅能存储和检索数据。我们还能在检索或保存数据之前对其进行操作。这时 MySQL 函数就派上用场了。函数本质上是执行某些操作然后返回结果的代码片段。有些函数接受参数,而有些则不接受。
让我们简单看一个 MySQL 函数的例子。默认情况下,MySQL 以“YYYY-MM-DD”的格式存储日期数据类型。假设我们构建了一个应用程序,我们的用户希望日期以“DD-MM-YYYY”的格式返回,我们可以使用 MySQL 内置函数 DATE_FORMAT 来实现这一点。DATE_FORMAT 是 MySQL 中使用最多的函数之一。在后面的课程中我们将详细介绍它。
为什么要使用函数?
根据引言中的例子,有计算机编程经验的人可能会想:“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 服务器中。