日期:2014-05-16  浏览次数:20599 次

oracle-----单行函数
Oracle是对大小写敏感的。。。。

Oracle中的单行函数

1.字符函数:对字符进行操作
select UPPER('smith') from dual;
select * from emp where ename = UPPER('smith');
LOWER('SMitH') ;//变成小写
INITCAP("ddd") ;//第一个字母大写,其他字母小写
SUNSTR(‘hello’,1,3) //字符串截取,注意,SUNSTR(‘hello’,0,3);这两个函数效果一样,因为Oracle认为0和1都是头一个字母
LENGTH('HELLO') ;// 字符串长度
replace('hello','l','x');//这里相当于java中的relpaceAll,结果是hexxo

要求显示所有雇员的姓名以及姓名的后三个字符
    方法1:select ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp;:

    方法2:select ename ,SUBSTR(ename,-3,3); //从倒数第三个开始取三个
    
数值函数:对数字进行操作
执行四舍五入: select ROUND(789.536) from dual;  //结果为790
               select ROUND(789.536,2) from dual //结果为789.54,保留两位小数
               select ROUND(789.536,-2) from dual; //结果为800,因为789中9的位置是-1,8的位置是-2,而8又可以进位,所以是800
TRUNC(): 这个函数不会保留任何小数,而且小数点也不会执行四舍五入的操作
select TRUNC(789.536) FROM dual; //结果是789
select TRUNC(789.536,2) FROM dual; //结果是789.53
select TRUNC(789.536,-2) FROM dual; //结果是800

MOD();
select MOD(10,3) FROM dual; //10除以3的余数....结果为1

显示正好为5个字符的员工的姓名:
select ename from emp where LENGTH(ename) = 5;

显示不带R的员工的姓名:
select ename from emp where ename NOT LIKE '%R%';

显示所有员工的前三个字符:
 select SUBSTR(ename,0,3) from emp ;


----------------------------------

2.日期函数:
规律:
    日期 - 数字 = 日期
    日期 + 数字 = 日期
    日期 - 日期 = 数字(天数) //这里和java中不同,Java是得到毫秒数
显示10部门雇员进入公司的星期数
   1。先获得当前时间:select sysdate from dual
   2.求星期数: (当前日期 - 雇佣日期)/7 = 星期数 
   select empno,ename,(SYSDATE - hiredate)/7 from emp; //不过这里求出来的日期是有小数点的哈
   改进: select empno,ename,ROUND((SYSDATE - hiredate)/7) from emp;
   
select empno,ename,MONTHS_BETWEEN(sysdate,hiredate) from emp;   
select ADD_MONTHS(SYSDATE,4) from dual; //在当前时间上加入4个月
求当前日期的下一个星期一是几月几号,如果明天是星期一,那么求出来的日期是明天
select NEXT_DAY(SYSDATE,'星期一') FROM dual;

求出本月的最后一天:
select LAST_DAY(SYSDATE) from dual; //这个函数也就是在当前日期上加上一些天数,不齐到最后一天

找出各月倒数第三天受雇的所有员工:
select empno from emp where LAST_DAY(hiredate)-2 = hiredate; 
LAST_DAY(hiredate)意思是各月的倒数第一天,如果LAST_DAY(hiredate)-1显然是倒数第二天,那么LAST_DAY(hiredate)-2显然是倒数第三天

求出工作了7年以上的员工
select * from emp where MONTH_BETWEEN(SYSDATE,hiredate)/12 > 7;

求出受雇员工的年份和月份,按照雇用日期所在月由大到小排序,如果月份相同则将最早年份排在前面。

明确的是: order by 可以对字符串排序
select ename,TO_CHAR(hiredate,'yyyy') year ,TO_CHAR(hiredate,'mm') mon
from emp 
order by mon desc,year ;

显示在一个月为30天的情况所有员工的日薪,忽略余数
select ename,ROUND(sal/30) from emp; //注意题目的表达,一个月为30天的情况的意思是每个月都假设只有三十天

找出在二月受聘的员工:
 select * from emp where TO_CHAR(hiredate,'mm') = 2; //注意TO_CHAR虽然是把日期转换成字符串,但是在oracle中 如果一个字符串和一个numbe比较,那么这个字符串会自动去掉前导0,然后再转换成number类型。。。。

显示每个员工加入公司的天数
select ename,ROUNC((hiredate - SYSDATE)) date from emp; 

以年月日的方式显示所有员工的服务年限,注意:因为有闰年存在,所以天数只能大概求出来
       select BETWEEN_AND(SYSDATE,hiredate)*12 year,
              MOD(BETWEEN_AND(SYSDATE,hiredate),12) month,
              TRUNC(MOD((SYSDATE-hiredate),30)) day
       from emp;

--------------------------------------
3.转换函数:
   select hiredate from emp; //这个查出来的日期是这种样子的字符串,他会调用一个默认的to_char :12-12月-01
   TO_CHAR();//把日期或者数字转换成字符串
   select TO_CHAR(hiredate,'yyyy年mm月dd日') from emp;//结果为1986年05月06日 ,注意月和日前面都有前导0 
   select TO_CHAR(hiredate,'fmyyyy年mm月dd日') from emp; //在前面加上fm,则会去掉前导0
   select TO_CHAR(sal,'99,999') from emp; //其中9代表一位数字,那么这样表示出来的金额就会以,分隔了
   select TO_CHAR(sal,'$99,999') from emp; //结果前面加上了一个$符号  ,如 $23,783
    select TO_CHAR(sal,'L99,999') from emp; //L表示Local,会以本地字符集显示
    
   TO_NUMBER();//是将 字符串 变成数字的一种函数
   select TO_NUMBER('123') + TO_NUMBER('123') from dual;
   TO_DATE();//将 字符串 变成date类型
    select TO_DATE('2009-02-16','yyyy-mm-dd') from dual; //又因为是显示,那么他会自动调用默认to_char转换为默认格式
---------------------------------    
4.通用函数:
    求雇员年薪:
       select empno,ename,(sal+comm)*12 from emp; //这样求出来的年薪有些是空值,原因是有些雇员的奖金是NULL,NULL经计算之后结果还是NULL
    使用NVL()函数:可以将一个空值变成指定的内容 ,  Null to value,也就是使null有值
       select empno,ename,(sal+NVL(comm,0))*12 from emp; 
       
   DECODE(1,1,'内容是1',2,'内容是2',3,'内容是3'); //相当于switch(1){
                                                           case 1 : '内容是1';break;