Oracle学习 第7天
—— 函数
Oracle中函数的分类
主要分两大类:单行函数 和 多行函数
单行函数:对每一行输入值进行计算,得到相应的计算结果。以每一行为参数的。如:LENGTH。
SELECT LENGTH(ename) FROM emp;
SELECT MAX(sal) FROM emp;
单行函数分为五小类
1、字符函数
① REPLACE(字段名, 准备替换的字符, 替换之后的字符)
-- 该函数用户替换字符串。其操作的是显示结果,并不是数据库中真实的数据。
SELECT t.*, REPLACE(t.ename, 'A', '*') AS replace_uname FROM emp T;
示例:将ENAME中的 'A' 全部替换成 '*'
② INSTR(字符串, 子字符串, 开始查找的位置, 出现的位置)
-- 该函数用户查找子字符串在源字符串中出现的位置。开始位置与出现位置默认从1开始计数。
SELECT (SELECT t.ename FROM emp t WHERE t.empno = 7788)||'OracleScottUser' AS ENAME, INSTR ((SELECT t.ename FROM emp t WHERE t.empno = 7788), 'T',1,2) FROM dual;
示例:查询EMP表中EMPNO为7788的用户姓名并拼接上字符串OracleScottUser之后输出,并且从第 1 个字符开始查找最后输出的字符串中第 2 个 'T' 的位置。
③ CONCAT(字段/字符串, 字段/字符串)
-- 该函数用于连接两个字符串,也可以连接字段。效果与 || 相同。
SELECT t.ename || '的工作是:'|| t.job AS msg FROM emp t;
④ INITCAP(字段/字符串)
-- 该函数用来将字段对应的字符串或某一个字符串首字母大写显示
UPPER(字段/字符串)
-- 该函数用来将字段对应的字符串或某一个字符串所有字母大写显示
LOWER(字段/字符串)
-- 该函数用来将字段对应的字符串或某一个字符串所有字母小写显示
SELECT t.empno, t.ename, INITCAP(t.ename) initcap_ename, UPPER(t.ename) upper_ename, LOWER(t.ename) lower_ename FROM emp t;
⑤ LENGTH(字段/字符串)
-- 该函数用来返回字段或字符串的长度。前面单行函数中已经演示过。这里再演示一次,来观察一下中文字符、英文字母以及数字的长度是分别如何统计的
SELECT e.jobnum,LENGTH(e.jobnum) 工号长度,e.depname, LENGTH(e.depname) 部门长度, e.e_mail, LENGTH(e.e_mail) 邮箱地址长度 FROM Demo_Employee e;
⑥ RPAD/LPAD(字符串, 字符串长度, 字符)
-- 该函数用来补全字符,也称为粘贴字符。即在字符左(LPAD)右(RPAD)使用第三个参数字符补充字符串达到指定长度。
SELECT t.empno, LPAD(t.empno, 10, 0) lpad_empno, t.ename, RPAD(t.ename, 20, '-') rpad_ename FROM emp t;
⑦ LTRIM/RTRIM(字符串, 字符) 和 TRIM(字符 FROM 字符串)
-- 该函数用来去除字符串左端(LTRIM)或右端(RTRIM)的指定字符。
常用于在表格或文本框中去除两端空格操作
SELECT 'iiiiiiiOracle!!!!!' AS 原字符串, RTRIM( LTRIM('iiiiiiiOracle!!!!!','i'),'!') AS 去除两端字符后 FROM dual;
SELECT '00000Oracle000000000000' AS oldStr, TRIM('0' FROM '00000Oracle000000000000') AS newstr FROM dual;
⑧ SUBSTR(字符串, 起始位置, 长度)
-- 该函数用来对指定字符串从指定位置开始截取指定长度。起始位置从 1 开始计数。
SELECT t.ename, SUBSTR(t.ename,2,3) newname FROM emp t;
2、数字函数
① ABS
-- 该函数返回一个数字的绝对值。
② COS/ACOS
-- 该函数返回一个数字的余弦/反余弦值。
③ SIN/ASIN
-- 该函数返回一个数字的正弦/反正弦值。
④ TAN/ATAN
-- 该函数返回一个数字的正切/反正切值
⑤ CEIL
-- 该函数返回大于等于指定数字的最小整数。即向上取整。
FLOOR
-- 该函数返回小于等于指定数字的最大整数。即向上取整。
ROUND
-- 该函数返回指定数字的四舍五入后的值。
TRUNC(n, a)
-- 该函数对数字n进行去尾操作,保留a位小数位(a为负数时,去尾到小数点左边)。
⑥ MOD(a, b)
-- 该函数返回指定数字的模。即a除以b后的余数。
⑦ EXP
-- 该函数返回数字自然底数e的n次方根
⑧ POWER(a, b)
-- 该函数返回a的b次方
SELECT ABS(-120) , ABS(100), ACOS(-1), COSH(-1), ASIN(0.5) , ATAN(0.5) , CEIL(3.14), FLOOR(3.14), ROUND(3.14), EXP(2), MOD(9,2), POWER(2,4), TRUNC(-56.5), TRUNC(5566.51236,2), TRUNC(5566.51236,-2) FROM dual;
3、日期函数
① ADD_MONTH(date, n)
-- 返回指定日期加上 n 个月后的日期,n 可以为负数。
② LAST_DAY(date)
-- 返回指定月的最后一天。如果不设置格式,默认时分秒为当前时间。
③ MONTHS_BETWEEN(date1, date2)
-- 返回两个日期相差多少月。
④ NEXT_DAY(TO_DATE(date, 星期n)
-- 返回date之后的下一个星期几的日期
SELECT ADD_MONTHS(TO_DATE('20180506','YYYYMMDD'),2) 两个月后, ADD_MONTHS(TO_DATE('20180506','YYYYMMDD'),-15) 十五个月前, LAST_DAY(SYSDATE) 本月最后一天, MONTHS_BETWEEN(TO_DATE('2018-05-06','YYYY-MM-DD'),'26-12月-1995') 相差月份, -- 第二个日期参数使用了默认格式,所以无需转换 NEXT_DAY(TO_DATE('20180524','YYYYMMDD'), '星期二') 下一个星期 FROM DUAL;
4、转换函数
① TO_DATE(字符串, 格式)
-- 将字符串转按照指定格式换成日期类型
② TO_CHAR(日期, 格式)
-- 将指定日期按照指定格式转换成字符串
yy : 两位数字的年份 2018 --> 18
yyyy : 四位数字的年份 2018 --> 2018
mm : 两位数字的月份 6月 --> 06
dd : 两位数字的日期 26日 --> 26
hh24 : 24小时制的时 8 --> 20
hh12 : 12小时制的时 9 --> 09
mi : 分
ss : 秒
day : 星期 星期一
③ TO_CHAR(数字, 格式)
-- 将指定数字按照指定格式转换成字符串,常用于货币。
9 : 数字。忽略前面的0
0 : 数字。位数如果不足则用0补齐
. : 小数点
, : 逗号
$ : 美元符号。加在数字前
L : 本地货币符号。加在数字前
C : 国际货币符号。加在数字前
G : 显示组分隔符。最常见的是3位数字一组,即千分符
D : 小数点符号
SELECT TO_CHAR(HIREDATE,'yyyy-hh-dd hh24:mi:ss day') AS "yyyy-hh-dd hh24:mi:ss day", TO_CHAR(SAL, 'L999G999D99') AS 薪水 FROM emp;
5、系统函数与特殊函数
① DECODE(字段, 值1, 结果1, 值2, 结果2, …… , 值n, 结果n, 默认结果)
-- 该函数目前是Oracle独有的特殊函数。遵循IF-ELSE-THEN的逻辑,效果与CASE-WHEN-END语句类似。
即,当字段的值为值n时,返回结果n,如果都不满足,返回默认结果。
SELECT t.*, DECODE(t.deptno,10,'管理部门', 20,'系统开发部门',30,'数据库维护部门','其他部门') AS 部门 FROM emp t;
② TERMINAL
-- 当前会话客户所对应的终端的标识符
③ LANGUAGE
-- 当前数据库语言
④ DB_NAME
-- 当前数据库实例名
⑤ NLS_DATE_FORMAT
-- 当前会话客户所对应的日期格式
⑥ SESSION_USER
-- 当前会话客户所对应的数据库用户名
⑦ CURRENT_SCHEMA
-- 当前会话客户所对应的默认方案名
⑧ HOST
-- 当前数据库所在主机信息
SELECT SYS_CONTEXT('userenv','TERMINAL') 终端标识, SYS_CONTEXT('userenv','LANGUAGE') 语言, SYS_CONTEXT('userenv','DB_NAME') 数据库实例, SYS_CONTEXT('userenv','NLS_DATE_FORMAT') 日期格式, SYS_CONTEXT('userenv','SESSION_USER') 用户名, SYS_CONTEXT('userenv','CURRENT_SCHEMA') 默认方案名, SYS_CONTEXT('userenv','HOST') 主机信息 FROM dual;