立即学习:https://edu.csdn.net/course/play/3574/62068?utm_source=blogtoedu
/*环境设置*/
set linesize 300;
set pagesize 300;
/*单行函数练习*/
SELECT LOWER('Hello') FROM emp;
SELECT LOWER('Hello') FROM dual;
SELECT LOWER('Hello'), UPPER('Hello') FROM dual;
SELECT * FROM emp WHERE ename = "&inputname";
/*改善输入操作*/
SELECT * FROM emp WHERE ename = UPPER("&inputname");
/*首字母大写 INITCAP*/
SELECT INITCAP('HelloWorld') FROM dual;
/*范例将每一个雇员的姓名首字母大写*/
SELECT INITCAP(ename) FROM emp;
/*计算字符串长度 LENGTH*/
/*查询每个雇员姓名的长度*/
SELECT ENAME, LENGTH(ename) FROM emp;
/*查询雇员姓名长度为5的全部雇员信息*/
SELECT * FROM emp WHERE LENGTH(ename) = 5;
/*字符串替换 REPLACE*/
/*将所有雇员姓名之中的字母A替换为 “_”*/
SELECT REPLACE(ename, UPPER('a'), '_') FROM emp;
/*消除空格数据*/
SELECT REPLACE('hello world nihao zaijian', ' ','')FROM dual;
/*字符串截取 SUBSTR ,索引下标从1开始*/
SELECT SUBSTR('helloworldnihao', 11) FROM dual;
SELECT SUBSTR('专注磨一剑', 2,5) FROM dual;
/*要求截取每一位雇员姓名的前3位字符*/
SELECT SUBSTR(ename, 1, 3) FROM emp;
SELECT SUBSTR(ename,-3) FROM emp;
/*
面试题: 请问oracle 中的SUBSTR()函数截取时字符串的索引是从1开始还是从0开始?
Oracle中的字符串索引都是从1开始的,即使设置为0 也会自动变为从1 开始
*/
/*
数值函数:常用 ROUND(), TRUNC(), MOD()
ROUND语法: ROUND(列 | 数字 [,保留小数位]),如果不设置保留小数位表示不保留
*/
SELECT ROUND(7895.658944355), ROUND(78945.55662, 2), ROUND(78945.55662, -2), ROUND(-15.35)
FROM dual;
/*
截取小数,所有的小数都不进位
语法: 数字 TRUNC(列|数字, [,小数位])
*/
SELECT TRUNC(7895.658944355), TRUNC(78945.55662, 2), TRUNC(78945.55662, -2), TRUNC(-15.35)
FROM dual;
/*求模 (求余数)
语法 : 数字 MOD(列1 |数字1, 列2|数字2)
*/
SELECT MOD(10, 3) FROM dual;
/*
日期函数:Oracle专门提供有一个数据伪劣,SYSDATE
*/
SELECT ename, hiredate, SYSDATE FROM emp;
SELECT SYSDATE FROM dual;
SELECT SYSDATE, SYSTIMESTAMP FROM dual;
/*
日期时间计算模式:
1. 日期 + 数字 = 日期(若干天之后的日期)
2. 日期 - 数字 = 日期(若干之前的日期)
3. 日期 - 日期 = 数字(两个日期间的天数)
*/
SELECT SYSDATE, SYSDATE + 10, SYSDATE+9999 FROM dual;
SELECT SYSDATE, SYSDATE - 8 FROM dual;
/*计算每一位雇员到今天为止的雇佣天数*/
SELECT ename, hiredate, SYSDATE - hiredate FROM emp;
/*
计算两个日期之间所经历的月数总和
语法: MONTHS_BETWEEN(日期1,日期2)
*/
/*计算每一位雇员到今天位置的雇佣总月数*/
SELECT ename, hiredate, MONTHS_BETWEEN(SYSDATE, hiredate) FROM emp;
/*计算每一位雇员到今天的雇佣年份*/
SELECT ename, hiredate, TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate)/12) FROM emp;
/*增加若干月之后的日期:
语法 : 日期 ADD_MONTHS(日期, 月数)
*/
/* 范例测试 ADD_MONTHS() 函数*/
SELECT ADD_MONTHS(SYSDATE, 4), ADD_MONTHS(SYSDATE, 24), ADD_MONTHS(SYSDATE, 300) FROM dual;
/*利用函数,直接避免了 闰年闰月的换算*/
/*计算所有还差一年满35年雇佣日期的雇员*/
SELECT * FROM emp WHERE TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) = 34 ;
/*
计算所在日期所在月的最后一天
语法: 日期LAST_DAY(日期)
*/
SELECT LAST_DAY(SYSDATE) FROM dual;
/*查询所有在雇佣所在月倒数第二天被雇佣的雇员信息*/
/*首先应该知道每一位雇员雇佣月的最后一天,而后利用 "日期-数字=日期",计算出倒数第二天*/
SELECT ename, hiredate, LAST_DAY(hiredate), LAST_DAY(hiredate)-2 FROM emp;
/*计算下一个指定的星期:
语法: 日期 next_day(日期, 一周时间数)
*/
/*计算雇佣日期的下一个星期二*/
SELECT hiredate, NEXT_DAY(hiredate, '星期二') FROM emp ;
/*要求查询出雇员的编号、姓名、雇佣日期,以及每一位雇员到今天为止所被雇佣的年数、月数、天数*/
SELECT empno, ename, hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate)/12) as hireyears,
TRUNC(MOD(MONTHS_BETWEEN(SYSDATE, hiredate),12))as hiremonths,
TRUNC(SYSDATE - ADD_MONTHS(hiredate, MONTHS_BETWEEN(SYSDATE, hiredate))) as hiredays
FROM emp;
/*转换函数 :
字符串与日期、数字的转换
TO_CHAR(列 | 日期|数字,转换格式) 常用
转换格式主要两类: 日期转换为字符串: 年(yyyy)、月(mm)、日(dd)、时(hh、hh24)、分(mi)、秒(ss)
数字转换为字符串:任意的一位数字(9)、货币(L,本地货币)
TO_DATE() 常用
TO_NUMBER()
*/
SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd'),TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss') FROM dual;
/*查询每个雇员的编号、姓名、雇佣年份*/
SELECT empno, ename, TO_CHAR(hiredate, 'yyyy') year
FROM emp;
/*查询所有在2月份雇佣的雇员信息*/
SELECT * FROM emp WHERE TO_CHAR(hiredate, 'mm')='02';
/*Oracle中实际提供数据类型的自动转换
如果发现比较的类型不统一,在一定的范围内它是可以转换的
*/
SELECT * FROM emp WHERE TO_CHAR(hiredate, 'mm')=2;
/*转换数字格式*/
SELECT TO_CHAR(789522566252365, 'L999,999,999,999,999') FROM dual;
/* 实现字符串转换为日期*/
SELECT TO_DATE('1988-10-11', 'yyyy-mm-dd') FROM dual;
/*
转数字函数 TO_NUMBER(字符串)
*/
SELECT TO_NUMBER('123') + TO_NUMBER('1') FROM dual;
SELECT '1'+'2' FROM dual;