同大多数计算机语言一样,SQL支持利用函数来处理数据。函数一般是在数据上执行的,它给数据的转换和处理提供了方便。
注意点:
函数没有SQL的可移植性强 能运行在多个系统上的代码称为可移植的(portable)。相对来说,多数SQL语句是可移植的,在SQL实现之间有差异时,这些差异通常不那么难处理。而函数的可移植性却不强。几乎每种主要的DBMS的实现都支持其他实现不支持的函数,而且有时差异还很大。 为了代码的可移植,许多SQL程序员不赞成使用特殊实现的功能。虽然这样做很有好处,但不总是利于应用程序的性能。如果不使用这些函数,编写某些应用程序代码会很艰难。必须利用其他方法来实现DBMS非常有效地完成的工作。 如果你决定使用函数,应该保证做好代码注释,以便以后你(或其他人)能确切地知道所编写SQL代码的含义。
使用函数
文本处理函数
-
Upper()函数 将文本转换为大写
输入:SELECT UPPER('aaa')
输出:
常用的文本处理函数
函数 | 说明 | 举例 |
---|---|---|
left(str,num) | 返回错左边的字符 | SELECT LEFT('AABBCCDD',2) |
length() | 返回串的长度 | SELECT LENGTH('AABBCCDDEEFFGG') |
locate() | 返回串的子串 | select LOCATE('aa','AABBccaa',2) |
lower() | 将串转换为小写 | SELECT LOWER('AABBCCDD') |
UPPER() | 将串转换为大写 | SELECT UPPER('aaa') |
LTRim() | 去掉串左边的空格 | |
RTrim() | 去掉串右边的空格 | |
Trim() | 去掉串两边的空格 |
日期和时间处理函数
函数 | 说明 | 举例 |
---|---|---|
CURDATE() | 返回当前日期 | select CURDATE() |
CURTIME() | 返回当前时间 | select CURTIME() |
Now() | 返回当前日期和时间 | |
Date() | 返回日期时间的日期部分 | select Date('2023-08-07 00:00:00') |
DAY() | 返回一个日期的天数部分 | select DAY('2023-08-07 00:00:00') |
DayOfWeek() | 对于一个日期,返回对应的星期几 | |
Month() | 返回一个日期的月份部分 | |
Hour() | 返回一个时间的小时部分 | |
Minute() | 返回一个时间的分钟部分 | |
Second() | 返回一个时间的秒部分 | |
DateDiff() | 计算两个日期之差 | select DateDiff('2023-08-07 00:00:00','2023-08-15 00:00:00') |
Date_Add() | 高度灵活的日期运算函数 | SELECT DATE_ADD('2023-01-01', INTERVAL 2 MONTH 3 DAY); |
Now() | 返回当前日期和时间 | |
Time() | 返回一个日期时间的时间部分 | |
Year() | 返回一个日期的年份部分 |
举例:
- 输入:select * from order where order_date='2005-09-01'
-
输出:
分析: 使用WHERE order_date = '2005-09-01'可靠吗?order_ date的数据类型为datetime。这种类型存储日期及时间值。样例表中的值全都具有时间值00:00:00,但实际中很可能并不总是这样。如果用当前日期和时间存储订单日期(因此你不仅知道订单日期,还知道下订单当天的时间),怎么办?比如,存储的order_date值为
2005-09-01 11:30:05,则WHERE order_date = '2005-09-01'失败。即使给出具有该日期的一行,也不会把它检索出来,因为WHERE匹配失败。解决办法是指示MySQL仅将给出的日期与列中的日期部分进行比较,而不是将给出的日期与整个列值进行比较。为此,必须使用Date()函数
- 输入:select * from order where date(order_date)='2005-09-01'
-
输出:
分析:使用Date()是一个良好的习惯,即使你知道相应的列只包含日期也是如此。这样,如果由于某种原因表中以后有日期和时间值,你的SQL代码也不用改变。当然,也存在一个Time()函数,在你只想要时间时应该使用它。
- 输入:select * from order where Year(order_date)='2005' and Month(order_date)=9
分析: Year()是一个从日期(或日期时间)中返回年份的函数。类似,Month()从日期中返回月份。因此,WHEREYear(order_date)= 2005 AND Month(order_date) = 9检索出order_date为2005年9月的所有行。
数值处理函数
函数 | 说明 |
---|---|
Abs() | 返回一个数的绝对值 |
Cos() | 返回一个角度的余弦 |
Exp() | 返回一个数的指数值 |
Mod() | 返回除操作的余数 |
Pi() | 返回圆周率 |
Rand() | 返回一个随机数 |
Sin() | 返回一个角度的正弦 |
Sqrt() | 返回一个数的平方根 |
Tan() | 返回一个角度的正切 |