设为首页 收藏本站
查看: 857|回复: 0

[经验分享] Oracle培训(二十八)——Oracle 11g 第三章知识点总结——单行函数

[复制链接]

尚未签到

发表于 2016-8-4 16:31:24 | 显示全部楼层 |阅读模式
Oracle培训(二十八)——Oracle 11g 第三章知识点总结——单行函数


  知识点预览
  单行函数
  
  单行函数
  
  1. SQL 函数
  

DSC0000.jpg

  
  2.两种 SQL 函数
  

DSC0001.jpg

  
  3.单行函数
  a) 操作数句对象
  b)接受函数返回一个结果
  c)只对一行进行变换
  d)每行返回一个结果
  e)可以转换数据类型
  f) 可以嵌套
  g)参数可以是一列或一个值
  
  function_name [(arg1, arg2,...)]
  
  4.单行函数
  
   DSC0002.jpg
  

  5.字符函数
  

  
   DSC0003.jpg
  

  6. 大小写控制函数
  这类函数改变字符的大小写。
  
  

DSC0004.jpg
  

  显示员工 Higgins的信息:
  

SELECT employee_id, last_name, department_id
FROM   employees
WHERE  last_name = 'higgins';


  no rows selected
  
  

SELECT employee_id, last_name, department_id
FROM   employees
WHERE  LOWER(last_name) ='higgins';


  

  7. 这类函数控制字符:
  

DSC0005.jpg
  
  

SELECT employee_id, CONCAT(first_name, last_name) NAME,
job_id, LENGTH (last_name),
INSTR(last_name, 'a')"Contains 'a'?"
FROM   employees
WHERE  SUBSTR(job_id, 4) ='REP';


  8.数字函数
  
  a)ROUND: 四舍五入
  ROUND(45.926, 2) 45.93
  b)TRUNC: 截断
  TRUNC(45.926, 2)  45.92
  c)MOD: 求余
  MOD(1600, 300) 100
  

  9.ROUND 函数
  
  

SELECTROUND(45.923,2), ROUND(45.923,0),
ROUND(45.923,-1)
FROM   DUAL;



  DUAL 是一个‘伪表’,可以用来测试函数和表达式
  10.TRUNC 函数
  
  

SELECT  TRUNC(45.923,2), TRUNC(45.923),
TRUNC(45.923,-2)
FROM   DUAL;


  11. MOD 函数
  
  

SELECTlast_name, salary, MOD(salary, 5000)
FROM   employees
WHERE  job_id = 'SA_REP';


  12.日期
  a) Oracle 内部使用数字存储日期: 世纪,年,月,日,小时,分钟,秒。
  b) 默认的日期格式是 DD-MON-RR.
  可以只指定年的后两位在20世纪存放21世纪的日期。
  同样可以在21世纪存放20世纪的日期。
  
  

SELECTlast_name, hire_date
FROM   employees
WHERE  last_name like 'G%';


  c) 函数SYSDATE 返回:
  日期
  时间
  d) 日期的数学运算
  
  在日期上加上或减去一个数字结果仍为日期。
  两个日期相减返回日期之间相差的天数。
  可以用数字除24来向日期中加上或减去小时。
  
  

SELECTlast_name, (SYSDATE-hire_date)/7 AS WEEKS
FROM   employees
WHERE  department_id = 90;


  e)日期函数
  

DSC0006.jpg

  
  
  MONTHS_BETWEEN('01-SEP-95','11-JAN-94') -------->19.6774194
  ADD_MONTHS('11-JAN-94',6) --------> '11-JUL-94'
  NEXT_DAY('01-SEP-95','FRIDAY') --------> '08-SEP-95'
  LAST_DAY('01-FEB-95')-------->'28-FEB-95'
  
  Assume SYSDATE ='25-JUL-95':
  ROUND(SYSDATE,'MONTH')-------->01-AUG-95
  ROUND(SYSDATE,'YEAR') -------->1-JAN-96
  TRUNC(SYSDATE,'MONTH') --------> 01-JUL-95
  TRUNC(SYSDATE,'YEAR') --------> 01-JAN-95
  13.转换函数
  
  

   DSC0007.jpg
  

  14.隐式数据类型转换
  
  Oracle 自动完成下列转换:
  
DSC0008.jpg



  表达式计算中, Oracle 自动完成下列转换:
  

DSC0009.jpg



  15. 显式数据类型转换
  

DSC00010.jpg



  
  16.TO_CHAR 函数对日期的转换
  a) 格式:TO_CHAR(date, 'format_model')
  b) 必须包含在单引号中而且大小写敏感。
  c) 可以包含任意的有效的日期格式。
  d) 可以使用 fm 去掉多余的空格或者前导零。
  e) 与日期指用逗号隔开。
  17. 日期格式的元素
  
  
DSC00011.jpg
  

  时间格式
DSC00012.jpg

  使用双引号向日期中添加字符
DSC00013.jpg

  日期在月份中的位置
DSC00014.jpg

  
  

SELECT last_name,
TO_CHAR(hire_date,'fmDD Month YYYY')
AS HIREDATE
FROM   employees;


  18.TO_CHAR 函数对数字的转换
  格式:TO_CHAR(number, 'format_model')
  下面是在TO_CHAR 函数中经常使用的几种格式:
  

DSC00015.jpg
  

  
  

SELECT TO_CHAR(salary, '$99,999.00') SALARY
FROM   employees
WHERE  last_name = 'Ernst';


  19. TO_NUMBER 和 TO_DATE 函数
  a) 使用 TO_NUMBER 函数将字符转换成数字:
  
  TO_NUMBER(char[,'format_model'])
  
  b)使用 TO_DATE 函数将字符转换成日期:
  
  TO_DATE(char[,'format_model'])
  
  c) 这些函数可以使用fx 修饰符。 n
  20.RR 日期格式
  

DSC00016.jpg
  

  
  使用RR日期格式查找雇佣日期在1990年之前的员工,
  在1999或现在使用下面的命令会产生相同的结果:
  

  


SELECT last_name, TO_CHAR(hire_date, 'DD-Mon-YYYY')
FROM  employees
WHERE hire_date < TO_DATE('01-Jan-90', 'DD-Mon-RR');


  21.嵌套函数
  a)单行函数可以嵌套。
  b)嵌套函数的执行顺序是由内到外。
  

DSC00017.jpg

  
  

SELECT last_name,
NVL(TO_CHAR(manager_id), 'No Manager')
FROM   employees
WHERE  manager_id IS NULL;

  

  22.通用函数
  a) 这些函数适用于任何数据类型,同时也适用于空值:
  NVL (expr1, expr2)
  NVL2 (expr1, expr2, expr3)
  NULLIF (expr1, expr2)
  COALESCE (expr1, expr2, ..., exprn)
  23.NVL 函数
  
  将空值转换成一个已知的值:
  可以使用的数据类型有日期、字符、数字。
  函数的一般形式:
  NVL(commission_pct,0)
  NVL(hire_date,'01-JAN-97')
  NVL(job_id,'No Job Yet')
  
  

SELECT last_name, salary,NVL(commission_pct, 0),
(salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL
FROM employees;


  24.使用 NVL2 函数
  
  

SELECT last_name,  salary,commission_pct,
NVL2(commission_pct,
'SAL+COMM', 'SAL')income
FROM   employees WHEREdepartment_id IN (50, 80);


  25.使用 NULLIF 函数
  
  

SELECT first_name, LENGTH(first_name) "expr1",
last_name,  LENGTH(last_name)  "expr2",
NULLIF(LENGTH(first_name), LENGTH(last_name)) result
FROM   employees;


  26.使用 COALESCE 函数
  a)COALESCE 与 NVL 相比的优点在于 COALESCE 可以同时处理交替的多个值。
  b)如果第一个表达式非空,则返回这个表达式,对其他的参数进行COALESCE 。
  
  

SELECT   last_name,
COALESCE(commission_pct, salary, 10) comm
FROM     employees
ORDER BY commission_pct;


  27.条件表达式
  a)在 SQL 语句中使用IF-THEN-ELSE逻辑。
  b)使用两种方法:
  i. CASE 表达式
  ii.DECODE 函数
  
  28.CASE 表达式
  
  在需要使用 IF-THEN-ELSE 逻辑时:
  CASE expr WHEN
comparison_expr1
THEN return_expr1

  [WHEN comparison_expr2
THEN return_expr2

   WHENcomparison_exprn
THEN return_exprn

   ELSE else_expr]
  END
  
  下面是使用case表达式的一个例子:
  
  

SELECT last_name, job_id, salary,
CASE job_id WHEN'IT_PROG'  THEN  1.10*salary
WHEN'ST_CLERK' THEN  1.15*salary
WHEN'SA_REP'   THEN  1.20*salary
ELSE      salary END     "REVISED_SALARY"
FROM   employees;


  29.DECODE 函数
  
  在需要使用 IF-THEN-ELSE 逻辑时:
  DECODE(col|expression, search1, result1

  [, search2, result2,...,]
  [, default])
  
  

SELECT last_name, job_id, salary,
DECODE(job_id,'IT_PROG',  1.10*salary,
'ST_CLERK', 1.15*salary,
'SA_REP',   1.20*salary,
salary)
REVISED_SALARY
FROM   employees;


  
  使用decode函数的一个例子:
  

SELECT last_name, salary,
DECODE(TRUNC(salary/2000, 0),
0,0.00,
1,0.09,
2,0.20,
3,0.30,
4,0.40,
5,0.42,
6,0.44,
0.45) TAX_RATE
FROM   employees
WHERE  department_id = 80;

  

  30.总结
  a) 使用函数对数据进行计算
  b) 使用函数修改数据
  c)使用函数控制一组数据的输出格式
  d)使用函数改变日期的显示格式
  e)使用函数改变数据类型
  f)使用 NVL 函数
  g)使用IF-THEN-ELSE 逻辑
  
  31.示例
  
  a)initcap 首字母大写
  
  b) 伪列/表——方便计算
  dual
  
  伪列/伪表dual
  

select substr(‘helloworld’,1,5) from dual;
select substr(‘helloworld’,1,5) from dual;——从1开始
select sysdate from dual; 查询当前时间
select sysdate + 1 from dual; --天数加1


  
  c) 计算出每个员工的工龄(整数)
  

selectround((sysdate - hiredate)/365,0) from emp;


  
  d)将工龄超过30年的雇员的薪水提成30%
  

select ename,round((sysdate -hiredate)/365,0),sal,sal*(1+0.3) from emp whe
re (round((sysdate - hiredate)/365,0))> 20;


  
  

select ename,round((sysdate -hiredate)/365,0) as "雇佣日期",sal,sal*(1+0.3
) from emp where round((sysdate -hiredate)/365,0) > 31;


  
  

select ename,round((sysdate -hiredate)/365,0) as hireage,sal,sal*(1+0.3
) from emp where round((sysdate -hiredate)/365,0) > 31;


  
  e) 大问题化整为零
  
  

select next_day(sysdate, '星期一') from dual;
select last_day(sysdate) from dual;
--to_number(‘’); 数字形式的字符串
select to_char(sysdate,'fmYYYY-MM-DD')from dual; 去掉前导0
select to_char(sal, '$9,999,999.00') fromemp;
select to_char(sal, 'L9,999,999.00') fromemp;



  
  
  f) 去除月字
  

selectto_char(to_date('2012-12-21','YYYY-MM-DD'),'YYYY-MM-DD') from dual;


  
  g) nvl
  

selectnvl(comm,0),ename from emp;
select sal,nvl(sal+comm,sal) from emp;
select deptno,ename,sal,
case deptno when 10 then nvl(comm,0) + 100
when 20 thennvl(comm,0) + 200
when 30 thennvl(comm,0) + 300
end "Comm"
from emp;
select deptno,ename,sal,
case deptno when 10 then nvl(comm,0) + deptno  *  10
when 20 thennvl(comm,0) + deptno  *  10
when 30 thennvl(comm,0) + deptno  *  10
else comm end "Comm"
from emp;
select deptno,ename,sal,
decode(deptno, 10,nvl(comm,0) + 100,
20, nvl(comm,0) +200,
30, nvl(comm, 0) +300,
comm) "奖金"
from emp;

  h) 计算出每个员工的工龄(整数)
  Sysdate / round(,0)
   1).先求出每个雇员的雇佣天数
  

   Selectsysdate-hiredate from emp;

  2).求雇佣年份
  

  Select(sysdate-hiredate)/365 from emp;

  3).将雇员年份计算成整数(四舍五入)
  

    Select round((sysdate-hiredate)/365,0) hireage from emp;

  
  i) 将工龄超过30年的雇员的薪水提成30%
  

Select sal*1.3,round((sysdate-hiredate)/365,0) as hireage
from emp e
where round((sysdate-hiredate)/365,0)  >30;


  
  j)日期函数
  Months_between(‘date1’ ,’date2’)
  

selectmonths_between(sysdate,hiredate) from emp;



  
  Add_months(‘日期’,5)


select add_months(sysdate,12) from dual;


DSC00018.jpg

  
  
  k)字符串转换成数字
  “1abc” ->selectto_number(‘1abc’) from dual;
  

DSC00019.jpg
  

  l) to_char()
  将当前系统日期以中文格式输出(年-月-日)
  

Selectto_char(sysdate,’YYYY-MM-DD’) from dual;


  m) to_date()
  

Select to_char(to_date(‘2012-12-21’,’YYYY-MM-DD’),’YYYY年MM月DD日’) from dual;


  n) nvl
  slect NVL(comm,0) from emp;
  
  将雇员的基本工资和奖金相加输出
  

DSC00020.jpg



  
  

select sal,sal+ NVL(comm,0)from emp;


DSC00021.jpg



  o) case语句
  对所有员工奖金(comm)加上对应的部门编号乘10;只考虑部门编号是10,20,30的情况
  

DSC00022.jpg

  
  
  
  

  

  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252931-1-1.html 上篇帖子: ORACLE常用命令总结-ORACLE 常用的SQL语法和数据对象 下篇帖子: oracle rollup和cube函数使用心得
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表