一、简单函数
1.lower():转为小写
select lower('ABCdef') from dual;
2.upper():转大写
select upper('Ttttttt') from dual;
3.initcap(x) 单词首字母转大写
select INITCAP('fanghuafeng') FROM dual;
4.length():字符长度
select length(ename) leng ,ename from scott.emp;
5.lengthb():字节长度,一个汉字占两字节,用于判断是否含有中文
select length('国家'),lengthb('国家') from dual;
6.VSIZE(c) 返回c的字节数。
select length('国家'),lengthb('国家),vsize('国家') from dual;
7.mod(a,b):取模,正负取被除数的符号
select mod(5,-2),mod(5,0),mod(-5,2) from dual;1
8.ROUND(a,n):对a从n位开始四舍五入,默认为取整
select ROUND(23.56),ROUND(23.56,1),ROUND(23.56,-1),ROUND(23.56,-2) FROM DUAL;
9.TRUNC(a,n):对a从n位开始截取小数点右边直接截取,左边截取后给0,默认从小数点前截取
select TRUNC(23.56),TRUNC(23.56,1),TRUNC(23.56,-1) FROM DUAL;
10.CEIL(n) 返回大于或等于n的最小的整数值
select ceil(3.16),ceil(-3.16) from dual;--4,-3
11.FLOOR(n) 返回小于等于n的最大整数值
select floor(3.76),floor(-3.16) from dual; --3,-4
12.GREATEST(n1,n2,...n) 返回序列中的最大值
select GREATEST(15,5,75,8) "Greatest",greatest('方','华','峰') FROM DUAL;
13.LEAST(n1,n2,n3..n)返回最小值
select LEAST(15,5,75,8) LEAST,least('方','华','峰') FROM DUAL;
14.随机函数dbms_random,返回随机数和随机字符串
小树点后38位长度的随机数,默认为0到1之间,可以指定范围
select dbms_random.value(),dbms_random.value(10,20) FROM dual;
返回指定格式的随机字符串string('parameter',length),字母:'a'不分大小写'u'大写'l'小写'x'大写加数字'p'所有字符
select dbms_random.string('p',5),dbms_random.string('a',5),dbms_random.string('x',5) from dual;
15.trim函数
select trim(' aaaa ') aaa,ltrim(',aaabcd',',') bb from dual;
16.LPAD(c1,n[,c2]):n为负值为空,给c1左边补c2使得字符串长等于n,默认补空格,有截取子串的功能
select LPAD('WhaT',5),LPAD('WhaT',25),LPAD('WhaT',25,'-'),LPAD('WhaT',-4,'-') FROM DUAL;
17.RPAD(c1,n[,c2]):右补
select RPAD('WhaT',5),RPAD('WhaT',25),RPAD('WhaT',25,'-'),LPAD('WhaT',-4,'-') FROM DUAL;
18.NULLIF(c1,c2):逻辑等价于:CASE WHEN c1 = c2 THEN NULL ELSE c1 END
select NULLIF('a','b'),NULLIF('a','a') FROM DUAL;
19.返回第一个不为空的值,如果所有的都为空,则返回NULL。
select COALESCE(null,'','1','a') from dual;
20.CAST(c as newtype) 将指定字串转换为指定类型,基本只对字符类型有效
select cast('1001' as number(5,1)) from dual; --1001
21.DUMP:返回存储信息
select dump('abcd') from dual; --Typ=96 Len=4: 97,98,99,100
22.查询本地语言,会话的SID
select userenv('language'),userenv('sid') from dual;
23.user 当前回话的用户
select user from dual;
24.define返回数据库信息,用户均可执行sqlplus命令
define
25.英文字符集下的逆序函数 REVERSE()
select reverse('abcd'),reverse('123456') from dual;
二、字符串函数
1.substr(str,n1,l) 将str从n1位置开始,截取l长度的子串
2.instr(str,str1,n1,n2)返回str1在str中从n1开始,第n2次出现的位置,可用于判断字符包含性等同于like
3.replace(str,str1,str2)字符串级别的替换,将str中额str1替换为str2
4.translate(str,str1,str2)字符级别的替换,对应不上的替换为空,str1,str2任何一个为null结果就为null
select translate('abcb3add5esa6d','_1234567890','_') from dual;--计算长度判断是否含有指定字符
5.反向输出
中文外逆序系统函数 REVERSE()
中文:
create or replace function my_Reverse(s varchar2)
return varchar2
is
my_Result varchar2(1000);
v_s varchar2(1000);
begin
v_s:=substr(s,1,1);
for i in 2..length(s) loop
v_s:=substr(s,i,1)||v_s;
end loop;
my_Result:=v_s;
return(my_Result);
end;
三、格式转换函数
1.to_char(date,'format'):时间格式化输出显示,to_char(number,'xxxx')10进制转为16进制
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
select to_char(15,'xxxx') FROM dual;
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
insert into emp_a values(7777,'FHF','IT',7566,'1989-01-23 15:30:20',30,null,null);
2.to_date(string,'format'):将字符串转化为日期型,受客户端影响不一定可以格式化
select to_date ('2014-10-03 9:51:38','yyyy-mm-dd hh:mi:ss') from dual;
select to_date ('2003-10-17 21:15:37','yyyy-mm-dd hh24:mi:ss') from dual;
3.TO_NUMBER(str,format)明确的字符转数字,16进制转为10进制
select TO_NUMBER('-100.00') FROM DUAL;
select to_number('19f','xxxx') FROM dual;
4.nvl(string1,string2):string1为null则替换显示string2
select t.*,nvl(comm,0) new_comm from scott.emp t;
5.nvl2(string1,string2,string3):string1为null则取string3否则取string2
select t.*,nvl2(comm,comm+100,0) new_comm from scott.emp t;
6.DECODE(exp,s1,r1,s2,r2..s,r[,def])
select decode('a2','a1','true1','a2','true2','default') from dual;
7.case函数
case col when value1 then value1_1
when value2 then value2_2
else value3_3
end;
8.bin_to_num 2进制转换为10进制:
select bin_to_num(1,0,0,1),bin_to_num(1,1,0,1) from dual;
9.10进制转化为2进制
CREATE OR REPLACE FUNCTION NUMBER_TO_BIT(V_NUM NUMBER) RETURN VARCHAR IS
V_RTN VARCHAR(8); --注意返回列长度
V_N1 NUMBER;
V_N2 NUMBER;
BEGIN
V_N1 := V_NUM;
LOOP
V_N2 := MOD(V_N1, 2);
V_N1 := ABS(TRUNC(V_N1 / 2));
V_RTN := TO_CHAR(V_N2) || V_RTN;
EXIT WHEN V_N1 = 0;
END LOOP;
--返回二进制长度
SELECT LPAD(V_RTN, 8, 0) INTO V_RTN FROM DUAL;
RETURN V_RTN;
END;
四、日期函数
1.ADD_MONTHS() 返回指定日期月份+n之后的值,n可以为任何整数。时间的月份计算,只改变月份,其他时间同当
前年的改变可以通过月份*12运算
select ADD_MONTHS(sysdate,1),ADD_MONTHS(sysdate,-12) FROM DUAL;
2.current_date:当前系统时间,设置会话的日期格式
alter session set nls_date_format='yyyy-mm-dd';
select SYSDATE,CURRENT_DATE FROM DUAL;--CURRENT_DATE比sysdate快1秒
3.LAST_DAY(d) 返回指定时间所在“月”的最后一天,时分秒对应为当前时间
select last_day(SYSDATE) FROM DUAL;
select last_day(add_months(sysdate,-1)) FROM DUAL;
4.next_day(d,n):返回指定日期后最近的星期n日期
select next_day(sysdate,1) from dual;--1..7代表周日..周六
select NEXT_DAY(SYSDATE,'星期四') FROM DUAL;
5.MONTHS_BETWEEN(d1,d2) 返回d1与d2间的月份差,视d1,d2的值大小,结果可正可负,当然也有可能为0,d1-d2
select months_between(sysdate,add_months(sysdate,-3)) from dual;
6.ROUND(d[,fmt]):year按月,month按日,ddd按上下半天,day按周四舍五入,不能为时分秒,判断时间区间
select round(sysdate,'year'),round(sysdate,'month'),round(sysdate,'ddd'),round(sysdate,'day') from dual;
7.trunc(d,format):yyyy,Iy,month,q,WW,day,hh,hh24,找开始时间
select trunc(to_date('20080702 08:05:21','YYYYMMDD HH24:MI:SS'),'YYYY') FROM dual; --当年第一天
select trunc(to_date('20080702 08:05:21','YYYYMMDD HH24:MI:SS'),'IY') FROM dual;--去年年底
select trunc(sysdate,'Q') FROM dual--季度第一天
select trunc(sysdate,'month') FROM dual--月份第一天
select trunc(sysdate,'WW') FROM dual--周的第一天,不是完整的周***********
8.EXTRACT(fmt FROM d):提取日期中的特定部分
select sysdate,extract(year from sysdate) year,extract(month from sysdate) months,
extract(day from sysdate) day,extract(hour from systimestamp ) hour,extract(minute from systimestamp ) minute,
extract(second from systimestamp ) second from dual;
select sysdate,extract(year from to_date('2014-10-11 19:44:35','yyyy-mm-dd hh24:mi:ss')) year,
extract(month from to_date('2014-10-11 19:44:35','yyyy-mm-dd hh24:mi:ss')) months,
extract(day from to_date('2014-10-11 19:44:35','yyyy-mm-dd hh24:mi:ss')) day,
extract(hour from to_timestamp('2014-10-11 19:44:35','yyyy-mm-dd hh24:mi:ss') ) hour,
extract(minute from to_timestamp('2014-10-11 19:44:35','yyyy-mm-dd hh24:mi:ss') ) minute,
extract(second from systimestamp ) second from dual;
select to_char(SYSDATE,'yyyy'),to_char(SYSDATE,'mm'),to_char(SYSDATE,'dd') FROM dual;
9.获得两个时间的相差单位时间,获得小时,分钟,秒,毫秒通过时间换算即可;
select CEIL (SYSDATE-to_date('2014-10-30 14:20:50','yyyy-mm-dd hh24:mi:ss')) FROM dual;--1天
select SYSDATE+1 FROM dual;--sysdate+n运算单位是天
五、分析聚合函数
1.开窗函数dense_rank(),rank(),row_number() over(partition by col1 order by col2)分类排序必须要有order by字句
select empno,deptno,ename,sal, dense_rank() over(partition by deptno order by sal desc) num
from scott.emp;
select empno,deptno,ename,sal, rank() over (partition by deptno order by sal desc ) num
from scott.emp;
select empno,deptno, ename, sal, row_number() over (partition by deptno order by sal desc ) num
from scott.emp order by deptno;
2.聚合分析,可以给表中记录均带上聚合值,同时可以显示未分组的列
a.聚合函数
SELECT deptno, AVG(sal) FROM scott.emp GROUP BY deptno ORDER BY 1;
b.聚合分析函数
SELECT deptno,ename,job, AVG(sal) OVER(PARTITION BY deptno ) num FROM scott.emp ORDER BY deptno;
3.指定字段排序累计,相同字段值累计值相同
select empno,ename,sal,sum(sal) over(order by sal desc) from emp;
select empno,ename,sal,sum(sal) over (order by deptno) from emp;
六、正则表达式
1.REGEXP_LIKE --与LIKE的功能相似
2.REGEXP_INSTR --与INSTR的功能相似
3.REGEXP_SUBSTR --与SUBSTR的功能相似
4.REGEXP_REPLACE --与REPLACE的功能相似
七、利用系统函数搭建测试数据
通过一条 SQL快速生成大量的测试数据
create table myTestTable as
select rownum as id,to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,
trunc(dbms_random.value(0, 100)) as random_id,dbms_random.string('x', 20) random_string
from dual connect by level <= 100000;