1、Oracle中函数大致可以分为哪两类?
单行函数、聚合函数
2、单行函数可以分为哪些?
字符函数、数字函数、转换函数、日期函数、正则表达式函数
3、字符函数有哪些?
length(xx)
lower(xx)、upper()
例如:select * from emp where ename=UPPER('&STR');--用户输入为大写
concat(m,n)--与拼接字符串||相似
initcap(xx)--首字母大写
nvl(x,y)--如果x为null,则x被替换为y;例如select nvl(null,'不能为空') from dual;
nvl2(x,y,z)--如果x为null,则x被替换为z;否则换位y
nanvl(n1,n2)--如果n1是数字,就返回n1否则返回n2
replace(x,y,z)--将x中的字符y替换为字符z
例如:select replace('xdff-sdf','-','**') from
dual;--结果为“xdff**sdf”
substr(x,m,n)--将x从第m位开始截取长度为n的字符出来;n不写默认截取到尾巴
例如:select substr('abcdefg',-3,2) from dual;--取负3位和负2位,即e和f
面试题:substr是从0还是1开始算?--0和1都一样
instr(xxxx,y,m,n)--在xxxx中找y,从xxxx中的第m个,找到的第n个在第几位;说白了就是找第n个y在第几位;例如:
select instr(ename,'T',1,2),ename from emp;--找到SCOTT的T,结果就是5
lpad(x,n,y)/rpad(x,n,y)
lpad(sno,6,'*')--用*把sno凑足6位数
trim(leading '不想显示的字符y' from x)
from 表;--将x的左边的y去掉
trim(trailing '不想显示的字符y' from x)
from 表;--将x的右边的y去掉
trim( both
'不想显示的字符y' from x) from 表;--将x的两边的y去掉
select trim( ' - sf - ') from dual;--结果显示- sf
-割这种情况默认跟不写both是等效的
ltrim和rtrim也是跟trim一样的用法
通用函数:DECODE
格式:decode(数值|列,'判断值1','显示值1','判断值2','显示值2'...)
例如:select
decode(job,'CLERK','办事员','SALES','销售员') from
emp;
4、数字函数有哪些?
abs(x)、ceil(x)、floor(x)取小于等于x的整数、mod(x,y)取余、round(x,y)取整四舍五入、trunc(x,y)截断取整;举例如下:
select round(4.1201,2) from dual;--结果为4.12
select round(4.1291,2) from dual;--结果为4.13
select round(4.1291,0) from dual;--结果为4
select round(4.9291,0) from dual;--结果为5
select round(114.1291,-2) from dual;--结果为100
select round(154.1291,-2) from dual;--结果为200
select trunc(4.1201,2) from dual;--结果为4.12
割
select trunc(4.1291,2) from dual;--结果为4.12
select trunc(4.1291,0) from dual;--结果为4,直接取整数部分
select trunc(4.9291,0) from dual;--结果为4,直接取整数部分
select trunc(114.1291,-2) from dual;--结果为100
select trunc(154.1291,-2) from dual;--结果为100
5、日期函数有哪些?
select add_months(sysdate,1) from dual;--求下一月的这个时候
select last_day(sysdate) from dual;--求本月最后一天的这个时间点
select
months_between('17-7月 18','19-7月 18')
from dual;--求月x-y的差值,结果为-0.064516(月)
select sysdate,next_day(sysdate,5) from
dual;--不是下5天,而是指从星期天开始数到第5天的那天
select
sysdate,next_day(sysdate,'星期一') from dual;--求下一个周一
select
sysdate,round(sysdate),round(sysdate,'yyyy'),round(sysdate,'MM'),round(sysdate,'dd')
from dual;--四舍五入,需研究一下
select
sysdate,trunc(sysdate),trunc(sysdate,'yyyy'),trunc(sysdate,'MM'),trunc(sysdate,'dd')
from dual;--没有四舍五入了
6、类型转换
select to_char(sysdate,'yyyy-MM-dd hh24:mi:ss') from dual;
select to_date('2018-07-20 11-02-33','yyyy-MM-dd HH12:MI:SS') from
dual;
7、聚合函数有哪些?
count()、min()、max()、sum()、avg()
补充问:group
by怎么使用?
select * from emp;--可以看出总共有14行数据
select job,avg(sal) from emp group by job;--使用group
by后被分组了,并统计每组的平均值
注意:group
by对行进行单独分组使用,意义不大,一般与聚合函数一起使用!
补充问:having子句是干嘛用的?
对聚合函数进行限制。
elect job,avg(sal) from emp group by job having
avg(sal)>1500;--注意having不能被替换成where