Oracle起步學習(六)--單行函數

聲明一下,最近在公司學習,看的傳智播客的視頻,感覺能練練,就吧這個筆記開始寫到這裏了。要視頻的可以給我留言哈。


一、字符函數:

大小寫控制函數: LOWER、UPPER、INITCAP

字符控制函數:CONCAT、SUBSTR、LENGTH/LENGTHB、INSTR、LPAD | RPAD、TRIM、REPLACE

1.大小寫控制函數

<span style="font-size:18px;">select lower('Hello WORLd') 轉小寫,upper('Hello WORLd') 轉大寫,initcap('hello world') 首字母大寫 from dual;</span>



2.substr(a,b) 從a中,第b位開始取,取右邊所有的字符

<span style="font-size:18px;">select substr('hello world',3) from dual;</span>



3.substr(a,b,c) 從a中,第b位開始取,取c位(空格也算哦)

<span style="font-size:18px;">select substr('hello world',3,4) from dual;</span>


4.length 字符數  lengthb 字節數

<span style="font-size:18px;">select length('hello world')  字符數,lengthb('hello world')  字節數 from dual;</span>

<span style="font-size:18px;">    字符數     字節數                                                           
---------- ----------                                                           
        11         11       </span>

<span style="font-size:18px;">select length('中國')  字符數,lengthb('中國')  字節數 from dual;</span>
<span style="font-size:18px;">    字符數     字節數                                                           
---------- ----------                                                           
         2          4    
</span>


5.instr(a,b) 從a中查找b,找到返回下標,否則返回0

<span style="font-size:18px;">select instr('hello world','ll') from dual;</span>

<span style="font-size:18px;">INSTR('HELLOWORLD','LL')                                                        
------------------------                                                        
                       3       </span>


6.lpad 左填充 rpad右填充

<span style="font-size:18px;">select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右 from dual;</span>
<span style="font-size:18px;">左         右                                                                   
---------- ----------                                                           
******abcd abcd******    
</span>


7.trim: 去掉前後指定的字符

<span style="font-size:18px;">select trim('H' from  'Hello WorldH') from dual;</span>

<span style="font-size:18px;">TRIM('H'FR                                                                      
----------                                                                      
ello World   </span>



8.replace 替換

<span style="font-size:18px;">select replace('hello world','l','*') from dual;</span>

<span style="font-size:18px;">REPLACE('HE                                                                     
-----------                                                                     
he**o wor*d    </span>


二、數字函數

ROUND:四捨五入 ROUND(3.14159,3) 3.142

TRUNC:截斷 TRUNC(3.14159,3) 3.141

MOD:求餘 MOD(1600,300) 100


1.ROUND:四捨五入

</pre></p><pre name="code" class="sql"><span style="font-size:18px;">select ROUND(45.926, 2) 一,ROUND(45.926, 1) 二,ROUND(45.926, 0) 三,ROUND(45.926, -1) 四, ROUND(45.926, -2) 五 from dual;</span>

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


2.TRUNC:截斷

<span style="font-size:18px;">select TRUNC(45.926, 2) 一,TRUNC(45.926, 1) 二,TRUNC(45.926, 0) 三,TRUNC(45.926, -1) 四, TRUNC(45.926, -2) 五 from dual;<span style="font-family: Arial, Helvetica, sans-serif;"> </span></span>
        一         二         三         四         五                          
---------- ---------- ---------- ---------- ----------                          
     45.92       45.9         45         40          0 

三、日期函數 sysdate 精確到秒 systimestamp 精確到秒以下的單位

1.日期

select sysdate from dual;
SYSDATE                                                                         
--------------                                                                  
19-6月 -13     

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY                                                             
-------------------                                                             
2013-06-19 14:22:23   


系統的時間戳可以達到毫秒,微秒
select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss:ff') from dual;
TO_CHAR(SYSTIMESTAMP,'YYYY-MM                                                   
-----------------------------                                                   
2013-06-19 14:23:22:000000 

2.昨天 今天 明天
select (sysdate-1) 昨天, sysdate 今天,(sysdate+1) 明天 from dual;
昨天           今天           明天                                              
-------------- -------------- --------------                                    
18-6月 -13     19-6月 -13     20-6月 -13     

3.計算員工的工齡

select ename,hiredate,(sysdate-hiredate) 天, (sysdate-hiredate)/7 星期,(sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年 from emp;

ENAME      HIREDATE               天       星期         月         年           
---------- -------------- ---------- ---------- ---------- ----------           
SMITH      17-12月-80     11872.6018 1696.08597 395.753392 32.5276761           
ALLEN      20-2月 -81     11807.6018 1686.80025 393.586725 32.3495939           
WARD       22-2月 -81     11805.6018 1686.51454 393.520059 32.3441144           
JONES      02-4月 -81     11766.6018 1680.94311 392.220059 32.2372651           
MARTIN     28-9月 -81     11587.6018 1655.37168 386.253392 31.7468541           
BLAKE      01-5月 -81     11737.6018 1676.80025 391.253392  32.157813           
CLARK      09-6月 -81     11698.6018 1671.22882 389.953392 32.0509637           
SCOTT      13-7月 -87     703435.602   100490.8 23447.8534 1927.22083           
KING       17-11月-81     11537.6018 1648.22882 384.586725 31.6098678           
TURNER     08-9月 -81     11607.6018 1658.22882 386.920059 31.8016487           
ADAMS      13-7月 -87     703435.602   100490.8 23447.8534 1927.22083           

ENAME      HIREDATE               天       星期         月         年           
---------- -------------- ---------- ---------- ---------- ----------           
JAMES      03-12月-81     11521.6018 1645.94311 384.053392 31.5660322           
FORD       03-12月-81     11521.6018 1645.94311 384.053392 31.5660322           
MILLER     23-1月 -82     11470.6018 1638.65739 382.353392 31.4263062           

已選擇14行。

注意:不可以日期加日期:

select sysdate+hiredate from emp;
select sysdate+hiredate from emp
              *
第 1 行出現錯誤: 
ORA-00975: 不允許日期 + 日期 

4.last_day 日期所在月份的最後一天

select last_day(sysdate) from dual;
LAST_DAY(SYSDA                                                                  
--------------                                                                  
30-6月 -13     

5.MONTHS_BETWEEN 返回兩個日期相差的月數

select ename,hiredate,(sysdate-hiredate)/30 一,MONTHS_BETWEEN(sysdate,hiredate) 二 from emp;
ENAME      HIREDATE               一         二                                 
---------- -------------- ---------- ----------                                 
SMITH      17-12月-80     395.753475 390.084008                                 
ALLEN      20-2月 -81     393.586809 387.987234                                 
WARD       22-2月 -81     393.520142 387.922718                                 
JONES      02-4月 -81     392.220142 386.567879                                 
MARTIN     28-9月 -81     386.253475  380.72917                                 
BLAKE      01-5月 -81     391.253475 385.600137                                 
CLARK      09-6月 -81     389.953475 384.342073                                 
SCOTT      13-7月 -87     23447.8535  23111.213                                 
KING       17-11月-81     384.586809 379.084008                                 
TURNER     08-9月 -81     386.920142 381.374331                                 
ADAMS      13-7月 -87     23447.8535  23111.213                                 

ENAME      HIREDATE               一         二                                 
---------- -------------- ---------- ----------                                 
JAMES      03-12月-81     384.053475 378.535621                                 
FORD       03-12月-81     384.053475 378.535621                                 
MILLER     23-1月 -82     382.353475  376.89046                                 

已選擇14行。

6.ADD_MONTHS: 加上若干個月

select ADD_MONTHS(sysdate,12) from dual;
ADD_MONTHS(SYS                                                                  
--------------                                                                  
22-10月-15    

7.next_day下一個星期幾

select next_day(sysdate,'星期三') from dual;
NEXT_DAY(SYSDA                                                                  
--------------                                                                  
29-10月 -14                                                                      
提示:next_day應用: 每個星期一做數據備份

注意:其使用官方叫法,別用俗稱:禮拜三等等  

                                                               
8.日期的四捨五入

select round(sysdate,'month'),  round(sysdate,'year') from dual;
ROUND(SYSDATE, ROUND(SYSDATE,                                                   
-------------- --------------                                                   
01-11月 -14     01-1月 -14     

四、轉換函數

數據類型轉換:隱性轉換,顯性轉換

源數據類型

目標數據類型

VARCHAR2 or CHARNUMBERVARCHAR2 or CHARDATENUMBERVARCHAR2 DATEVARCHAR2 
隱式轉換的前提: 被轉換對象是可以轉換的

1.TO_CHAR轉日期

格式

說明

舉例

YYYY

 Full year in numbers

2011

YEAR

Year spelled out(年的英文全稱)

twenty eleven

MM

Two-digit value of month 月份(兩位數字)

04

MONTH

Full name of the month(月的全稱)

4月

DY

Three-letter abbreviation of the day of the week(星期幾)

星期一

DAY

Full name of the day of the week

星期一

DD

Numeric day of the month

02


eg:
select to_char(sysdate,'YYYY-mm-dd hh24:mi:ss"今天是"day') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:                                             
-----------------------------------                                             
2014-10-22 22:11:45今天是 星期三       

2.TO_CHAR轉數字
9 數字
0
$ 美元符
L 本地貨幣符號
. 小數點
   ,   千位符

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行。


3.TO_NUMBER,TO_DATE 同理轉換方式。


五、通用函數,這些函數適用於熱河數據類型,同時也適用於空值

NVL(expr1, expr2)

NVL2(expr1, expr2, expr 3)

NULLIF(expr1, expr2)

COALESCE(expr1,expr2,...,exprn)

前兩個常用,後兩個瞭解。


1.nvl2(a,b,c) 當a=null時,返回c,否則返回b

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行。

2.NULLIF(a,b) 當a=b時, 返回null,否則返回a
select nullif('abc','abc') from dual;
NUL                                                                             
--- 

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

3.COALESCE :從左往右找到第一個不爲null的值

select comm,sal,COALESCE(comm,sal) from emp;
      COMM        SAL COALESCE(COMM,SAL)                                        
---------- ---------- ------------------                                        
                  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 COALESCE(COMM,SAL)                                        
---------- ---------- ------------------                                        
                  950                950                                        
                 3000               3000                                        
                 1300               1300                                        

已選擇14行。

六、條件表達式

在SQL語句中使用IF-THEN-ELSE邏輯

a.CASE表達式:SQL99的語法,類似Basic,比較繁瑣

b.DECODE函數:Oracle自己的語法,類似Java,比較簡單

eg:漲工資,總裁1000 經理800 其他400
a.case語法

<span style="color:#3333ff;">CASE </span>expr <span style="color:#3333ff;">WHEN </span>comparison_expr1 <span style="color:#3333ff;">THEN </span>return_expr1<span style="color:#3333ff;">
         [WHEN </span>comparison_expr2 <span style="color:#3333ff;">THEN </span>return_expr2<span style="color:#3333ff;">
          WHEN </span>comparison_exprn <span style="color:#3333ff;">THEN </span>return_exprn<span style="color:#3333ff;">
          ELSE </span>else_expr<span style="color:#3333ff;">]
END
</span>

select ename,job,sal 漲前薪水,
       case job when 'PRESIDENT' then sal+1000
                when 'MANAGER' then sal+800
                else sal+400
        end 漲後薪水 
from emp;
ENAME      JOB         漲前薪水   漲後薪水                                      
---------- --------- ---------- ----------                                      
SMITH      CLERK            800       1200                                      
ALLEN      SALESMAN        1600       2000                                      
WARD       SALESMAN        1250       1650                                      
JONES      MANAGER         2975       3775                                      
MARTIN     SALESMAN        1250       1650                                      
BLAKE      MANAGER         2850       3650                                      
CLARK      MANAGER         2450       3250                                      
SCOTT      ANALYST         3000       3400                                      
KING       PRESIDENT       5000       6000                                      
TURNER     SALESMAN        1500       1900                                      
ADAMS      CLERK           1100       1500                                      

ENAME      JOB         漲前薪水   漲後薪水                                      
---------- --------- ---------- ----------                                      
JAMES      CLERK            950       1350                                      
FORD       ANALYST         3000       3400                                      
MILLER     CLERK           1300       1700                                      

已選擇14行。

b.DECODE語法
<span style="color:#3333ff;">DECODE</span>(col|expression, search1, result1 
      			   [, search2, result2,...,]
      			   [, default])

select ename,job,sal 漲前薪水,
       decode(job,'PRESIDENT',sal+1000,
                  'MANAGER',sal+800,
                            sal+400) 漲後薪水
from emp;
ENAME      JOB         漲前薪水   漲後薪水                                      
---------- --------- ---------- ----------                                      
SMITH      CLERK            800       1200                                      
ALLEN      SALESMAN        1600       2000                                      
WARD       SALESMAN        1250       1650                                      
JONES      MANAGER         2975       3775                                      
MARTIN     SALESMAN        1250       1650                                      
BLAKE      MANAGER         2850       3650                                      
CLARK      MANAGER         2450       3250                                      
SCOTT      ANALYST         3000       3400                                      
KING       PRESIDENT       5000       6000                                      
TURNER     SALESMAN        1500       1900                                      
ADAMS      CLERK           1100       1500                                      

ENAME      JOB         漲前薪水   漲後薪水                                      
---------- --------- ---------- ----------                                      
JAMES      CLERK            950       1350                                      
FORD       ANALYST         3000       3400                                      
MILLER     CLERK           1300       1700                                      

已選擇14行。

HOMEWORK:

根據80好部門員工的工資,顯示稅率

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;





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章