sql函數掃盲

單行函數

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函數。


發佈了151 篇原創文章 · 獲贊 45 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章