本篇文章讲述SQL语句中单行函数,以供参考
单行函数介绍
SQL函数即数据库的内置函数,可以运用在SQL语句中实现特定的功能。SQL单行函数对于每一行数据进行计算后得到一行输出结果。SQL单行函数根据数据类型分为字符函数、数字函数、日期函数、转换函数,另外还有一些别的函数。——来自百度
数据说明
- 表结构
字段 | 类型 | 长度 | 主键 | 可为空 |
id | number | 6 | 是 | 否 |
t_string | varchar | 200 | 否 | 是 |
t_number | number | 20,10 | 否 | 是 |
st_date | date | - | 否 | 是 |
t_string2 | varchar | 200 | 否 | 是 |
- 初始数据
一、字符函数
大小写转换函数
大小写转换函数包括:
1. UPPER() , 将查询的字符串小写转换为大写 ;
2. LOWER() , 将查询的字符串大写转换为小写 ;
3. INITCAP() , 将查询的字符串首字母大写 ;
- 将表中的id和t_string查询出来,并将string大写
select id , upper(string)
from T_CHAR ;
查询结果:
- 将表中的id和t_string查询出来,并将string小写
select id , lower(string)
from T_CHAR ;
查询结果:
- 将表中的id和t_string查询出来,并将string首字母大写
select id , initcap(string)
from T_CHAR ;
查询结果:
字符控制函数
SQL中常用的字符控制函数有:
1. CONCAT(),字符串连接函数
2. SUBSTR(),字符串截取函数
3. LEANTH(),求字符串长度函数
4. LPAD(),左填充函数
5. RPAD(),右填充函数
6. TRIM(),字符移除函数
7. REPLACE(),字符替换函数
- CONCAT():将T_CHAR表string 和 string2连接起来
select id , concat(t_string , t_string2)
from T_CHAR
查询结果:
- SUBSTR():截取string 中的前2个字符和string2中的前4个字符 。
select id , substr(t_string , 1 , 2 ) ,substr(t_string2 , 1 , 4 )
from T_CHAR
查询结果:
- LEANTH():求string和string2的字符串长度
select id , t_string , length(t_string) ,t_string2 ,length(t_string2)
from T_CHAR
运行结果:
- LPAD() ,RPAD(), 将string用‘*’填充,string2用‘#’填充,总长为10
select id , rpad(t_string,10,'*') ,lpad(t_string2,10,'#')
from T_CHAR
查询结果:
- TRIM(),将string中的首位字母 ‘a’ 删除 ,string2中的首尾字母 ‘o’ 删除。
select id , trim('d' from t_string) ,trim('w' from t_string2 )
from T_CHAR ;
查询结果:
- REPLACE() ,将string中的所有 ‘a’ 替换成‘*’ , string2中的所有‘o’替换成‘#’ 。
select id , replace(t_string , 'a' , '*') ,replace(t_string2 ,'o' ,'#' )
from T_CHAR ;
查询结果:
二、数字函数
SQL中用于数字计算的数字函数有:
1. ROUND() ,四舍五入函数;
2. TRUNC() ,截取函数
3. MOD() ,求余函数
- ROUND() ,将T_CHAR表中的 t_number保留两位小数第三位四舍五入。
select id , round(t_number , 2)
from T_CHAR ;
查询结果:
- TRUNC() ,截取T_CHAR中的 t_number 保留小数点后四位,其余舍去。
select id , trunc(t_number , 4)
from T_CHAR ;
查询结果:
- MOD() ,将T_CHAR中的 t_number 取模10 。
select id , mod(t_number , 10)
from T_CHAR ;
查询结果:
三、日期函数
对日期进行粗略计算
SQL中可以对日期进行粗略计算:
1. 可以将日期加上或者减去n天
2. 可以用两个日期相减得到相差天数
- 将T_CHAR中的 t_date加上一天,减去两天。
select t_date , t_date + 1 , t_date - 2
from T_CHAR ;
查询结果:
- 计算t_date到系统时间的天数 。
select t_date , sysdate , sysdate - t_date
from T_CHAR ;
查询结果:
对日期进行精确计算
SQL中提供了精确计算日期的函数:
1. MONTHS_BETWEEN() 计算两个日期相差的天数;
2. ADD_MONTHS() 往一个日期中加n月;
3. NEXT_DAY() 当前系统时间的下一星期n的时间
4. LAST_DAY() 日期中月的最后一天
5. ROUND() 对日期的四舍五入
6. TRUNC() 对日期的截取
- 计算T_CHAR中的 t_date和系统时间相差的天数 , 并将t_date加2个月
select t_date , months_between(sysdate , t_date) , add_months(t_date , 2)
from T_CHAR ;
查询结果:
- 计算T_CHAR中 t_date 下一个星期三的日期,并计算系统时间的t_date最后一天的日期
select t_date , next_day(t_date , '星期三' ) , last_day(t_date)
from T_CHAR ;
查询结果:
- 将T_CHAR中 t_date按月四舍五入,将t_date按日截取
select t_date , round(t_date,'month') , trunc(t_date , 'day')
from T_CHAR ;
查询结果:
四、转换函数
SQL中可以进行两种数据类型的转换,即隐式转换和显示转换。
隐式数据类型转换
ORACLE数据库中会将 char或varchar2 与 date 和 number 之间进行相互转换。如前例中日期date可以和number进行加减运算,也可以将输入的varchar2类型存入date型的数据库中,称之为隐形转换。
显式数据类型转换
ORACLE数据库中也可以通过方法 to_char() , to_date() , to_number(),完成数据类型之间的转换。
- 查询T_CHAR表中日期为’2016年7月21日’ 的数据(日期转字符串)。
select *
from T_CHAR
where to_char(t_date , 'yyyy-mm-dd') = '2016-07-21' ;
查询结果:
- 查询T_CHAR表中日期为’2015年11月19日’ 的数据(字符串转日期)。
select *
from T_CHAR
where to_date('2015年11月19日' , 'yyyy"年"mm"月"dd"日"') = t_date ;
查询结果:
注:日期格式说明表示year的:y 表示年的最后一位 yy 表示年的最后2位 yyy 表示年的最后3位 yyyy 用4位数表示年;
表示month的:mm 用2位数字表示月;mon 用简写形式 比如11月或者nov ;month 用全称 比如11月或者november;
表示day的:dd 表示当月第几天;ddd表示当年第几天;dy 当周第几天 简写 比如星期五或者fri;day当周第几天 全写比如星期五或者friday;
表示hour的:hh 2位数表示小时 12进制; hh24 2位数表示小时 24小时;
表示minute的:mi 2位数表示分钟;
表示second的:ss 2位数表示秒 60进制;
表示季度的:q 一位数 表示季度 (1-4);
另外还有ww 用来表示当年第几周 w用来表示当月第几周;
24小时制下的时间范围:00:00:00-23:59:59 ;
12小时制下的时间范围:1:00:00-12:59:59
- 将T_CHAR中 t_number 转换为格式‘999,999.999’(数字转字符串)
select id , to_char(t_number , '999,999.999')
from T_CHAR ;
查询结果:
注:数字格式说明,用数字‘9’站位数字前有空位不补位,用数字‘0’站位前有空位时补‘0’; ‘$’放在最前表示美元,大写字母‘L’表示当地货币
- 将字符串’¥47.453’ 转换为数字(字符串转数字)
select to_number('¥47.453','L999,999.999')
from dual ;
查询结果:
五、通用函数
ORACLE中提供了适合所有数据类型的函数,包括空值。
- NVL(A,B) ,能够将一个空值转换成已知的值,若A为空显示A,非空显示B;
- NVL2(A,B,C) , 若A非空显示B 为空显示C ;
- NULLIF(A,B), A,B相等时返回null,不等时返回A ;
- COALESCE(A,B,C…) ,A为空返回B,B为空返回C,以此类推。
修改数据库中数据以便演示通用函数:
- 查询T_CHAR中所有数据,要求若t_date为空则显示‘日期为空’,若t_string2为空显示‘字符串为空’,若t_number为空则显示‘数字为空’ (NVL)。
select id , t_string , nvl(to_char(t_date , 'yyyy/mm/dd') ,'日期为空') , nvl(t_string2 ,'字符串为空') , nvl(to_char(t_number , '9999999'),'数字为空')
from T_CHAR ;
查询结果:
- 查询T_CHAR中所有数据,要求若t_date为空则显示‘日期为空’否则显示‘有日期’,若t_string2为空显示‘字符串为空’否则显示‘有字符串’,若t_number为空则显示‘数字为空’ 否则显示‘有数字’(NVL2类似于if-else,或c语言中的三目运算符?:)。
select id , t_string , nvl2(to_char(t_date , 'yyyy/mm/dd'),'有日期' ,'日期为空') , nvl2(t_string2 ,'有字符串' ,'字符串为空') , nvl2(to_char(t_number , '9999999'),'有数字','数字为空')
from T_CHAR ;
查询结果:
- 查询T_CHAR中t_string , t_string2的长度,并比较若长度相等显示‘null’ 否则显示t_string长度 ;
select id , t_string , t_string2 , nullif(length(t_string),length(t_string2))
from T_CHAR ;
查询结果: