數據庫之函數

概念

  • 單行函數:針對sql語句影響的每一行都進行處理,並針對這一行返回一個結果sql影響多少行就返回多少個結果
  • 組函數 :對sql語句影響的全部行進行綜合處理,最終返回一個結果不管sql語句影響多少行都只返回一個結果(組函數會忽略空值)

對字符串處理的函數

dual表說明

假設一張表有100w條數據,測試單行函數,會返回100w條數據,這樣返回會佔屏幕,很麻煩因此係統提供一個測試表,dual(單行單列的表)sql

select * from dual;

  

能夠用它進行單行函數的測試(也能夠本身再建一個單行單列的表)shell

upper(par1)  對字符串變大寫

演示:

 select first_name, upper(first_name) from s_emp where id=1;

影響了一行的狀況(id爲1的只有一個):bash

 

select first_name, upper(first_name) from s_emp where id<1;

一行都沒有影響的狀況(id小於1的不存在):服務器

 

select first_name, upper(first_name) from s_emp where id>1;

影響多行的狀況(id大於1的有24個):oracle

lower(par1)  對字符串變小寫

演示:測試lower函數:

select lower('HELLO') from dual;

initcap(par1) 對每一個單詞的首字母變大寫

演示:測試initcap函數

select initcap('one world one dream') from dual;

 oncat函數(用的少,通常用||)

oncat(par1  varchar2,par2)//把類型寫後面  鏈接字符串

演示:測試concat函數:

select concat('hello', 'world') from dual;

要是複雜拼接,用concat不方便。函數

 

select concat(concat('a','b'),concat('c','d')) from dual;

須要函數嵌套(把被嵌套函數的返回值做爲函數的參數使用)測試

 

select 'a' || 'b' || 'c' || 'd' con from dual;

用|| 就更方便。編碼

substr函數

substr(par1,par2,par3)  截取字符串
  • par1:是要處理的數據
  • par2:  
    • 指定從什麼位置進行處理。
    • 編號從1開始,能夠是負數(從後向前處理)。
    • -1表明最後一個字符
  • par3:截取多長

若是非要從0編號,oracle會自動把0變爲1。spa

select substr('hello',0,2) from dual;

 

select substr('hello',1,2) from dual;

 

select substr('hello',-3,2) from dual;

 

演示:把s_emp表中的first_name和first_name的後三個字符顯示出來

select first_name ,substr(first_name,-3,3) from s_emp;

replace函數

replace(par1,par2,par3)  
  • par1  要處理的內容
  • par2  要被替代的內容
  • par3  要替換成的內容
select replace('one world one dream','one','two') from dual;

nvl函數

nvl(par1,par2)   爲空時替換
  • par1  要處理的內容
  • par2  爲空時要替換的內容

處理數字的函數

round函數

round(par1,par2)  四捨五入
  • par1  要處理的數據
  • par2  指定要如何處理(默認是取整)
    •    0是默認四捨五入取整
    •   正數n是保留小數點後n位
    •   負數n是直接對小數點前n位進行四捨五入取整(可能會丟失數據)

演示:

四捨五入默認取整:操作系統

select round(9.58) from dual;

 

保留小數點後兩位四捨五入:

select round(9.486,2) from dual;

 

對小數點前兩位進行四捨五入取整:

select round(190.486,-2) from dual;

trunc函數

trunc(par1,par2)  截取
  • par1  要處理的數據
  • par2  指定要如何處理    默認是取整截取
    •   0是默認取整截取
    •   正數n是保留小數點後n位
    •   負數n是直接對小數點前n位進行截取
select trunc(9.58) from dual;
select trunc(9.486,2) from dual;
select trunc(190.486,-2) from dual;
select trunc(190.486,-1) from dual;

  to_number函數

to_number(par1) 
  • 把數字字符串轉換爲數字
  • 只能轉換數字字符串,不能是非數字的字符串
  • 實際上sql裏會自動進行轉換,因此這個函數用的不多

因此下面三個結果同樣:

select id, first_name from s_emp where id='1';
select id, first_name from s_emp where id=to_numer('1');
select id, first_name from s_emp where id=1;

to_char函數

to_char(par1,par2)  轉換數字的顯示格式
  • par1  要處理的數字或者數字字段
  • par2  顯示格式  能夠省略,表明把一個類型變成字符串類型
    •   fm  開頭
    •   $   美圓符號
    •   L   本地貨幣符號  和操做系統的本地語言有關  中國的是¥

 

  • 9 :在小數點前面,表明0~9的任意數字;

        在小數點後,表明1~9的任意數字

  • 0 :在小數點前面,表明強制顯示前導零  e.g. 12345—> 012 , 345.00 

      在小數點後面表明0~9的任意數字

  • :分割符號
  • .  : 小數點

演示:

select to_char(12345,'fm$099,999.99') from dual;

 

select to_char(12345,'fm$099,999.00') from dual;

 

select to_char(12345.85,'fmL099,999.99') from dual;

 

select salary , to_char(salary,'fm$000,000.00') from s_emp;

 

select salary, to_char(salary,'fm$099,999.00') from s_emp;

如何修改本地語言

(1)遠程登陸服務器後,切換shell  

      bash

(2)打開配置文件

      vi .bash_profile

(3)寫入配置

      export NLS_LANG=’SIMPLIFIED CHINA.ZHS16GBK’(簡體中文編碼)

      export NLS_LANG=’AMERICAN_AMERICA.ZHS16GBK’(美語)

(4)保存退出

      Esc+shift+z z

(5)source  .bash_profile   讓配置文件生效

(6)從新進入sqlplus

函數的嵌套

把一個函數的返回值做爲另外一個函數的參數

演示:把s_emp表中的first_name和first_name的後三個字符輸出結合substr和length(計算長度)

select first_name, substr(first_name,length(first_name)-2,3);

由於編號是從1開始的,length(first_name)是倒數第一個。

length(first_name)-2就是倒數第三個了

演示:顯示s_emp表中的id  first_name manager_id,若是manager_id是NULL,則顯示成BOSS

select id, first_name, nvl(to_char(manager_id), 'BOSS');

組函數

常見的函數:

  • count(par1) 統計個數
  • max(par1)   統計最大值
  • min(par1)    統計最小值
  • avg(par1)    統計平均值
  • sum(par1)   統計和

演示:統計s_emp表中工資的最大值和最小值

select count(*), max(salary), min(salary) from s_emp;

*只用在count裏面,統計有多少條)

演示:統計s_emp表中的工資平均值工資的和

select count(*), avg(salary), sum(salary) from s_emp;

  

把重複的值去掉以後再統計:

select count(*), avg(distinct salary), sum(distinct salary) from s_emp;

 

組函數對NULL是如何處理的?

忽略不統計(排序裏把空當作最大值,可是在組函數統計最大值是是忽略空)

例如:25個員工裏,有些人的提成爲空;

演示:統計s_emp中提成的個數,提成的和,提成的平均工資

select count(commission_pct), sum(commision_pct), avg(commission_pct) from s_emp;

相關文章
相關標籤/搜索