oracle number(4_3),Oracle基础(第三节)

--单行函数

--函数:是一种工具,提供材料(参数)后,根据材料产生结果(返回值)

--单行函数:一行记录在函数使用中就会产生一个结果

--分组函数:一组记录在函数使用中只能产生一个结果

--dual表: 本身只有一个一行一列的数据

select * from dual;

--dual表的主要作用是为了补全SQL语句使用的

--Oracle中 select语句执行时,必须有from才能执行

select 2+3

from dual;

--参数含义

--str 或 s 文本类型的参数

--num 或 n 数值类型的参数

--date 或 d 日期类型的参数

--expr 表达式

--1.文本/字符函数

--(1)大小写转换(重要)

-- 转大写upper(str)结果:str

-- 将传入的str转换成全部为大写形式

select upper('abCd'),upper('张'),upper('123')

from dual;

-- 转小写

-- 转大写lower(str)结果:str

-- 将传入的str转换成全部为小写形式

select lower('abCd'),lower('张'),lower('123')

from dual;

-- 转首字母大写

-- 转大写initcap(str) 结果:str

-- 将传入的str转换成每个单词都是首字母大写

select initcap('abCd'),initcap('abCd xYZx'), initcap('张'),initcap('123')

from dual;

--练习:显示emp表中所有的员工名字,首字母大写

select initcap(ename)

from emp;

select *

from emp

where lower(ename) like lower('%sCOTt%');

--(2)字符拼接

--字符串拼接||

select ename || '的职位是' || job

from emp;

--concat(str1,str2)将str1和str2拼接在一起

select concat(ename,'的职位是')

from emp;

--使用函数嵌套方式:

select concat(concat(ename,'的职位是'),job)

from emp;

--(3)字符截取(重要)

--substr(str,n1,n2)在文本str中,从第n1个字符起,截取n2个长度的字符

select substr('I LIKE GIRL',3,4)

from dual;

--练习:查询emp表中员工职位,只显示职位的前三个字符:

select substr(job,1,3)

from emp;

--文本长度length(str)得到文本的长度 num

--练习:查询emp表中员工职位,只显示职位的最后三个字符

select job, substr(job,length(job)-2,3)

from emp;

--查询员工名字中后三个字符中包含T的员工

select *

from emp

where substr(ename,length(ename)-2,3) like '%T%'

--(4)字符查找

--instr(str1,str2,n1,n2)

--在str1文本中从n1位置起,寻找str2文本第n2次出现的位置:

select 'I LIKE GIRL'

from dual;

--在文本'I LIKE GIRL'中第3个字符后,寻找文本'I'第2次出现的位置:

select instr('I LIKE GIRL','I',3,2)

from dual;

--(5)字符补充

-- 左补充

-- lpad(str1,n,str2): 使用文本str2在str1左侧进行补充,将str1的长度补充至n为止

-- 右补充

-- rpad(str1,n,str2): 使用文本str2在str1右侧进行补充,将str1的长度补充至n为止

select lpad('ABC',10,'*'),rpad('ABC',10,'*')

from dual;

--(6)字符替换

--replace(str1,str2,str3): 在str1中,使用str3替换其中的str2:

select replace('haha hehe xixi hehe','hehe','*****')

from dual;

--(7)字符裁剪

--trim(str): 去掉str两端多余的空格:

select ' A B CD ', trim(' A B CD '), length(' A B CD '),length(trim(' A B CD '))

from dual;

--2.数值函数

--(1)取余(掌握) 7 / 3 = 2...1 7 / 3 = 2 取余% 7%3=1

--基本算法 按照正数得出结果,符号取决于被除数 5%3=2 -5%3=-2 5%-3=2 -5%-3=-2

--mod(n1,n2) 计算n1与n2取余后的结果:

select mod(5,3),mod(5,-3),mod(-5,3),mod(-5,-3)

from dual;

select trunc(mod(345/10,10))

from dual;

--(2)四舍五入(重要)

--round(n1,n2): 对n1进行四舍五入,精确到小数点后n2位(n2可以是0或负数):

select 3.1415926, round(3.1415926,2), round(3.1415926,3)

from dual;

select round(3.1415926,0), round(3.1415926)

from dual

select round(3.1415926,-1),round(5.1415926,-1),round(67,-2),round(49,-2)

from dual

--(3)进一法

--ceil(n1):对n1进行取整操作,舍弃小数部分,整数部分加1:

select ceil(3.0001),ceil(3.9999),ceil(3.0000)

from dual;

--(4)截取法

--trunc(n1):对n1进行截取操作,舍弃小数部分

--trunc(n1,n2):对n1进行截取操作,舍弃小数点n2后的部分(n2可以是0或负数):

select trunc(3.0001),trunc(3.9999),trunc(3.0000)

from dual;

select trunc(3.12345,2),trunc(3.12345,0),trunc(3.12345,-1),trunc(19.12345,-1)

from dual;

--3.日期/时间函数

--基础操作:时间的加减法

--直接加减操作是以“天”为单位进行加减

-- today + 1 = 明天

-- today - 1 = 昨天

-- today + 1/24 = 今天的下一个小时

--(1)系统时间(重要)

--sysdate 系统(服务器)当前时间 关键字 mysql: now():

select sysdate from dual;

select sysdate+1, sysdate-1, sysdate+1/24

from dual;

--(2)计算两个时间的月份差(重要)

--months_between(date1,date2):计算date1与date2之间相隔的月份,

--date1大于date2结果得到正数,反之结果得到负数:

select months_between('31-12月-18', sysdate),months_between(sysdate, '31-12月-18')

from dual;

--练习:计算emp表中各个员工的司龄:

select ename, hiredate, trunc(months_between(sysdate, hiredate)/12)

from emp;

--(3)为某个时间添加月份(某个日期几个月之后的时间)

--add_months(date, num)获得date日期num个月之后的时间 num可以是负数:

select add_months(sysdate, 7),add_months(sysdate, -7)

from dual;

--比如试用期是6个月,查询emp表中,所有员工转正的日期:

select ename, hiredate, add_months(hiredate, 6)

from emp;

--(4)求得某个月的最后一天

--last_day(date):求得date所在的月份的最后1天:

select last_day(sysdate)

from dual;

select last_day(sysdate)-2, last_day(sysdate)+3

from dual;

--求得下一个月的倒数第5天:

select add_months(last_day(sysdate),1)-4

from dual;

select last_day(last_day(sysdate)+1) - 4

from dual;

--(5)求得下一个星期几

--next_day(date, num) 求得date日期之后第一个星期几(num:1-7 日-六):

select next_day(sysdate, 5)

from dual;

--4.通用函数

--(1)nvl

--(2)nv2

--(3)nullif

--(4)decode

--5.转换函数

number(数字)

| |

to_number | | to_char

| |

char(文本)

| |

to_date | | to_char

| |

date(日期)

--(1)to_number 从文本向数字进行转换

-- fmt是一种文本,表示一种特定的格式

-- fmt格式转义字符

-- 0表示一位数字

-- 9 表示一位数字(通常使用9)

-- $表示美元符号

-- L 表示本地货币符号

-- , 表示三位分隔符

-- . 表示小数点

-- fmt规定的数字的范围至少应该大于实际数字的范围,否则语句会报错

-- to_number(str,fmt):将str按照fmt规定格式进行识别,将识别的结果转换成数字

select

'$2,123,456,789',

to_number('$2,123,456,789', '$9,999,999,999'),

to_number('$2,123,456,789', '$9,999,999,999.99'),

to_number('$2,123,456,789', '$999,999,999,999.99'),

to_number('¥2,123,456,789', 'L9,999,999,999')

from dual;

--(2)to_char

--(2.1)to_char(num, fmt) 将num数字按照fmt规定的格式,显示成文本

select ename, sal, to_char(sal, '$9,999,999.99')

from emp;

--(2.2)to_char(date, fmt)将date日期按照fmt规定的格式,显示成文本

select to_char(sysdate,'YYYY"年"MM"月"DD"日" HH24"时"MI"分"SS"秒"')

from dual;

select to_date(to_char(sysdate,'YYYY-MM-DD'),'YYYY-MM-DD')

from dual;

--(3)to_date

-- fmt

-- YYYY:四位数年(使用)

-- YY:两位数无世纪转换的年

-- RR:两位数有世纪转换的年

-- MM:月

-- DD:日

-- HH24: 24进制小时

-- HH12:12进制小时

-- MI:分

-- SS:秒

--to_date(str,fmt)将str按照fmt规定格式进行识别,将识别的结果转换成日期

select

to_date('2018-04-08','YYYY-MM-DD'),

to_date('2018-05-03 22:12:35', 'YYYY-MM-DD HH24:MI:SS')

from dual;

--练习:查询emp表中在1982年期间入职的员工,要求使用to_date方式:

select *

from emp

where hiredate between '01-1月-82' and '31-12月-82';

select *

from emp

where hiredate between to_date('1982-01-01','YYYY-MM-DD') and to_date('1982-12-31','YYYY-MM-DD');

--比如日期文本中出现了特殊的文字 比如:年,月,日

--在fmt中 使用双引号将特殊文字括起来:

select *

from emp

where hiredate between to_date('1982年01月01日','YYYY"年"MM"月"DD"日"')

and to_date('1982年12月31日','YYYY"年"MM"月"DD"日"');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值