欢迎投稿

今日深度:

Oracle数据库单行函数实例讲解,oracle实例讲解

Oracle数据库单行函数实例讲解,oracle实例讲解


单行函数

什么是SQL函数?

函数可以没有参数,但是必须要有返回值。

函数的类型

单行函数和多行函数

单行函数

这里写图片描述

①字符函数

这里写图片描述

大小写控制函数
SQL> select lower('Hello World') 转小写,upper('Hello World') 转大写,initcap('hello world') 首字母大写
  2  from dual;

转小写      转大写      首字母大写                                              

hello world HELLO WORLD Hello World  
字符控制函数
SQL> --substr(a,b) 从a中,第b位开始取
SQL> select substr('Hello World',4) 子串 from dual;

子串                                                                            
--------                                                                        
lo World                                                                        

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

子                                                                              
---                                                                             
lo                                                                              

SQL> --length 字符数 lengthb 字节数
SQL> select length('Hello World') 字符,lengthb('Hello World') 字节 from dual;

      字符       字节                                                           
---------- ----------                                                           
        11         11                                                           

SQL> ed
已写入 file afiedt.buf

  1* select length('北京') 字符,lengthb('北京') 字节 from dual
SQL> /

      字符       字节                                                           
---------- ----------                                                           
         2          4                                                           

SQL> --instr(a,b)
SQL> --在a中,查找b
SQL> select instr('Hello World','ll') 位置 from dual;

      位置                                                                      
----------                                                                      
         3                                                                      

SQL> --lpad 左填充  rpad 右填充
SQL> -- abcd  ---> 10位
SQL> select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右 from dual;

左         右                                                                   
---------- ----------                                                           
******abcd abcd******                                                           

SQL> --trim 去掉前后指定的字符
SQL> select trim('H' from 'Hello WorldH') from dual;

TRIM('H'FR                                                                      
----------                                                                      
ello World                                                                      

SQL> --replace
SQL> select replace('Hello World','l','*') from dual;

REPLACE('HE                                                                     
-----------                                                                     
He**o Wor*d  

②数值函数:

SQL> --四舍五入
SQL> select round(45.926,2) 一,round(45.926,1) 二,round(45.926,0) 三,round(45.926,-1) 四,round(45.926,-2) 五
  2  from dual;

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

SQL> --截断
SQL> ed
已写入 file afiedt.buf

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

        一         二         三         四         五                          
---------- ---------- ---------- ---------- ----------                          
     45.92       45.9         45         40          0                          

SQL> host cls

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

SYSDATE                                                                         
--------------                                                                  
29-9月 -16                                                                      

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

TO_CHAR(SYSDATE,'YY                                                             
-------------------                                                             
2016-09-29 11:58:32                                                             

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

昨天           今天           明天                                              
-------------- -------------- --------------                                    
28-9月 -16     29-9月 -16     30-9月 -16                                        

SQL> --计算员工的工龄:天 星期  月 年
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     13070.5013 1867.21448 435.683378 35.8095927           
ALLEN      20-2月 -81     13005.5013 1857.92876 433.516711 35.6315105           
WARD       22-2月 -81     13003.5013 1857.64305 433.450044  35.626031           
JONES      02-4月 -81     12964.5013 1852.07162 432.150044 35.5191817           
MARTIN     28-9月 -81     12785.5013 1826.50019 426.183378 35.0287708           
BLAKE      01-5月 -81     12935.5013 1847.92876 431.183378 35.4397297           
CLARK      09-6月 -81     12896.5013 1842.35733 429.883378 35.3328804           
SCOTT      19-4月 -87     10756.5013 1536.64305 358.550044 29.4698667           
KING       17-11月-81     12735.5013 1819.35733 424.516711 34.8917845           
TURNER     08-9月 -81     12805.5013 1829.35733 426.850044 35.0835653           
ADAMS      23-5月 -87     10722.5013  1531.7859 357.416711  29.376716           

ENAME      HIREDATE               天       星期         月         年           
---------- -------------- ---------- ---------- ---------- ----------           
JAMES      03-12月-81     12719.5013 1817.07162 423.983378 34.8479489           
FORD       03-12月-81     12719.5013 1817.07162 423.983378 34.8479489           
MILLER     23-1月 -82     12668.5013  1809.7859 422.283378 34.7082228           

已选择 14 行。

SQL> select sysdate+hiredate from emp;
select sysdate+hiredate from emp
              *
第 1 行出现错误: 
ORA-00975: 不允许日期 + 日期 


SQL> --months_between
SQL> select ename,hiredate,(sysdate-hiredate)/30 一,months_between(sysdate,hiredate) 二
  2  from emp;

ENAME      HIREDATE               一         二                                 
---------- -------------- ---------- ----------                                 
SMITH      17-12月-80     435.683431  429.40332                                 
ALLEN      20-2月 -81     433.516764 427.306546                                 
WARD       22-2月 -81     433.450097  427.24203                                 
JONES      02-4月 -81     432.150097 425.887191                                 
MARTIN     28-9月 -81     426.183431 420.048481                                 
BLAKE      01-5月 -81     431.183431 424.919449                                 
CLARK      09-6月 -81     429.883431 423.661384                                 
SCOTT      19-4月 -87     358.550097 353.338804                                 
KING       17-11月-81     424.516764  418.40332                                 
TURNER     08-9月 -81     426.850097 420.693642                                 
ADAMS      23-5月 -87     357.416764 352.209772                                 

ENAME      HIREDATE               一         二                                 
---------- -------------- ---------- ----------                                 
JAMES      03-12月-81     423.983431 417.854933                                 
FORD       03-12月-81     423.983431 417.854933                                 
MILLER     23-1月 -82     422.283431 416.209772                                 

已选择 14 行。

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

ADD_MONTHS(SYS                                                                  
--------------                                                                  
28-2月 -21                                                                      

SQL> --last_day
SQL> select last_day(sysdate) from dual;

LAST_DAY(SYSDA                                                                  
--------------                                                                  
30-9月 -16                                                                      

SQL> host cls

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

NEXT_DAY(SYSDA                                                                  
--------------                                                                  
06-10月-16                                                                      

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

NEXT_DAY(SYSDA                                                                  
--------------                                                                  
30-9月 -16                                                                      

SQL> select next_day(sysdate,'礼拜五') from dual;
select next_day(sysdate,'礼拜五') from dual
                        *
第 1 行出现错误: 
ORA-01846: 周中的日无效 


SQL> /*
SQL> next_day函数的应用:每个星期一自动备份表中的数据
SQL> 1、分布式数据库
SQL> 2、触发器 快照
SQL> */
SQL> select round(sysdate,'month'),round(sysdate,'year') from dual;

ROUND(SYSDATE, ROUND(SYSDATE,                                                   
-------------- --------------                                                   
01-10月-16     01-1月 -17  

③转换函数

分为隐式和显式
这里写图片描述
这里写图片描述

SQL> --2016-09-29 12:18:12今天是星期四
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss今天是day') from dual;
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss今天是day') from dual
                       *
第 1 行出现错误: 
ORA-01821: 日期格式无法识别 


SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI                                              
----------------------------------                                              
2016-09-29 12:20:13今天是星期四                                                 

SQL> --查询员工的薪水:两位小数、千位符、本地货币代码
SQL> 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                                                             

已选择 14 行。

SQL> host cls

SQL> --nvl2(a,b,c) 当a=null的时候,返回c;否则返回b
SQL> selec sal*12+nvl2(comm,comm,0) from emp;
SP2-0734: 未知的命令开头 "selec sal*..." - 忽略了剩余的行。
SQL> select sal*12+nvl2(comm,comm,0) from emp;

SAL*12+NVL2(COMM,COMM,0)                                                        
------------------------                                                        
                    9600                                                        
                   19500                                                        
                   15500                                                        
                   35700                                                        
                   16400                                                        
                   34200                                                        
                   29400                                                        
                   36000                                                        
                   60000                                                        
                   18000                                                        
                   13200                                                        

SAL*12+NVL2(COMM,COMM,0)                                                        
------------------------                                                        
                   11400                                                        
                   36000                                                        
                   15600                                                        

已选择 14 行。

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

值                                                                              
---                                                                             


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

值                                                                              
---                                                                             
abc                                                                             

SQL> --coalesce 从左到右 找到第一个不为null的值
SQL> select comm,sal,coalesce(comm,sal) "第一个不为null的值"
  2  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                                        

已选择 14 行。

④通用函数

什么是通用函数?

这些函数适用于任何数据类型,同时也适用于空值。
这里写图片描述

SQL> host cls

SQL> --nvl2(a,b,c) 当a=null的时候,返回c;否则返回b
SQL> selec sal*12+nvl2(comm,comm,0) from emp;
SP2-0734: 未知的命令开头 "selec sal*..." - 忽略了剩余的行。
SQL> select sal*12+nvl2(comm,comm,0) from emp;

SAL*12+NVL2(COMM,COMM,0)                                                        
------------------------                                                        
                    9600                                                        
                   19500                                                        
                   15500                                                        
                   35700                                                        
                   16400                                                        
                   34200                                                        
                   29400                                                        
                   36000                                                        
                   60000                                                        
                   18000                                                        
                   13200                                                        

SAL*12+NVL2(COMM,COMM,0)                                                        
------------------------                                                        
                   11400                                                        
                   36000                                                        
                   15600                                                        

已选择 14 行。

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

值                                                                              
---                                                                             


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

值                                                                              
---                                                                             
abc                                                                             

SQL> --coalesce 从左到右 找到第一个不为null的值
SQL> select comm,sal,coalesce(comm,sal) "第一个不为null的值"
  2  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                                        

已选择 14 行。

⑤条件表达式

就是在SQL语句中使用if-then-else
case表达式:SQL99的语法,类似于Basic,比较繁琐。
DECODE函数:Oracle自己的语法,类似于java,比较简介。

这里写图片描述

www.htsjk.Com true http://www.htsjk.com/oracle/24312.html NewsArticle Oracle数据库单行函数实例讲解,oracle实例讲解 单行函数 什么是SQL函数? 函数可以没有参数,但是必须要有返回值。 函数的类型 单行函数和多行函数 单行函数 ①字符函数 大小写控制...
评论暂时关闭