单行 SQL 函数有如下几个分类:
字符函数
数字函数
使用日期
日期函数
函数的使用原来说白了就是在函数使用过程中加入符合定义的参数,然后执行函数就能输出结果值了。
单行函数和多行函数的区别:
单行函数每行输出为一个结果
多行函数每组行输出为一个结果
单行函数:
操作数据对象
接受函数返回一个结果
只对一行进行变换
每行返回一个结果
可以转换数据类型,计算,格式化
可以嵌套
参数可以是列、值或表达式
function_name [(arg1, arg2,...)]
<a href="https://s3.51cto.com/wyfs02/M01/8E/4B/wKiom1i8Eo6CG0ZmAABOi3pu_VE468.jpg-wh_500x0-wm_3-wmp_4-s_1509032647.jpg" target="_blank"></a>
字符函数:
1、大小写转换函数:LOWER、UPPER、INITCAP
这些函数转换字符串的大小写:
函数
结果
LOWER('SQL Course')
结果全部是小写
UPPER('SQL Course')
结果全部是大写
INITCAP('SQL Course')
结果首字符大写
1.1、例如显示员工Walsh的员工编号,并且名字为小写:
select lower(last_name),employee_id from employees where last_name='Walsh';
1.2、例如显示员工Walsh的工资,并且名字为大写:
select upper(first_name),salary from employees where first_name='Kevin';
<a href="https://s4.51cto.com/wyfs02/M01/8E/49/wKioL1i8GOPRIpDWAAAvGIHBUfg095.jpg-wh_500x0-wm_3-wmp_4-s_2967088554.jpg" target="_blank"></a>
1.3、显示Kevin的last_name 、工资job_id 首字母大写
select initcap(job_id), last_name,salary from employees where first_name='Kevin';
<a href="https://s3.51cto.com/wyfs02/M02/8E/49/wKioL1i8GhvwX98zAAA9ZQtFa9U058.jpg-wh_500x0-wm_3-wmp_4-s_3231756063.jpg" target="_blank"></a>
1.4、从员工表中检索FIRST_NAME和LAST_NAME值,并且FIRST_NAME包含字符串“li”
select first_name,last_name from employees where lower(first_name) like '%li%';
<a href="https://s4.51cto.com/wyfs02/M01/8E/52/wKioL1i9bJ_z1nN0AABeNrVSDMU807.jpg" target="_blank"></a>
2、字符处理函数:CONCAT、SUBSTR、LENGTH、INSTR、LPAD | RPAD、TRIM、REPLACE
名字
函数
结果
连接函数
CONCAT('Hello', 'World')
HelloWorld
字符截取函数
SUBSTR('HelloWorld',1,5)截取从1-5个字符
Hello
字符串统计长度
LENGTH('HelloWorld')
10
查找字符位置函数
INSTR('HelloWorld', 'W')
6
前填充函数
LPAD(salary,10,'*')
*****24000
后填充函数
RPAD(salary, 10, '*')
24000*****
替换函数
REPLACE ('JACK and JUE','J','BL')
BLACK and BLUE
字符剪切函数
TRIM('H' FROM 'HelloWorld')
elloWorld
2.1、将员工的first_name和last_name拼接在一起显示,并查找工资大于5000的员工信息
select concat(first_name,last_name) name, employee_id,salary from employees where salary>5000 order by salary desc;
<a href="https://s3.51cto.com/wyfs02/M00/8E/4F/wKiom1i86_uh74XsAAC9ziQSSvo430.jpg-wh_500x0-wm_3-wmp_4-s_4093190380.jpg" target="_blank"></a>
2.1.1、单独制造一个列信息,显示为****** infor的显示员工工资大于10000的信息
select concat('*******','information') infor , job_id ,salary from employees where salary > 10000;
<a href="https://s2.51cto.com/wyfs02/M01/8E/4F/wKiom1i87LLyK54RAADetXVWGW8327.jpg-wh_500x0-wm_3-wmp_4-s_41120153.jpg" target="_blank"></a>
2.1.2、由下图可知,concat函数只能拼接两列字符信息,到第三列就开始报错了
<a href="https://s4.51cto.com/wyfs02/M00/8E/4D/wKioL1i87QDhMokSAABZywJc1w4468.jpg-wh_500x0-wm_3-wmp_4-s_3942512758.jpg" target="_blank"></a>
2.2.1、截取员工名字前3个字母,并找到工资大于10000的员工名字
select substr(first_name,1,3) fname, salary from employees where salary >10000;
<a href="https://s3.51cto.com/wyfs02/M02/8E/4D/wKioL1i87siw6h1YAABhGnb_Up4437.jpg-wh_500x0-wm_3-wmp_4-s_811494642.jpg" target="_blank"></a>
2.2.2、查看工资大于10000员工的名字长度
select length(last_name),salary from employees where salary >10000;
<a href="https://s3.51cto.com/wyfs02/M02/8E/50/wKiom1i8-krREPz9AABZpZZDe_U549.jpg-wh_500x0-wm_3-wmp_4-s_1676221475.jpg" target="_blank"></a>
2.3.1、查找Ellen用户 l在第几个位置。
select instr(first_name,'l'),salary from employees where first_name='Ellen';
<a href="https://s2.51cto.com/wyfs02/M02/8E/52/wKiom1i9GN2A_HD_AAAte-lgZPM810.jpg-wh_500x0-wm_3-wmp_4-s_3776249410.jpg" target="_blank"></a>
2.3.2、查找job_id 从第4位截取为REP的。
select instr(first_name,'a'),salary,job_id from employees where substr(job_id,'4') ='REP';
<a href="https://s1.51cto.com/wyfs02/M02/8E/4F/wKioL1i9Gc3xxhaQAACaJPZ7xRc705.jpg-wh_500x0-wm_3-wmp_4-s_3016284077.jpg" target="_blank"></a>
2.4.1、将工资设置为5位长度,不够的用*号前填充
select first_name,lpad(salary,5,'*') from employees;
<a href="https://s4.51cto.com/wyfs02/M00/8E/50/wKioL1i9G3bAeKh9AABm08ruszs510.jpg-wh_500x0-wm_3-wmp_4-s_2199946422.jpg" target="_blank"></a>
2.5.1、查找工资显示10位,不足的用*号后填充
select first_name,rpad(salary,10,'*') from employees;
<a href="https://s3.51cto.com/wyfs02/M02/8E/50/wKioL1i9HEThfpZVAABuXCSf7Hg829.jpg-wh_500x0-wm_3-wmp_4-s_3957205278.jpg" target="_blank"></a>
2.6.1、将员工名字开头为B的变成JC开头。
select replace(first_name,'B','JC'),salary from employees order by first_name;
<a href="https://s3.51cto.com/wyfs02/M02/8E/52/wKiom1i9HieDHyRyAACCcGbCQD4583.jpg-wh_500x0-wm_3-wmp_4-s_193282057.jpg" target="_blank"></a>
2.7.1、将员工姓名首字母为A的,去掉A
select trim('A' from first_name),salary from employees order by first_name;
<a href="https://s4.51cto.com/wyfs02/M01/8E/50/wKioL1i9HtKRmAOLAABhxyyH1BE883.jpg-wh_500x0-wm_3-wmp_4-s_3851811214.jpg" target="_blank"></a>
2.8 查看job_id第四位开始是REP的,查看first_name a在第几位置
select employee_id,concat(first_name,last_name) Name,job_id,length(first_name),instr(first_name,'a') "contains 'a'?"
from employees where substr(job_id,4) = 'REP';
<a href="https://s4.51cto.com/wyfs02/M01/8E/52/wKiom1i9IDKB3MGTAADkKDmX2WY823.jpg-wh_500x0-wm_3-wmp_4-s_3601213133.jpg" target="_blank"></a>
2.9、公司计划给每名员工印制含有员工姓名的纪念品,为保持整体美观程度,现在要求员工的全名在
16个字符内。当员工的FIRST_NAME和LAST_NAME的合并长度超过15个字符时,显示员工学名,。员
工的名称由FIRST_NAME的首字母和LAST_NAME的前14个字符组成。
【解题思路】首先确定where条件限制FIRST_NAME和LAST_NAME的合并长度超过15的员工进行过
滤,然后在SELECT 子句后面使用字符函数进行处理。
select first_name,last_name,substr(first_name,1,1)||' '||substr(last_name,1,14) format_name from employees where length(first_name)+length(last_name) >15;
<a href="https://s3.51cto.com/wyfs02/M02/8E/52/wKioL1i9bv_xPVK0AACIzH5cWwU071.jpg" target="_blank"></a>
数值函数
示例
ROUND:四舍五入到到指定的十进制值
ROUND(45.926, 2)
45.93
TRUNC:将数字截尾取整
TRUNC(45.926, 2)
45.92
MOD:返回余数
MOD(1600, 300)
100
这里使用DUAL来测试,这是一个‘伪表’,可以用来测试函数和表达式
1、测试round函数三种方式
select round(45.9234,2),round(45.923,0),round(45.923,-1) from dual;
select round(45.9259,2),round(45.623,0),round(45.923,-1) from dual;
通过上面两个语句测试可知:
第一个为在小数点右侧截取2位,如果第三位是5就四舍五入
第二个为标准小数点右侧第一位进行四舍五入
第三个为小数点左侧进行四舍五入,不够进变成0,比如round(43.923,-1),结果变成40
<a href="https://s1.51cto.com/wyfs02/M02/8E/50/wKioL1i9JYnCCIVbAAA3PzSKK2o171.jpg-wh_500x0-wm_3-wmp_4-s_2710836948.jpg" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M01/8E/50/wKioL1i9JiCz8MMNAAA2g9Je8Xg656.jpg-wh_500x0-wm_3-wmp_4-s_1034388173.jpg" target="_blank"></a>
2、测试trunc函数三种方式
SELECT TRUNC(45.923,2), TRUNC(45.923),TRUNC(45.923,-1) FROM DUAL;
<a href="https://s1.51cto.com/wyfs02/M02/8E/50/wKioL1i9KG3TrRUaAAA7iCppTRw291.jpg-wh_500x0-wm_3-wmp_4-s_4291974181.jpg" target="_blank"></a>
SELECT TRUNC(45.923,2), TRUNC(45.923),TRUNC(39.923,-1) FROM DUAL;
<a href="https://s1.51cto.com/wyfs02/M00/8E/50/wKioL1i9KIyC_yEcAAA4fxb84J8449.jpg-wh_500x0-wm_3-wmp_4-s_3306759360.jpg" target="_blank"></a>
SELECT TRUNC(45.923,2), TRUNC(45.923),TRUNC(39.923,-2) FROM DUAL;
<a href="https://s1.51cto.com/wyfs02/M01/8E/50/wKioL1i9KKnC24vKAAAuf0SWDLM413.jpg-wh_500x0-wm_3-wmp_4-s_3067855423.jpg" target="_blank"></a>
命令分别为指定截取位数2位,默认截取小数点位右侧删除掉,删除掉小数点左侧第一位变成0
当为-3的时候就表示截取3位,直接变成0
3、测试mod函数查询销售部门的工资与5000取余数
select last_name,salary,mod(salary,5000) from employees where job_id='SA_REP';
<a href="https://s3.51cto.com/wyfs02/M00/8E/52/wKioL1i9VSyB_pDOAAB8QirUHOA159.jpg-wh_500x0-wm_3-wmp_4-s_364994681.jpg" target="_blank"></a>
Oracle内部使用数字存储日期: 世纪,年,月,日,小时,分钟,秒
默认的日期显示格式为DD-MON-RR
– 可以只指定年的后两位,允许存储21世纪日期在21世纪中
– 同样,允许存储20世纪的日期在21世纪中
RR 日期格式
当前年
指定日期
RR格式
YY格式
1995
27-OCT-95
27-OCT-17
2017
1917
2001
2095
使用 SYSDATE 函数
SYSDATE 函数返回:
日期
时间
select sysdate from dual;
<a href="https://s1.51cto.com/wyfs02/M02/8E/52/wKioL1i9WwSi9GYhAAAWMnXoz8c698.jpg-wh_500x0-wm_3-wmp_4-s_2418238601.jpg" target="_blank"></a>
日期的算术运算
在日期上加上或减去一个数字结果仍为日期。
两个日期相减返回日期之间相差的天数。
可以用小时数除以24,可以加小时到日期上。
1、查询90部门的员工都入职多少个星期了
select last_name,(sysdate-hire_date)/7 as weeks from employees where department_id=90;
<a href="https://s5.51cto.com/wyfs02/M02/8E/54/wKiom1i9XBeCai0MAAA78MWonhY344.jpg-wh_500x0-wm_3-wmp_4-s_3695015849.jpg" target="_blank"></a>
2、查询30部门的员工都入职多少个月了
select first_name,(sysdate-hire_date)/30 month from employees where department_id=30;
<a href="https://s4.51cto.com/wyfs02/M00/8E/54/wKiom1i9XJ-DFnmoAABd9aYRfPg106.jpg-wh_500x0-wm_3-wmp_4-s_2050334507.jpg" target="_blank"></a>
日期操作函数
含义
MONTHS_BETWEEN ('01-SEP-95','11-JAN-94')
两个日期相差的月数
19.6774194
ADD_MONTHS ('06-MAR-17',1)
向指定日期中加上若干月数
06-APR-17
NEXT_DAY ('01-SEP-95','FRIDAY')
指定日期的下一个日期
08-SEP-95
LAST_DAY ('01-SEP-95')
本月的最后一天
30-SEP-95
ROUND (SYSDATE,'MONTH')
日期四舍五入
01-MAR-17
ROUND (SYSDATE ,'YEAR')
01-JAN-17
TRUNC (SYSDATE ,'MONTH')
日期截断
TRUNC (SYSDATE ,'YEAR')
感觉上面这几个不太对,现在还没明白,回头再说
1、查询截至01-JAN-2012已入职100月的员工信息包含EMPLOYEES,LAST_NAME和HIRE_DATE字段
select last_name,hire_date,months_between('01-JAN-2012',hire_date) day from employees where months_between('01-JAN-2012',hire_date) >100;
本文转自 yuri_cto 51CTO博客,原文链接:http://blog.51cto.com/laobaiv1/1903488,如需转载请自行联系原作者