函数
函数提供了对数据转换和处理的功能
上篇文章中的RTrim()
以及处理时间的TIMESTAMPDIFF()
都是函数。
因为函数是当前数据库使用的引擎特有,所以如果遇到移植到其他数据库就可能会出现不支持这些函数的情况。
PS:在开发中要注意这种情况,避免在移植后出现不必要的麻烦。如果必须使用函数,写好相关注释
使用函数
大多数SQL支持以下几种类型的函数:
- 用于处理文本串(如删除,填充,转换大小写)
- 对数值进行算数操作(如返回绝对值,进行代数运算)
- 用于处理日期
- 返回DMBS使用的特殊信息(如用户登录信息,版本细节)
文本处理函数
上篇了解了RTrim
是去除右边空格,LTrim
是去除左边空格
接下来学习个新函数-Upper()
,将文本转换成大写
mysql> SELECT first_name, Upper(first_name) AS first_name_upcase
-> FROM employees
-> WHERE emp_no < 10020;
输出:
其他常用文本处理函数
函数 | 说明 |
---|---|
Left() | 返回串左边开始的字符(用于截取) |
Length() | 返回串的长度 |
Locate() | 找出串的子串 |
Lower() | 将串转成小写 |
Right() | 返回串右边开始的字符(用于截取) |
LTrim() | 去除串左边的空格 |
RTrim() | 去除串右边的空格 |
Soundex() | 返回串的Soundex值 |
SubString() | 返回子串的字符(类似于Python中的切片) |
Upper() | 将串转换成大写 |
说一下Locate()
,用于查找关键字是否在该文本中,有则返回第一个出现的位置。
mysql> SELECT LOCATE('bar', 'foobarbar');
+--------------------------------+
| LOCATE('bar', 'foobarbar') |
+--------------------------------+
| 4 |
+--------------------------------+
Soundex是什么
Soundex是将任何文本串转换为描述其语音表示的字母数字模式的算法。使得串能进行发音比较。
举个例子:
mysql> SELECT first_name
-> FROM employees
-> WHERE first_name = 'Partu';
Empty set (0.09 sec)
数据库中正确的文本是Parto,当时由于拼写错误没找到,在这种在发音上相似的情况,可以通过Soudex
进行查找。
mysql> SELECT first_name FROM employees WHERE Soundex(first_name) = Soundex('Partu') AND emp_no < 10020;
输出:
+------------+
| first_name |
+------------+
| Parto |
+------------+
1 row in set (0.00 sec)
日期和时间处理函数
常用日期和时间处理函数
函数 | 说明 |
---|---|
AddDate() | 增加一个日期(天、周等) |
AddTime() | 增加一个时间(时、分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期运算函数 |
Date_Format() | 返回一个格式化的日期或时间 |
Day() | 返回一个日期的天部分 |
DayOfWeek() | 对于一个日期,返回对应的星期几 |
Hour() | 返回时间的小时部分 |
Minute() | 返回时间的分部分 |
Month() | 返回日期的月部分 |
Now() | 返回当前日期和时间 |
Second() | 返回时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年部分 |
有时候存入的数据是datetime格式,包含着日期和时间,如果单单使用WHERE birth_date=2015-02-20
,这种情况匹配是失败的。所以必须使用Date()
函数来获取datetime的日期部分。
mysql> SELECT first_name, birth_date FROM employees WHERE Date(birth_date) = '1960-02-20' AND emp_no < 10050;
输出:
+------------+------------+
| first_name | birth_date |
+------------+------------+
| Ramzi | 1960-02-20 |
+------------+------------+
1 row in set (0.00 sec)
如何检索出1960年10份生日的员工:
第一种方案是通过BETWEEN
方式。
BETWEEN '1960-10-01' AND '1960-10-31'
不推荐这种,耦合度太高。
第二种方案
1960 AND Month(birth_date) = 10
数值处理函数
函数 | 说明 |
---|---|
Abs() | 返回一个绝对值 |
Cos() | 返回一个角度的余弦 |
Exp() | 返回一个数的指数值 |
Mod() | 返回余数 |
Pi() | 返回圆周率 |
Rand() | 返回一个随机数 |
Sin() | 返回一个角度的正弦 |
Sqrt() | 返回一个数的平方根 |
Tan() | 返回一个角度的正弦 |