第4章 单行函数知识点导航

4.1 字符函数
  4.1.1 lower,upper,initcap函数
  4.1.2 字符处理函数
     4.1.2.1 concat,substr,length函数
     4.1.2.2 instr,lpad,rpad,trim,replace函数
4.2 数值函数
  4.2.1 round,trunc,mod函数
  4.2.2 round和trunc计算日期
4.3 日期函数
  4.3.1 RR日期格式
  4.3.1 常用日期函数
4.4 转换函数
  4.4.1 隐式数据类型转换
  4.4.2 显示数据类型转换
     4.4.2.1 to_char函数
     4.4.2.2 to_date函数
     4.4.2.3 to_number函数
4.5 通用函数
  4.5.1 与null相关函数
  4.5.2 case,decode条件处理函数
4.6 练习
  单行函数特征:①单行函数对单行操作,②每行返回一个结果,③有可能返回值与原参数数据类型不一致,④单行函数可以写在SELECT、WHERE、ORDER BY子句中,⑤有些函数没有参数,有些函数包括一个或多个参数,⑥函数可以嵌套。

4.1 字符函数

  字符函数主要指参数类型是字符型,但不同函数返回值可能是字符型或数值型。

4.1.1 lower,upper,initcap函数
  lower,upper,initcap是大小写转换函数,其中,
  lower(列名|表达式):将大写或大小写混合的字符转换成小写;
  upper(列名|表达式):将小写或大小写混合的字符转换成大写;
  initcap(列名|表达式):将每个单词的第一个字母转换成大写,其余的字母都转换成小写.
  例:select lower('BeauTiFul')l,upper('WonDerFul') u,initcap('confiDent') i from dual;

4.1.2 字符处理函数

4.1.2.1 concat,substr,length函数
  concat(列名1|表达式1,列名2|表达式2):连接两个值,等同于||。
   substr(列名|表达式,n1,n2):表示截取从第一个列名|表达式的参数中,从第n1位开始,长度为n2的子串。如果n1是负值,则表示从第一个参数的后面的第abs(n1)位开始,向右取长度为n2的子串。
  length(列名|表达式) :计算列名|表达式的字符长度。
  例:写一个查询,用首字母大写,其它字母小写显示雇员的 ename,显示名字的长度,并给每列一个适当的标签,条件是满足所有雇员名字的开始字母是J、A 或 M 的雇员,并对查询结果按雇员的ename升序排序。(提示:使用initcap、length、substr)。

 select initcap(ename) name,length(ename) lengthname from emp where substr(ename,1,1) in ('J','A','M') order by ename;

4.1.2.2 instr,lpad,rpad,trim,replace函数
   instr(s1,s2,n1,n2):表示查询在s1中,子串s2(一般认为s1包含s2)从第n1开始一直遍历,直到第n2次出现时的位置。n1,n1默认值为1。
   lpad(s1,n1,s2):返回s1被s2从左面填充到n1长度后的字符串,n1的长度为s1+s2的长度。
   rpad(s1,n1,s2):返回s1被s2从右面填充到n1长度后的字符串。
   trim(字符串):去除字符串头部或尾部的字符。即如select trim(‘b’ from ‘blblb’) from dual;只能去掉收尾两个b。
   Replace(s1,s2,s3):把s1中的s2用s3替换。
函数            结果
instr(‘beautiful’,‘t’)     5
lpad(‘good’,8,’’)      ****good
rpad(‘good’,8,’
’)      good****
trim(’ well ')         well
replace(‘nonono’,‘n’,‘l’)     lololo

4.2 数值函数

4.2.1 round,trunc,mod函数
   round(列名|表达式,n):将列或表达式的数值四舍五入到小数点后的第n位。如果n小于0,则数值将在小数点前的第abs(n)位开始四舍五入取值。
   trunc(列名|表达式,n):将列或表达式的数值截取到小数点后的第n位。如果n小于0,则数值将在小数点前的第abs(n)前截取。
例:

select round(44.223, -1),trunc(44.223, -1),round(24.456, -2),trunc(24.456, -2)from dual;

  round和trunc都用于求取数据精度,但round会四舍五入,而trunc不会四舍五入。当精度大于0时,表示保留几位小时,精度等于0时,表示取整。其中,round只针对精度的后一位进行处理。

   mod(列名|表达式,n):取列或表达式除以n后得到的余数。
  例1:写一个查询,分别计算100.456 四舍五入到小数点后第2位,第1位,整数位的值。

 select round(100.456,2),round(100.456,1),round(100.456,0) from dual;

  例2:写一个查询,分别计算100.456 从小数点后第2位,第1位,整数位截断的值。

select trunc(100.456,2),trunc(100.456,1),trunc(100.456,0) from dual;

4.2.2 round和trunc计算日期
   round和trunc会以天为单位进行取整,去除时间保留日期。其中round 会根据时间产生进位,以上午和下午为分界,下去会进入会增加一天,默认的操作单位是DD。
  例:select sysdate,round(sysdate),trunc(sysdate) from dual;
  ① round 计算yyyy会以上半年和下半年为界,下半年会增加一年,返回增加年的第一月。
  ② round 计算mm会以上半月和下半月为界,下半月会增加一月,返回增加月的第一天。
  ③ round 计算dd会以上半天和下半天为界,下半天会增加一天。
  ④ round 计算day会以’周一至周三‘和’周四至周日‘为界,周一至周三’返回上周日,‘周四至周日’返回该周日。
  例1:select sysdate,round(sysdate,'yyyy'),trunc(sysdate,'yyyy') from dual;
  例2:select sysdate,round(sysdate,'mm'),trunc(sysdate,'mm') from dual;
  例3:select sysdate,round(sysdate,'dd'),trunc(sysdate,'mm') from dual;
  例4:select sysdate,round(sysdate,'day'),trunc(sysdate,'day') from dual;

4.3 日期函数

  Oracle是一种内部的数值形式存储日期的,即:世纪、年、月、日、小时、分、秒。
  默认的日期格式为:dd-mon-rr

4.3.1 RR日期格式
  用来判定按照DD-MON-RR格式给定的日期实际代表的日期是多少。所以RR的代表的日期格式判定标准如下图:
        
例1:当前日期为2015年,指定日期格式为DD-MON-RR,指定日期为01-1月-95,该日期实际所代表的日期为?

select to_date('01-1月-95','DD-MON-RR') from dual;

  释:如果当前日期为2015年,RR格式结果为1995/1/1,显示为上一个世纪
例2:当前日期为1998年,指定日期格式为DD-MON-RR,指定日期为01-1月-01,该日期实际所代表的日期为?

select to_date('01-1月-01','DD-MON-RR') from dual;

  释:如果当前日期为1998年,RR格式结果为2001/1/1,显示为下一世纪。
4.3.1 常用日期函数
  a) Sysdate:返回系统日期。
   b) months_between(m1,m2):返回两个日期类型数据之间间隔的自然月数,一般认为m2的日期早于m1。
   c) add_months(日期,月份数): 返回指定日期加上相应的月数后的日期。
   d) next_day(‘某一日期’,’指定日期’):返回某一日期的下一个指定日期,指定日期可以为’星期一’等。
   e) last_day:返回指定日期当月最后一天的日期。
   f) **round(date,’ftm’)**将date按照fmt指定的格式进行四舍五入,fmt为可选项,如果没有指定fmt,则默认为dd,将date四舍五入为最近的天。其指定格式一般为为【year,month,day】。
  格式码:世纪cc,年yy,月mm,日dd,小时hh24,分mi,秒ss。
   g) trunc(ftm指定格式 from date):将date按照fmt指定的格式进行截断,fmt为可选项,如果没有指定fmt,则默认为‘DD’,将date截取为最近的天。
   h) extract:返回日期类型数据中的年份、月份或者日。
例1:months_between函数演示——查询所有员工服务的月数。

select ename,round(months_between(sysdate,hiredate)) months from emp;

例2:add_months 函数演示——查询82年后入职的员工转正日期,按照3个月试用期考虑

select ename,hiredate,add_months(hiredate,3) new_hiredate from emp where hiredate>='1-1月-1982';

例3:next_day 函数演示——返回在02-2月-06之后的下一个周一是什么日期。

select next_day('02-2月-06','星期一') from dual;

例4:last_day函数演示——返回06年2月2日所在月份的最后一天。

select last_day('2-2月-06') from dual;

例5:round函数演示——查询81年入职的员工姓名,入职日期按月四舍五入的日期。
M1:select ename,round(hiredate,'mm') from emp where hiredate>='1-1月-1981' and hiredate<='31-12月-1981';
M2:select ename,round(hiredate,'month') from emp where substr(hiredate,-2,2)='81';
M3:select ename,round(hiredate,'mm') from emp where to_char(hiredate,'yy')='81';
例6:trunc函数演示——查询81年入职的员工姓名,入职日期按月截断的日期。

select ename,trunc(hiredate,'mm') from emp where to_char(hiredate,'yy')='81';

例7:extract函数演示——查询编号是10的部门中所有员工入职月份。

select ename,extract(month from hiredate) from emp where deptno=10;

4.4 转换函数

4.4.1 隐式数据类型转换
  不同的数据类型之间关联,如果不使用显式转换函数,则它会根据以下规则对数据进行隐式转换:
   对于insert和update操作,oracle会把插入值或者更新值隐式转换为字段的数据类型。
   对于select语句,oracle会把字段的数据类型隐式转换为变量的数据类型。
   当比较一个字符型和数值型的值时,oracle会把字符型的值隐式转换为数值型。
   当比较字符型和日期型的数据时,oracle会把字符型转换为日期型。
   用连接操作符(||)时,oracle会把非字符类型的数据转换为字符类型。
   如果字符类型的数据和非字符类型的数据(如number、date、rowid等)作算术运算,则oracle会将字符类型的数据转换为合适的数据类型,这些数据类型可能是number、date、rowid等。
4.4.2 显示数据类型转换
   显式数据类型转换通常是在字符类型、日期类型、数值类型之间进行显式转换。主要有3个显式转换函数:to_char,to_number,to_date。
4.4.2.1 to_char函数
  to_char函数是把时间转换为字符串进行判断,可用于日期型和数值型。
① to_char用于日期型
  用于日期型数据时的格式为to_chart(date,’ftm’),可以包含任何有效的日期元素,使用逗号将日期型数据与日期型格式模型分隔’。
  注:to_char的日期格式是区分大小写的,即大小写敏感,所以必须用单引号引起来。但如果在注册oracle数据时设置了中文系统,则大小写不敏感。如若在中文系统下要大小写敏感,可在语句中添加’nls_date_language=english’把oracle中文系统改为英文系统。
  例:select to_char(sysdate,'DY','nls_date_language=english') from dual;
  其日期型元素有:
  yyyy    完整的年份数字表示
  year   年份的英文表示
  mm    用两位数来表示月份(03)
  month    月份的全名(3月)
  mon    缩写混合大小写月份名(3月)
  day    星期几
  dy    用3个英文字符缩写来表示星期几
  dd    一个月里的日子
  hh24    0-23小时数
  mi    00-59分钟
  ss    00-59秒
  例1:select to_char(sysdate,'dd-month-year') from dual;
  结果:20-7月 -twenty nineteen
  例2:select to_char(sysdate,'dd-month-yyyy hh24-mi-ss') from dual;
  结果:20-7月 -2019 18-25-52
  to_char用于日期型的元素,可用时间元素格式化日期的时间部分,也可通过使用双引号可以添加字符串。
  用时间元素格式化时间的部分:hh24:mi:ss am 18:33:24 pm
  通过使用双引号添加字符串:dd “of” month 12 of July
例1:select to_char(sysdate,'dd-month-yyyy hh24-mi-ss AM') from dual;
例2:select to_char(sysdate,'dd "of" month') from dual;
② to_char用于数值型
  通过在to_char使用以下形式可以把数值型数据转化成变长的字符串:
  9   一位数字
  0   显示前导零
  $   显示美元符号
  L   显示本地货币符号
  .    显示小数点
  ,    显示千位符
  例:select to_char(sal,'L999999.99') from emp;
  注意:进行数字类型到字符型转换时,格式中的宽度一定要超过实际列宽度,否则会显示为####。
4.4.2.2 to_date函数
  to_date是把字符串转换为时间进行判断,其格式为to_date(‘字符串’,’时间格式’)。
  注意:to_date要转换的数据必须是可以转换为日期的字符,格式码的格式要和原数据的格式匹配。
  例1:查询在1981年10月1日之后入职的员工姓名,入职日期,薪资。
  M1:select ename,hiredate,sal from emp where hiredate>to_date('1-10月-1981','dd-month-yyyy');
  M2:select ename,hiredate,sal from emp where to_char(hiredate,'dd-mm-yyyy')>'1-10-1981';
  M3:select ename,hiredate,sal from emp where hiredate>'1-10月-1981';
4.4.2.3 to_number函数
  to_number是将一个字符串转换为数值型数据,注意to_number要转换的数据必须是有数字组成字符串,其相应的格式要与原数据中的格式相匹配。
  例1:select to_number('56.5') from dual;
  例2:select ename,hiredate from emp where to_number(to_char(hiredate,'yyyy')) between 1997 and 2008;

4.5 通用函数

4.5.1 与null相关函数
  空值函数是与空值null相关的一些函数,完成对空值null的一些操作,从而对空值进行处理。主要包括:nvl,nvl2,nullif,coalesce函数。
  a).nvl(expr1,expr2):如果expr1是空值,则返回expr2。
  b).nvl2(expr1,expr2,expr3):如果expr1不是空值,返回expr2,否则返回expr3。
  c).nullif(expr1,expr2):比较两个表达式,如果相等,返回null,否则,返回第一个表达式。
  d).coalesce (表达式1, 表达式2, … 表达式n):函数是对NVL函数的扩展。COALESCE函数的功能是返回第一个不为空的参数,参数个数不受限制。
  例1:select ename,sal+nvl(comm,0) totalsal from emp;
  例2:select nvl2(null,'8','fd') from dual;
  例3:select nullif(28,28),nullif(3,2) from dual;
  例4:select coalesce(null,'5','f') from dual;
4.5.2 case,decode条件处理函数
  a).case语法

CASE expr
WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END

b).decode语法:DECODE(字段|表达式, 条件1,结果1[,条件2,结果2…,][,缺省值])
  例1:

 select ename,deptno,(case deptno when 10 then '销售部'when 20 then '管理部'else '无' end)deptnamefrom emp;

  例2:

select ename,deptno,decode(deptno, 10,'销售部',20,'管理部','无')deptnamefrom emp;

  补充:
  函数的嵌套,单行行数可以嵌套于任何层,嵌套的函数是从最里层向最外层的顺序计算的。
  例:select ename,hiredate from emp where to_number(to_char(hiredate, 'yyyy')) between 1982 and 1985;

4.6 练习

1.查询员工姓名中中包含大写或小写字母A的员工姓名。
M1: select ename from emp where lower(ename) like '%a%';
M2: select ename from emp where upper(ename) like '%A%';
M3: select ename from emp where ename like ‘%a%’ or ename like ‘%A%’;
2.询部门编号为10或20,入职日期在81年5月1日之后,并且姓名中包含大写字母A的员工姓名,员工姓名长度(提示,要求使用INSTR函数,不能使用like进行判断)。

select ename,hiredate,length(ename) lengthname from emp where deptno in (10,20) and hiredate>'1-5月-1981' and instr(ename,'A')>0;

3.查询每一个职工的编号,姓名,工资,要求将查询到的数据按照一定的格式合并一个字符串。其中,前10位编号不足部分用填充,左对齐;中间10位,姓名不足部分用填充,左对齐;后10位工资不足部分用*填充右对齐。

select concat(lpad(deptno,10,'*'),lpad(ename,10,'*'))|| rpad(sal,10,'*') from emp;

4.查询部门10,20的员工截止到2000年1月1日,工作了多少个月,入职的月份。(提示:使用months_between,extract)。

select ename,deptno,extract(month from hiredate) new_month,months_between('1-1月-2000',hiredate) num_month,hiredate from emp where deptno in (10,20);

5.如果员工试用期6个月,查询职位不是MANAGER的员工姓名,入职日期,转正日期,入职日期后的第一个星期一,入职当月的最后一天日期。(提示:使用add_months,next_day,last_day)。

select ename,hiredate,add_months(hiredate,6) 转正日期,next_day(hiredate,'星期一'),last_day(hiredate) from emp where job<>'MANAGER';

6.显示服务器系统当前时间,格式为2007-10-12 17:11:11(提示:使用to_char函数)。

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

7.显示ename、hiredate 和 雇员开始工作日是星期几,列标签DAY(提示:使用to_char函数)。

select ename,hiredate,to_char(hiredate,'day') from emp;

8.查询员工姓名,工资,格式化的工资(¥999,999.99)(提示:使用to_char函数)。

select ename,sal,to_char(sal,'L999,999.99') from emp;

9.把字符串2015-3月-18 13:13:13 转换成日期格式,并计算和系统当前时间间隔多少天。 (提示:使用to_date函数)。

select to_date('2015-3月-18 13:13:13','yyyy-mon-dd hh24:mi:ss')日期,round(sysdate-(to_date('2015-3月-18 13:13:13','yyyy-mon-dd hh24:mi:ss'))) 时间差 from dual;

10.计算2000年1月1日到现在有多少月,多少周(四舍五入)。

select round(months_between(sysdate,'01-1月-2000')) 月数,round((sysdate-to_date('1-1月-2000','dd-mon-yyyy'))/7) 周数 from dual;

11.使用trim函数将字符串‘hello’、‘ Hello ’、‘bllb’、‘ hello ’分别处理得到下列字符串ello、Hello、ll、hello。

Ans:
select trim('h' from 'hello') from dual;
select trim(' Hello ') from dual;
M1:select trim('b' from 'bllb') from dual;//只可以去掉收尾字母
M2:select replace('bllob','b','') from dual;
select trim(' hello ') from dual;

12.将员工工资按如下格式显示:123,234.00 RMB。

select to_char(sal,'999,999.99') || 'RMB' from emp;

13.查询员工的姓名及其经理编号,要求对于没有经理的显示“No Manager”字符串。

select ename,mgr,nvl(to_char(mgr),'No Manager') nmgr from emp;

14.将员工的参加工作日期按如下格式显示:月份/年份。

select ename,to_char(hiredate,'mm/yy') from emp;

15.在员工表中查询出员工的工资,并计算应交税款:如果工资小于1000,税率为0,如果工资大于等于1000并小于2000,税率为10%,如果工资大于等于2000并小于3000,税率为15%,如果工资大于等于3000,税率为20%。

select ename,sal,(case when sal<1000 then sal*0when sal<2000 then sal*0.1when sal<3000 then sal*0.15else sal*0.2 end)税款from emp;

16.创建一个查询显示所有雇员的 ename和 sal。格式化sal为 15 个字符长度,用 $ 左填充,列标签 SALARY。

select ename,sal,lpad(sal,15,'$') SALARY from emp;

Oracle-第4章 单行函数相关推荐

  1. oracle数字加 39,Oracle数据库之SQL单行函数—数字函数-Oracle

    Oracle数据库之SQL单行函数-数字函数 1.三角函数 SIN  ASIN  SINH COS  ACOS  COSH TAN  ATAN  TANH 对于上述三角函数,见名知意.做一个间断的练习 ...

  2. 三.Oracle常用数据类型及单行函数总结

    1.课外扩展知识 UTF-8 一个中文占3个字节,GBK 一个中文占2个字节ctrl+E:可以找到sql查询语句的历史记录(在sql-wiwdow操作)在doc里输desc 表名可以查出该表所有列的类 ...

  3. oracle基本命令集合(2)--单行函数

    SQL函数的两种类型:单行函数.多行函数 单行函数 一.特征和分类 1.单行函数的特征: 作用于查询中返回的每一行 每行返回一个结果 可能返回一个与参数不同类型的数据值 可能需要一个或多个参数 能够用 ...

  4. Oracle filter 函数,Oracle数据库之SQL单行函数---字符函数续

    前一篇博客练习了一些字符函数,之后自己又去下查阅了相关的资料,上一篇博客中还有很多的 字符函数没有练习到,这次主要是对上次的一些未用到的字符函数进行一些补充练习. ascii() 返回与指定的字符对应 ...

  5. 单行函数和多表查询 例题代码可复制

    查询和单行函数: 范围查询: 数字/日期 betteen 小 and 大 SELECT * FROM EMP WHERE SAL BETWEEN 6000 AND 10000; 模糊查询: LIKE ...

  6. 单行函数,聚合函数课后练习

    单行函数,聚合函数课后练习 #第七章 单行函数的课后练习 1.显示系统时间(注:日期+时间) #以下的用哪一个都可以 SELECT NOW(),SYSDATE(),CURRENT_TIMESTAMP( ...

  7. oracle 获取第三行,Oracle 11g 第三章知识点总结——单行函数

    Oracle 11g 第三章知识点总结--单行函数 知识点预览 单行函数 单行函数 1. SQL 函数 2.两种 SQL 函数 3.单行函数 a) 操作数句对象 b)接受函数返回一个结果 c)只对一行 ...

  8. Oracle基础知识——单行函数

    第三章--单行行数 单行函数指的是对单行进行计算,也就是说会对结果集中每一条记 录计算一次,每一条记录返回一个结果. 一.字符类型 1.大小写转换 例:把'I Love YOU'转换成全大写,全小写和 ...

  9. Oracle从零开始04——SQL语句03——单行函数

    5.单行函数 function_name(column|expression,[arg1,arg2,-]) 参数说明:function_name:函数名称 column:数据库列名 expressio ...

最新文章

  1. 织梦怎么改网站主页php,无忧主机教你修改织梦DedeCms网站首页为动态显示的方法...
  2. 共享单车哈罗王炸连出,OFO小心沦为炮灰
  3. hdu1711 KMP模板
  4. 2021中超1 1010 zoto
  5. 8587520在51CTO【礼树迎蛇 红满社区】
  6. python selenium 判断元素是否可见
  7. 交互系统的构建之(四)手掌与拳头检测加盟TLD
  8. cpu怎么超频_性价比神器?镁光EDIE颗粒 超频实测 Intel+Amd
  9. 【动态规划】01背包问题:购物袋
  10. AndroidX App Startup 介绍及使用
  11. 新冠时空分析——Global evidence of expressed sentiment alterations during the COVID-19 pandemic
  12. 低盈利、高现金流:紫光财报背后的半导体另类求生之路
  13. 华为10误删照片怎么才能恢复回来?
  14. 华为机试真题 C 实现【非严格递增连续数字序列】【2022 Q4新题】
  15. C语言实现建立顺序表,修改顺序表,插入顺序表,删除顺序表
  16. matlab算sma,[转载]通达信公式SMA函数计算方式的问题
  17. 【10】AccessibilityService实现探探app的自动化喜欢和不喜欢+ [as 3.0如何打开层级调用uiautomatorviewer]
  18. 最全Linux面试题
  19. easyExcel中合并单元格文件读取实现方案
  20. 2010年安防企业与事件盘点

热门文章

  1. linux 虚拟钢琴,Virtual MIDI Piano Keyboard下载-虚拟MIDI钢琴键盘 v0.8.0 官方版 - 安下载...
  2. 想要轻松玩转Markdown?goldmark帮你实现!
  3. 有效使用二维码进行APP推广
  4. 在虚拟机里虚拟打电话的代码
  5. java微信小程序调用支付接口
  6. cocos creator 牌面翻转
  7. 全网首发游戏陪玩系统 语音聊天系统11月商业版源码 附教程
  8. php表格设置标题,每页表格标题字PHPWord
  9. MATLAB如何生成scr文件,基于SCR脚本文件的MatlabAutoCAD结合使用
  10. 计算机视觉(十六):目标检测概述