oracle--单行函数

单行函数

SQL函数:

sql函数.PNG

两种sql函数

两种sql函数.PNG

单行函数

  1. 操作数据对象
  2. 接受参数返回一个结果
  3. 只对一行进行变换
  4. 每行返回一个结果
  5. 可以转换数据类型
  6. 可以嵌套
  7. 参数可以是一列或一个值
单行函数.PNG
一、字符函数
字符函数.PNG

大小写控制函数:改变字符的大小写

大小写控制函数.PNG
--字符函数
select lower('Hello World') 转小写,upper('Hello World') 转大写,initcap('hello world') 首字母大写 from dual;

--substr(a,b) 从a中,第b位开始取
select substr('Hello World',3) 子串 from dual;
子串                                                                            
---------                                                                       
llo World 

--substr(a,b,c) 从a中,第b位开始取,取c位
select substr('Hello World',3,4) 子串 from dual;
子串                                                                            
----                                                                            
llo

--instr(a,b) 在a字符串中查找b,找到了,返回下标(从1开始),没有找到,返回0
select instr('Hello World','ll') 位置 from dual;
      位置                                                                      
----------                                                                      
         3   

 --length 字符数 lengthb 字节数
英文:
select length('Hello World') 字符,lengthb('Hello World') 字节 from dual;
      字符       字节                                                           
---------- ----------                                                           
        11         11 

中文:
select length('北京') 字符,lengthb('北京') 字节 from dual
      字符       字节                                                           
---------- ----------                                                           
         2          4 

--lpad 左填充  rpad 右填充
-- abcd ---> 10 位
select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右 from dual;
第一个参数:对谁进行填充
第二个参数:填到多少位
第三个参数:填什么
左         右                                                                   
---------- ----------                                                           
******abcd abcd******    

--trim 去掉前后指定的字符
select trim('H' from 'Hello WorldH') from dual;
TRIM('H'FR                                                                      
----------                                                                      
ello World   

--replace
select replace('Hello World','l','*') from dual;
REPLACE('HE                                                                     
-----------                                                                     
He**o Wor*d  
二、数字函数:
round:四舍五入(第二个参数表示保留两位小数)
round(45.926,2)--->45.93
trunc:截断
trunc(45.926,2)--->45.92
mod:求余
mod(1600,300)--->100

select round(45.926,2) 一,round(45.926,1) 二,round(45.926,0) 三,
  2         round(45.926,-1) 四,round(45.926,-2) 五
  3  from dual;

        一         二         三         四         五                          
---------- ---------- ---------- ---------- ----------                          
     45.93       45.9         46         50          0

--截断
select trunc(45.926,2) 一,trunc(45.926,1) 二,trunc(45.926,0) 三,
  2         trunc(45.926,-1) 四,trunc(45.926,-2) 五
  3* from dual
SQL> /

        一         二         三         四         五                          
---------- ---------- ---------- ---------- ----------                          
     45.92       45.9         45         40          0 
三、日期:

Oracle中的日期型数据(date)实际含有两个值:日期和时间

默认的日期格式是:DD-MON-RR

--查询当前时间
SQL> select sysdate  from dual;

SYSDATE
---------
04-MAY-17

to_char():把某个东西,按照某个格式转换成字符串

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

TO_CHAR(SYSDATE,'YY
-------------------
2017-05-04 09:19:58

日期的数学运算:

  1. 在日期上加上或减去一个数字结果仍为日期
  2. 两个日期相减返回日期之间相差的天数
  3. 可以用数字除24来向日期中加上或减去小时

例如:

--昨天 今天 明天
SQL> select (sysdate-1) 昨天,sysdate 今天,(sysdate+1) 明天 from dual;

昨天           今天           明天                                              
-------------- -------------- --------------                                    
21-11月-15     22-11月-15     23-11月-15 

--计算员工的工龄:天  星期  月 年
SQL> select ename,hiredate, (sysdate-hiredate) 天,(sysdate-hiredate)/7 星期,
  2                         (sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年
  3  from emp;

ENAME      HIREDATE               天       星期         月         年           
---------- -------------- ---------- ---------- ---------- ----------           
SMITH      17-12月-80     12758.6314 1822.66163 425.287713 34.9551545           
ALLEN      20-2月 -81     12693.6314 1813.37591 423.121046 34.7770723           
WARD       22-2月 -81     12691.6314  1813.0902  423.05438 34.7715928           
JONES      02-4月 -81     12652.6314 1807.51877  421.75438 34.6647435           
MARTIN     28-9月 -81     12473.6314 1781.94734 415.787713 34.1743326           
BLAKE      01-5月 -81     12623.6314 1803.37591 420.787713 34.5852915           
CLARK      09-6月 -81     12584.6314 1797.80448 419.487713 34.4784422           
SCOTT      19-4月 -87     10444.6314  1492.0902  348.15438 28.6154285           
KING       17-11月-81     12423.6314 1774.80448 414.121046 34.0373463           
TURNER     08-9月 -81     12493.6314 1784.80448  416.45438 34.2291271           
ADAMS      23-5月 -87     10410.6314 1487.23306 347.021046 28.5222778           

ENAME      HIREDATE               天       星期         月         年           
---------- -------------- ---------- ---------- ---------- ----------           
JAMES      03-12月-81     12407.6314 1772.51877 413.587713 33.9935107           
FORD       03-12月-81     12407.6314 1772.51877 413.587713 33.9935107           
MILLER     23-1月 -82     12356.6314 1765.23306 411.887713 33.8537846        

日期函数:

日期函数.PNG
moths_between:
select ename,hiredate,(sysdate-hiredate)/30 一,months_between(sysdate,hiredate) 二 from emp;

ENAME      HIREDATE               一         二                                 
---------- -------------- ---------- ----------                                 
SMITH      17-12月-80     425.287784 419.181726                                 
ALLEN      20-2月 -81     423.121117 417.084952                                 
WARD       22-2月 -81     423.054451        417                                 
JONES      02-4月 -81     421.754451 415.665597                                 
MARTIN     28-9月 -81     415.787784 409.826888                                 
BLAKE      01-5月 -81     420.787784 414.697855                                 
CLARK      09-6月 -81     419.487784 413.439791                                 
SCOTT      19-4月 -87     348.154451  343.11721                                 
KING       17-11月-81     414.121117 408.181726                                 
TURNER     08-9月 -81     416.454451 410.472049                                 
ADAMS      23-5月 -87     347.021117 341.988178                                 

ENAME      HIREDATE               一         二                                 
---------- -------------- ---------- ----------                                 
JAMES      03-12月-81     413.587784 407.633339                                 
FORD       03-12月-81     413.587784 407.633339                                 
MILLER     23-1月 -82     411.887784 405.988178

--56 个月后
SQL> select add_months(sysdate,56) from dual;

ADD_MONTHS(SYS                                                                  
--------------                                                                  
22-7月 -20  

select last_day(sysdate) from dual;

LAST_DAY(SYSDA                                                                  
--------------                                                                  
30-11月-15                                                                      

--next_day
SQL> --下一个星期日
SQL> select next_day(sysdate,'星期日') from dual;

NEXT_DAY(SYSDA                                                                  
--------------                                                                  
29-11月-15                                                                      

SQL> --下一个星期一
SQL> select next_day(sysdate,'星期一') from dual;

NEXT_DAY(SYSDA                                                                  
--------------                                                                  
23-11月-15  

next_day的应用:

每个星期一自动备份数据
 1. 分布式数据库
 2. 快照 触发器

日期函数:

日期函数2.PNG
select round(sysdate,'month'),round(sysdate,'year') from dual;

ROUND(SYSDATE, ROUND(SYSDATE,                                                   
-------------- --------------                                                   
01-12月-15     01-1月 -16        

转换函数:

数据类型转换:
隐式
显示

隐式数据类型转换:(oracle自动完成)

隐式数据类型转换.PNG
select * from emp where hiredate='17-11月-81';

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                   
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                   
      7839 KING     PRESIDENT            17-11月-81      5000                    10                 

显示数据类型转换:

显式数据类型转换.PNG

to_char函数对日期的转换:

to_char(date,'format_model')
格式:
必须包含在单引号中而且大小写敏感
可以包含任意的有效的日期格式
日期之间用逗号隔开

日期格式的元素:

日期格式的元素.PNG
--2015-11-22 15:32:12今天是星期日
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI                                              
----------------------------------                                              
2015-11-22 15:33:55今天是星期日 

to_char函数对数字的转换:

to_char函数中经常使用的几种格式

格式.PNG
--查询员工薪水:两位小数 千位符 货币代码
select to_char(sal,'L9,999.99') from emp;
TO_CHAR(SAL,'L9,999                                                             
-------------------                                                             
           ¥800.00                                                             
         ¥1,600.00                                                             
         ¥1,250.00                                                             
         ¥2,975.00                                                             
         ¥1,250.00                                                             
         ¥2,850.00                                                             
         ¥2,450.00                                                             
         ¥3,000.00                                                             
         ¥5,000.00                                                             
         ¥1,500.00                                                             
         ¥1,100.00                                                             

TO_CHAR(SAL,'L9,999                                                             
-------------------                                                             
           ¥950.00                                                             
         ¥3,000.00                                                             
         ¥1,300.00

通用函数:
这些函数适用于任何数据类型,同时也适用于空值

nvl(expr1,expr2)
nvl(expr1,expr2,expr3)
nullif(expr1,expr2)
coalesce(expr1,expr2,...,exprn)

--nvl2(a,b,c) 当a=null的时候,返回c;否则返回b
select sal*12+nvl2(comm,comm,0) from emp;

--nullif(a,b) 当a=b的时候,返回null;否则返回a
select nullif('abc','abc') 值 from dual;

值                                                                              
---                                                                             
    
select nullif('abc','abcd') 值 from dual;

值                                                                              
---                                                                             
abc  

--coalesce 从左到右找到第一个不为null的值
select comm,sal,coalesce(comm,sal) "第一个不为null的值" from emp;

  COMM        SAL 第一个不为null的值                                        

              800                800                                        
   300       1600                300                                        
   500       1250                500                                        
             2975               2975                                        
  1400       1250               1400                                        
             2850               2850                                        
             2450               2450                                        
             3000               3000                                        
             5000               5000                                        
     0       1500                  0                                        
             1100               1100                                        

  COMM        SAL 第一个不为null的值                                        

              950                950                                        
             3000               3000                                        
             1300               1300 

条件表达式:

在sql语句中使用if-then-else逻辑
使用两种方法:
1、case表达式:sql99的语法,类似basic,比较繁琐
2、decode函数:Oracle自己的语法,类似java,比较简洁

语法:

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

SQL> select ename,job,sal 涨前,
  2         case job when 'PRESIDENT' then sal+1000
  3                  when 'MANAGER' then sal+800
  4                  else sal+400
  5          end 涨后
  6  from emp;

或者:
case when sal<3000 then ****
     when sal>=3000 and sal<6000 then ****
     else ****
end

decode:

decode(col|expression,search1,result1
                      [,search2,result2,...,]
                      [,default])

SQL> select ename,job,sal 涨前,
  2         decode(job,'PRESIDENT',sal+1000,
  3                    'MANAGER',sal+800,
  4                              sal+400) 涨后
  5  from emp;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容

  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,710评论 0 2
  • 查询 字符串函数 UPPER LOWER INITCAP LENGTH SUBSTR(Oracle默认从1开始而不...
    嘉美伯爵阅读 827评论 0 1
  • SQL ==SQLPLUS== DML(Data Manipulation Language,数据操作语言)---...
    蝌蚪1573阅读 587评论 0 4
  • ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year:...
    雨一流阅读 659评论 0 2
  • 七年前的那个清晨 她的拳头捶打着我的背 同时也捶打着我的心 早饭后 她提着一大框垃圾 远离了我的视线 迅速又跑了回...
    走小路的人_6ff4阅读 158评论 0 0