概念
- 單行函數:針對sql語句影響的每一行都進行處理,並針對這一行返回一個結果sql影響多少行就返回多少個結果
- 組函數 :對sql語句影響的所有行進行綜合處理,最終返回一個結果無論sql語句影響多少行都只返回一個結果(組函數會忽略空值)
對字符串處理的函數
dual表說明
假設一張表有100w條數據,測試單行函數,會返回100w條數據,這樣返回會占屏幕,很麻煩所以系統提供一個測試表,dual(單行單列的表)
select * from dual;
可以用它進行單行函數的測試(也可以自己再建一個單行單列的表)
upper(par1) 對字符串變大寫
演示:
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的不存在):
select first_name, upper(first_name) from s_emp where id>1;
影響多行的情況(id大於1的有24個):
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。
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;