單行函數
lower(列名|表達式) 把字符轉換成小寫
upper(列名|表達式) 把字符轉換成大寫
initcap(列名|表達式) 把每個字的頭一個字母轉換成大寫。
Initcat(‘sql is used’) Sql Is Used
concat(列名|表達式,列名|表達式) 把第一個字符串和第二個字符串連接起來成爲一個字符串。
Substr(列名|表達式,m,[n]) 用於返回指定的字串,該字串從第m個字符開始,其長度爲n ,如果省略n 那麼就是從m 後的所有字符。
Length (列名|表達式) 返回表達式中字符串的長度。
Instr(列名|表達式,’字符串’,[m],[n]) 該函數返回所給字符串在表達式中的數字位置。m 表示從第m 個字符開始搜索,n 表示所給字符串出現的次數,默認值爲1.
Trim ([leading|trailing|both]要去掉的字符from 源字符串) 該函數能夠從“源字符串”中的頭(leading),尾(trailing)或兩者(both)中去掉“要去掉的字符”,其中both 爲默認方式。
Replace(正文表達式,要搜索的字符串,替換字符串) 用於在“正文表達式”裏查找“要搜尋的字符串”並用“替換字符串”替換之。
數字型函數
Round(列名|表達式,n) 該函數將列名或表達式所表示的數值四捨五入到小數點後的n位。
Trunc(列名|表達式,n) 將列名或表達式表示的數值截取到小數點後的n 位。
Mod (m,n) m 除以n 求餘數。
系統日期函數sysdate 返回當前的系統時間。
To_date(日期字符串) 將日期字符串轉換成日期。
Months_between(日期1,日期2) 返回日期1和日期2之間的數。如果日期2大於日期1 那麼返回的月數爲負。
Add_months(日期,n) 把n 加到日期上。
Next_day(日期,字符串(星期幾)) 返回日期之後的下一個字符串(星期幾)指定的日期。
Last_dat(日期) 返回日期所在月的最後一天。
Round 和trunc也可用於日期型函數。
Select round(to_date(’23-0ct-01’),’month’)from dual; 返回 01-nov-01
To_char(日期,’fmt’) 把日期轉換成變長字符串,其中“fmt”是日期模式(如:MM/DD/YY)
To_char(數字,’fmt’) 把數字轉換成變長字符串,其中“fmt” 是數字模式。
常用字符模式:
l 9 一位數字
l 0 顯示前導零
l $ 顯示美元符號
l L 顯示本地貨幣號
l . 顯示小數點
l , 顯示千位符
l MI 在數的右邊顯示減號
l PR 把負數用尖括號括起來
To_number(字符串[,’fmt’]) 把字符串轉換成數字。
To_date(字符串[,’fmt’]) 把字符串轉換成日期。
Oracle常用的5個分組函數分別爲:Count 、Avg、Sum、Max、Min
Count({*[distinct|all]表達式}) 用於返回查詢的行數。Count(*) 返回表中所有的行,包括空行和重複的行。Count(表達式) 返回表中所有表達式爲非空的行。
Avg([distinct|all] 表達式) 用於返回表達式的平均值。
Sum([distinct|all]表達式) 用於返回表達式的總和。
Min([distinct|all]表達式) 返回表達式的最小值。
Max([distinct|all]表達式) 返回表達式的最大值。
不像AVG和SUM 函數只能操作數字型數據,MIN和MAX函數不但可用於數字型數據,而且還可以用於字符型數據和日期型數據。字符型是按他們的ASCII碼來計算的。
group by 的用法
group by 子句中的列可以不在select語句中。
for exemple :select avg(sal) "AverageSalary" from emp group by job;
如果在一個查詢語句(select子句)中使用了分組函數,則任何不在分組函數中的列或表達式必須在group by 中出現,不容許單獨出現於任何子句中。
for exemple :select job,avg(sal) from empgroup by job order by deptno;中列deptno 既沒有在分組函數中也沒有在分組子句中,所以是非法的語句。
where 子句不能用於限制分組函數。在Oracle中可以使用having子句限制分組函數。
假若emp表中有按此順序的ename,job,emnber,deptno四列
select * from emp order by 2; 是按照job列排序。
select emnber,ename,job from emp order by3;是按job列排序。
就是說如果order by 中後跟列號,就按照此語句的列的順序。
分組函數使系統的效率明顯下降,特別是在對容量大的表格進行這樣的操作時,因爲使用這樣的函數通常要掃描整個表,如果使用了group by 子句,那麼還得進行分組。
select min(avg(sal)),max(avg(sal)) from empwhere job not like 'CLEAR%' group by job; 此句的執行下順序是
1)在emp表中找到所有職位(job) 不是CLEAR的記錄
2)把這些記錄按照職位進行分組
3)然後進行分組函數的運算(從內到外)即先算出平均值
4)最後求出這些平均工資的最小值和最大值。
Having 子句的使用 select job,AVG(sal) from empwhere AVG(sal)>1500 group by job; 本查詢語句出現錯誤爲:where 處不允許出現分組函數。這是因爲where 子句不能用於限制分組函數。 在Oracle中可以使用having子句限制分組函數。Having用於限制分組函數時與group by 一起使用。 首先對數據行(記錄)進行分組,把所得到的分組應用於分組函數,最後顯示滿足having子句所指定條件的結果。
分組函數可以嵌套使用,但有一點請注意:儘管分組函數給我們編寫SQL語句帶來很大的方便,但是使用起來可能會使系統的效率明顯下降,特別是在對容量大的表格進行這樣的操作時。因爲使用分組函數通常要掃描整個表,如果使用了group by 子句,Oracle還要進行排序。
除了count 之外,其他的函數都不處理空值(NULL)。所以如果涉及處理空值問題的話就用NVL 和NVL2函數。