函数
SQL 可以使用函数来处理数据,函数一般是在数据上执行,为数据的转换和处理提供方便
与几乎所有的 DBMS 都等同地支持 SQL 语句不同,每一个 DBMS 都有特定的函数
只有少数几个函数被所有主要的 DBMS 等同地支持
可以看到,与 SQL 语句不同,SQL 函数不是可移植的
可移植性(protable): 所编写的代码可以在多个系统上运行
使用函数
大多数SQL实现支持以下类型的函数:
- 用于处理文本串(如删除或者填充值,转换值为大小写)的文本函数
- 用于在数值数据上进行算术操作(如返回绝对值,代数运算)的数值函数
- 用于处理日期和时间值并从这些值中提取特定成分(如返回两个日期之差,检查日期有效性)的日期和时间函数
- 返回 DBMS 正使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数
文本处理函数
UPPER()
将文本转换为大写
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase
FROM Vendors
ORDER BY vend_name;
还有一些其他常用的文本处理函数:
SOUNDEX()
是一个将任何文本串转换为描述其语音表示的字母数字模式的算法
SOUNDEX()
考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较
查找 Customers 表中有一个顾客 Jerry Mouce,但是实际的联系名是 Jerry Mouse’
错误的输入,显然不能得到数据,但是使用 SOUNDEX()
函数进行搜索,它会匹配所有发音类似的联系名,从而得到正确的结果
日期和时间处理函数
日期和时间采用相应的数据类型存储在表中,每种 DBMS 都有自己的特殊形式
日期和时间值以特殊的格式存储,能快速和有效地排序或过滤,并节省物理存储空间
MySQL 中的日期格式为
yyyy-mm-dd
,例如,2005年9月1日,给出2005-09-01
但是应用程序一般不使用日期和时间的存储格式,因此日期和时间函数总是用来读取、统计和处理这些值
在MySQL 中用户可以使用名为 YEAR()
的函数从日期中提取年份
按月份过滤,可以进行相同的处理,使用 AND
操作符可以进行年和月份的比较
DBMS 提供的功能远不止简单的日期成分提取
大多数 DBMS 具有比较日期、执行基于日期的运算、选择日期格式等函数,但是不同的 DBMS 的日期-时间处理函数可能不同
MySQL 中,一些常用的日期和时间处理函数
一些基本的日期比较:
SELECT cust_id, order_num
FROM orders
WHERE order_date = '2005-09-01';
此 SELECT
语句正常运行,检索出一个订单记录,该订单记录的 order_date 为 2005-09-01
但是 order_date 的数据类型为 datetime
,这种类型存储日期和时间值,样例表中的值全都具有时间值 00:00:00,但是实际中可能不是这样的
解决办法是指示 MySQL 仅将给出的日期与列中的日期部分进行比较,而不是将给出的日期与整个列值进行比较;为此,需要使用 Date()
函数;Date( order_date )
指示 MySQL 仅提取列的日期部分
SELECT cust_id, order_num
FROM orders
WHERE Date(order_date) = '2005-09-01';
如果想要的是日期,则使用
Date()
;即使,相应的列只包含日期也是如此;这样,即使以后该列中出现了日期和时间值,也不需要改变 SQL 代码通过使用
Time()
,可以只提取出时间
还有一种情况,如果想要获取,2005年9月中的所有订单,方式有:
示例1:
SELECT cust_id, order_num FROM orders
WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
示例2:
SELECT cust_id, order_num FROM orders
WHERE Year(order_date) = 2005 AND Month(order_date) = 9;
数值处理函数
数值处理函数仅处理数值数据,这些函数一般主要用于代数、三角或者几何运算,使用相对较少,但是在主要的 DBMS 的函数中,也是最一致、最统一的函数