日期:2014-05-16 浏览次数:20726 次
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;