【文章內(nèi)容簡(jiǎn)介】
求平均值,DISTINCT 只對(duì)不 同的求平均值,相同只取一個(gè)。SQL l 1* select avg(sal) from empSQL / AVG(SAL)MAX( [ { DISTINCT | ALL}] )求最大值,ALL表示對(duì)所有求最大值,DISTINCT 只對(duì)不 同的求最大值,相同只取一個(gè)。SQL select max(sal) from emp。 MAX(SAL) 5000MIN( [ { DISTINCT | ALL}] )求最小值,ALL表示對(duì)所有求最小值,DISTINCT 只對(duì)不同的求最小值,相同只取一個(gè)。SQL select min(sal) from emp。 MIN(SAL)800STDDEV( [ { DISTINCT | ALL}] )求標(biāo)準(zhǔn)差,ALL表示對(duì)所有求標(biāo)準(zhǔn)差,DISTINCT 只對(duì)不同的求標(biāo)準(zhǔn)差,相同只取一個(gè)。SQL select stddev(sal) from emp。STDDEV(SAL) 帶 GROUP BY 的計(jì)算可以用 GROUP By 來(lái)實(shí)現(xiàn)對(duì)一組數(shù)進(jìn)行分組統(tǒng)計(jì)(如SUM,count(*) 等),如:要列出部門(mén)代碼、部門(mén)人數(shù),部門(mén)工資總和,則用到GROUP BY : SQL select deptno,count(*) ,sum(sal) from emp group by deptno。 DEPTNO COUNT(*) SUM(SAL) 10 3 8750 20 5 10875 30 6 9400 用 HAVING 來(lái)限制分組的計(jì)算在分組GROUP BY 中,一般都不管 統(tǒng)計(jì)的結(jié)果是多少都要全顯示,我們可以在GROUP BY 前或后加 HAVING 子句來(lái)限制結(jié)果的統(tǒng)計(jì),比如要求被統(tǒng)計(jì)的人數(shù)有5個(gè)人以上,則有兩方法可以實(shí)現(xiàn):SQL select deptno,count(*) ,sum(sal) from emp group by deptno 2 having count(*)=5。 DEPTNO COUNT(*) SUM(SAL) 20 5 10875 30 6 9400SQL select deptno,count(*) ,sum(sal) from emp having count(*)=5 2 group by deptno。 DEPTNO COUNT(*) SUM(SAL) 20 5 10875 30 6 9400 用 ORDER BY 子句來(lái)對(duì)結(jié)果進(jìn)行排序Oracle 提供ORDER BY 子句,可用于對(duì)查詢到的結(jié)果進(jìn)行排序輸出。這樣的操作是在內(nèi)存中進(jìn)行的。比如按照部門(mén)代碼順序和員工的工資多少順序進(jìn)行輸出,需要命令:SQL select deptno,ename,sal from emp order by deptno,sal desc。 DEPTNO ENAME SAL 10 KING 5000 10 CLARK 2450 10 MILLER 1300 20 SCOTT 3000 20 FORD 3000 20 JONES 2975 20 ADAMS 1100 20 SMITH 800 30 BLAKE 2850 30 ALLEN 1600 30 TURNER 1500 30 WARD 1250 30 MARTIN 1250 30 JAMES 950這里的 DESC 表sal(工資) 按照降序排列。五、 數(shù)據(jù)操縱語(yǔ)言(DML)命令 INSERT操作INSERT 語(yǔ)句可以完成對(duì)表、視圖及快照(snapshot)進(jìn)行數(shù)據(jù)插入。插入的數(shù)據(jù)依不同的版本而允許插入的數(shù)據(jù)類型也不同,最新版本可以在子查詢中使用 LOB數(shù)據(jù)類型?,F(xiàn)在最新的版本仍有下面限制:l 不能在語(yǔ)句中使用并行,也不允許從遠(yuǎn)程進(jìn)行插入;l 在子查詢中不允許使用帶有l(wèi)ong 類型的字段。(1)INSERT命令語(yǔ)法:INSERT INTO [user.]table[@db_link][(column1[,column2]...)]VALUES ( express1[,express2]...|subquery...)。(2) 日期的插入 INSERT into emp_house_fund(name,emp_acc_no,tran_date,tran_val)VALUES(39。王五39。,39。12345639。,to_date(39。06/09/200039。,39。dd/mm/yyyy39。),)。 INSERT into emp_house_fund(name,emp_acc_no,tran_date,tran_val)VALUES(39。王五39。,39。12345639。,to_date(39。39。,39。39。),)。 INSERT into emp_house_fund(name,emp_acc_no,tran_date,tran_val)VALUES(39。王五39。,39。12345639。,to_date(39。0609200039。,39。ddmmyyyy39。),)。(3)帶 select 的插入SQL create table emp_house_fund_sum( per_id verchar2(20), tran_val number(9,2))。SQL insert into emp_house_fund_sum select per_id,sum(tran_val)From emp_house_fund grou by per_id。SQLselect , , from emp_house_fund a,emp_house_fund_sum bwhere =。(4)用文字插入操作INSERT INTO deptVALUES (50, ‘PRODUCTION’,’SAN FRANCISCO’)。INSERT INTO emp (empno, ename, job, sal, m, deptno)VALUES (7890, ‘LINKS’,’CLERK’, NULL, 40)。下面語(yǔ)句完成同樣的功能,只是用了子查詢:INSERT INTO (SELECT empno, ename, job, sal, m, deptno FROM emp)VALUES (7890, ‘LINKS’,’CLERK’, NULL, 40)。(5)用子查詢插入操作INSERT INTO bonusSELECT ename, job, sal, mFROM empWHERE m * salOR job IN (‘PRESIDENT’,’MANAGER’)。 UPDATE操作(1) UPDATE語(yǔ)法UPDATE [user.]table[@db_link][alias]SET { column1=express1[,column2=experss2]...|(column1[,column2]...)=(subquery) }[WHERE condition|current of cursor]。(2)一般的修改如果起息日為空時(shí)以處理日作為該記錄的起息日:SQLupdate emp_house_fund set tran_date=sysdateWhere proc_date=sysdate and tran_date is null。(3) 帶null 的修改SQLupdate emp set per_id=null where length(per_id)15 or Substr(per_id,15,1) 1。DETELE操作在應(yīng)用中,可以使用delete 語(yǔ)句實(shí)現(xiàn)將不需要的記錄進(jìn)行刪除。值得注意的是,經(jīng)常使用DELETE 語(yǔ)句對(duì)表的記錄進(jìn)行有條件的刪除。而無(wú)條件的全表刪除需要一定的技巧。請(qǐng)看下面的例子。(1) 用delete刪除全部記錄的操作1. DELETE 語(yǔ)法DELETE [ FROM ] [user.]table [@db_link][Alias] [WHERE condition]。這里的condition 可以復(fù)雜的表達(dá)式或子查詢。:SQL delete from 。SQLdelete from colle_subjectsWhere per_id in ( select per_id from univ_subjects )。(2) 用delete有條件刪除部分記錄刪除語(yǔ)句用的最多應(yīng)該是有條件的刪除記錄。如果我們不是有條件的刪除的話,我們應(yīng)該采用直接建立一個(gè)新表、DROP 舊表的方法來(lái)達(dá)到我們的目的。例1:DELETE FROM temp_assign。例2:DELETE FROM empWHERE JOB = ’SALESMAN’AND COMM 100。例3:DELETE FROM (select * from emp)WHERE JOB = ’SALESMAN’AND COMM 100。限制:l 不能使用并行或帶遠(yuǎn)程對(duì)象l 不能用LONG類型(3) 用delete分段刪除大量記錄有時(shí)我們需要?jiǎng)h除大塊的數(shù)據(jù),在環(huán)境比較差的情況下,往往由于回滾段不夠大而出現(xiàn)刪除失敗。這樣我們可以采用以下兩種方法來(lái)達(dá)到刪除大量數(shù)據(jù)的目的。例1:用rownum 來(lái)限制每次刪除的記錄數(shù)目:DELETE from emp where deptno=9999 and rownum 1000。例2:編寫(xiě)一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程,如:SQLget del_recDECLARE TMP VARCHAR2(1)。BEGIN LOOP BEGIN /* 下面語(yǔ)句確定是否還有可刪的記錄,如果沒(méi)有就直接到EXCEPTION */ SELECT ‘X’ INTO TMP FROM SAMPLE WHERE ROWNUM = 1。 /* 如果SAMPLE還有數(shù)據(jù)就執(zhí)行刪除一組操作,即使不夠20條也不會(huì)出錯(cuò) */ DELETE FROM SAMPLE WHERE ROWNUM20。 COMMIT。 EXCEPTION WHEN NO_DATA_FOUND THEN EXIT。 END。END LOOP。END。復(fù)雜查詢語(yǔ)句的使用復(fù)雜查詢語(yǔ)句的使用使用SELECT語(yǔ)句和子查詢(SUBQUERY)可以從一個(gè)或多個(gè)表、視圖、實(shí)體視圖中返回?cái)?shù)據(jù)。(1) 相關(guān)子查詢可以將子查詢(前面提到的 as subquery )或In 或 exists當(dāng)成 where 的一個(gè)條件的一部分,這樣的查詢稱作子查詢。l where中可以包含一個(gè)select語(yǔ)句子查詢;l where中可以包含IN, EXISTS 語(yǔ)句;l 最多可嵌套16層;l 層數(shù)過(guò)多會(huì)影響性能。例:比如一個(gè)查詢是否有專家既以研究所的名義申請(qǐng)基金項(xiàng)目又以大學(xué)系為單位申請(qǐng)項(xiàng)目(按規(guī)定只能以一個(gè)單位來(lái)申請(qǐng)):SQLselect name,per_id,dept_name from univ_subjectsWhere per_id in ( select per_id from colle_subjects )。(2) 外連接招生中,如果所有學(xué)生的信息放在 students 表中,而部分有特長(zhǎng)的學(xué)生在另一個(gè)表student_skill 中同樣有該學(xué)生信息?,F(xiàn)在要全部列出所有學(xué)生,如果某個(gè)學(xué)生在表student_skill 中有其特長(zhǎng)信息,就顯示特長(zhǎng)內(nèi)容,如果某個(gè)學(xué)生沒(méi)有特長(zhǎng)(在表student_skill 中無(wú)其特長(zhǎng)信息)就顯示特長(zhǎng)為空:SQLselect , name, age,skill from students a, student_skill bWhere =(+)Order by 。Students 結(jié)構(gòu)為:St_id var