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