SQL和PL/SQL中自帶很多類型的函數(shù),有字符、數(shù)字、日期、轉(zhuǎn)換、和混合型等多種函數(shù)用于處理單行數(shù)據(jù),因此這些都可被統(tǒng)稱為單行函數(shù)。這些函數(shù)均可用于SELECT,WHERE、ORDER BY等子句中,例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等單行函數(shù)。 SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)
下面我們看看emp數(shù)據(jù)表它包含了薪水、獎金兩項,需要計算總的補償 column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2
ASCII() c1是一字符串,返回c1第一個字母的ASCII碼,他的逆函數(shù)是CHR() SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122
CHR(<i>)[NCHAR_CS] i是一個數(shù)字,函數(shù)返回十進制表示的字符 select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B
CONCAT(,) c1,c2均為字符串,函數(shù)將c2連接到c1的后面,如果c1為null,將返回c2.如果c2為null,則返回c1,如果c1、c2都為null,則返回null。他和操作符||返回的結(jié)果相同 select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda
INITCAP() c1為一字符串。函數(shù)將每個單詞的第一個字母大寫其它字母小寫返回。單詞由空格,控制字符,標點符號限制。 select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici
INSTR(,[,<i>[,]]) c1,c2均為字符串,i,j為整數(shù)。函數(shù)返回c2在c1中第j次出現(xiàn)的位置,搜索從c1的第i個字符開始。當(dāng)沒有發(fā)現(xiàn)需要的字符時返回0,如果i為負數(shù),那么搜索將從右到左進行,但是位置的計算還是從左到右,i和j的缺省值為1. select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2
正如題目暗示的那樣組函數(shù)就是操作那些已經(jīng)分好組的數(shù)據(jù),我們告訴數(shù)據(jù)庫用GROUP BY怎樣給數(shù)據(jù)分組或者分類,當(dāng)我們在SELECT語句的SELECT子句中使用組函數(shù)時,我們必須把為分組或非常數(shù)列放置在GROUP BY子句中,如果沒有用group by進行專門處理,那么缺省的分類是將整個結(jié)果設(shè)為一類。 select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982
在這個例子中,我們用state字段分類;如果我們要將結(jié)果按照zip_codes排序,可以用ORDER BY語句,ORDER BY子句可以使用列或組函數(shù)。 select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982
用HAVING子句限制分組數(shù)據(jù)
現(xiàn)在你已經(jīng)知道了在查詢的SELECT語句和ORDER BY子句中使用主函數(shù),組函數(shù)只能用于兩個子串中,組函數(shù)不能用于WHERE子串中,例如下面的查詢是錯誤的: 錯誤SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk
這個語句中數(shù)據(jù)庫不知道SUM()是什么,當(dāng)我們需要指示數(shù)據(jù)庫對行分組,然后限制分組后的行的輸出時,正確的方法是使用HAVING語句: SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;