函数处理数据
函数
SQL 也可以用函数来处理数据。函数一般是在数据上执行的,为数据的转换和处理提供了方便。
与几乎所有 DBMS 都等同地支持 SQL 语句(如 SELECT)不同,每一个DBMS 都有特定的函数。
列出了 3 个常用的函数及其在各个 DBMS 中的语法:
SQL 语句不一样,SQL 函数不是可移植的。这意味着为特定 SQL 实现编写的代码在其他实现中可能不能用。
可移植(portable)
所编写的代码可以在多个系统上运行。
使用函数
大多数 SQL 实现支持以下类型的函数。
- 用于处理文本字符串(如删除或填充值,转换值为大写或小写)的文
本函数。 - 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的
数值函数。 - 用于处理日期和时间值并从这些值中提取特定成分(如返回两个日期
之差,检查日期有效性)的日期和时间函数。 - 用于生成美观好懂的输出内容的格式化函数(如用语言形式表达出日
期,用货币符号和千分位表示金额)。 - 返回 DBMS 正使用的特殊信息(如返回用户登录信息)的系统函数。
文本处理函数
UPPER(s)
将字符串转换为大写
将字符串 runoob 转换为大写:
SELECT UPPER("runoob");
SUBSTR(s, start, length)
从字符串 s 的 start 位置截取长度为 length 的子字符串
从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:
SELECT SUBSTR("RUNOOB", 2, 3) AS ExtractString; -- UNO
LEFT(s,n)
返回字符串 s 的前 n 个字符
返回字符串 runoob 中的前两个字符:
SELECT LEFT('runoob',2) -- ru
LENGTH()(也使用DATALENGTH()或LEN())
返回字符串的长度
LOWER(s)
将字符串 s 的所有字母变成小写字母
字符串 RUNOOB 转换为小写:
SELECT LOWER('RUNOOB') -- runoob
LTRIM(s)
去掉字符串 s 开始处的空格
去掉字符串 RUNOOB开始处的空格:
SELECT LTRIM(" RUNOOB") AS LeftTrimmedString;-- RUNOOB
RIGHT(s,n)
返回字符串 s 的后 n 个字符
返回字符串 runoob 的后两个字符:
SELECT RIGHT('runoob',2) -- ob
RTRIM(s)
去掉字符串 s 结尾处的空格
去掉字符串 RUNOOB 的末尾空格:
SELECT RTRIM("RUNOOB ") AS RightTrimmedString; -- RUNOOB
SUBSTR(s, start, length)
从字符串 s 的 start 位置截取长度为 length 的子字符串
SUBSTRING(s, start, length)
从字符串 s 的 start 位置截取长度为 length 的子字符串,等同于 SUBSTR(s, start, length)
从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:
SELECT SUBSTR("RUNOOB", 2, 3) AS ExtractString; -- UNO
从字符串 RUNOOB 中的第 2 个位置截取 3个 字符:
SELECT SUBSTRING("RUNOOB", 2, 3) AS ExtractString; -- UNO
SOUNDEX()
返回字符串的SOUNDEX值
SOUNDEX 是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX 考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较。
虽然 SOUNDEX 不是 SQL 概念,但多数 DBMS 都提供对 SOUNDEX的支持。
Customers 表中有一个顾客Kids Place,其联系名为 Michelle Green。但如果这是错误的输入,此联系名实际上应该是 Michael Green,该怎么办呢?显然,按正确的联系名搜索不会返回数据。
现在试一下使用 SOUNDEX()函数进行搜索,它匹配所有发音类似于 Michael Green 的联系名:
SELECT cust_name, cust_contact
FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');
在这个例子中,WHERE 子句使用 SOUNDEX()函数把 cust_contact 列值和搜索字符串转换为它们的 SOUNDEX 值。
因为 Michael Green 和Michelle Green 发音相似,所以它们的 SOUNDEX 值匹配,因此 WHERE子句正确地过滤出了所需的数据。
日期和时间处理函数
日期和时间采用相应的数据类型存储在表中,每种 DBMS 都有自己的特殊形式。日期和时间值以特殊的格式存储,以便能快速和有效地排序或过滤,并且节省物理存储空间。
应用程序一般不使用日期和时间的存储格式,因此日期和时间函数总是用来读取、统计和处理这些值。
由于这个原因,日期和时间函数在 SQL中具有重要的作用。遗憾的是,它们很不一致,可移植性最差。
Orders 表中包含的订单都带有订单日期。
要检索出某年的所有订单,需要按订单日期去找,但不需要完整日期,只要年份即可。
DB2,MySQL 和 MariaDB 具有各种日期处理函数,但没DATEPART()。
DB2,MySQL 和 MariaDB 用户可使用名为 YEAR()的函数从日期中提取年份:
SELECT order_num
FROM Orders
WHERE YEAR(order_date) = 2020;
DBMS 提供的功能远不止简单的日期成分提取。
大多数 DBMS 具有比较日期、执行日期的运算、选择日期格式等的函数。
但是,可以看到,不同 DBMS 的日期−时间处理函数可能不同。
数值处理函数
数值处理函数仅处理数值数据。
这些函数一般主要用于代数、三角或几何运算,因此不像字符串或日期−时间处理函数使用那么频繁。
在主要 DBMS 的函数中,数值函数是最一致、最统一的函数。
ABS(x)
返回 x 的绝对值
返回 -1 的绝对值:
SELECT ABS(-1) -- 返回1
COS(x)
求余弦值(参数是弧度)
SELECT COS(2);
EXP(x)
返回 e 的 x 次方
计算 e 的三次方:
SELECT EXP(3) -- 20.085536923188
PI()
返回圆周率(3.141593)
SELECT PI() --3.141593
SQRT(x)
返回x的平方根
25 的平方根:
SELECT SQRT(25) -- 5