ORACLE數(shù)據(jù)庫教程課件_第1頁
ORACLE數(shù)據(jù)庫教程課件_第2頁
ORACLE數(shù)據(jù)庫教程課件_第3頁
ORACLE數(shù)據(jù)庫教程課件_第4頁
ORACLE數(shù)據(jù)庫教程課件_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

ORACLE數(shù)據(jù)庫教程你可以不知道,但是絕對不能不懂--毀人不倦語錄2007年5月SQL基礎(chǔ)知識篇SQL-001ORACLE數(shù)據(jù)庫教程你可以不知道,但是絕對不能不懂--毀人1簡介SQL(StructuredQueryLanguage)結(jié)構(gòu)化查詢語言是IBM公司SanJose實驗室為SystemR而設(shè)計的查詢語言,后被國際標(biāo)準(zhǔn)化組織(ISO)批準(zhǔn)作為關(guān)系數(shù)據(jù)庫語言的國際標(biāo)準(zhǔn)。SQL目前遵循的是1992年標(biāo)準(zhǔn),即SQL-92。各數(shù)據(jù)庫廠家對SQL-92標(biāo)準(zhǔn)均有擴充,擴充部分不能完全保證數(shù)據(jù)庫之間的兼容性。我的熱情會灼傷一些人,但我是無心的--毀人不倦語錄簡介SQL(StructuredQueryLanguag2簡介SQL可以分為:(基礎(chǔ)篇只介紹前兩種)DML:數(shù)據(jù)操作語言(DataManipulationLanguage):select,insert,update,delete,(其他:truncate)DDL:數(shù)據(jù)定義語言(DataDefinitionLanguages):create,drop,alter,(其他:rename)DCL數(shù)據(jù)控制語言:grant、revoke、setrole事務(wù)控制:commit、rollback、savepoint(其他:locktable、setconstraint(s)、settransaction)審計控制:audit、noaudit系統(tǒng)控制:altersystem會話控制:altersession其他語句:comment(添加注釋)、explainplan、analyze、validate、call如果我的話沒有錯,一定是你聽錯了--毀人不倦語錄簡介SQL可以分為:(基礎(chǔ)篇只介紹前兩種)如果我的話沒有錯3DDL數(shù)據(jù)定義語言CREATE(建立)ALTER(修改)DROP(刪除)無知者無畏,無畏者不一定無知--毀人不倦語錄DDL數(shù)據(jù)定義語言CREATE(建立)無知者無畏,無畏者不一4語言描述約定[]:表示可選項{|}:表示選擇項CREATE:粗體表示關(guān)鍵字或必輸項Table_name:斜體表示用戶輸入項創(chuàng)建

:藍色表示說明如果1+1>2,我相信那說的是團隊的力量--毀人不倦語錄語言描述約定[]:表示可選項如果1+1>2,我相信那說5DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建用戶CREATEUSERuser_nameIDENTIFIEDBYpassword[DEFAULTTABLESPACEtablespace_name][TEMPORARYTABLESPACEtablespace_name];創(chuàng)建user_name用戶,密碼為password,使用tablespace_name表空間,如果沒有指定表空間,默認表空間為system表空間。Oracle10g有用戶默認表空間設(shè)置。建議在創(chuàng)建用戶時一定要指名表空間。先有雞,還是先有蛋,這么重要的問題還是留給雞去考證吧--毀人不倦語錄DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建用戶先有雞,還是先有蛋6DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建數(shù)據(jù)表CREATETABLEtable_name(Column1datatype[default][notnull][primarykey],[………,][constraintkey_nameprimarykey(column_list)[usingindextablespacetablespace_name]])[tablespacetablespace_name];Datatype是數(shù)據(jù)類型:varchar2(x),number(x,x),date,integer等。Notnull非空限制,如果不寫表示可為空。Primarykey主鍵,可以緊跟在字段后,或在最后使用constraint。未指名表空間,數(shù)據(jù)表建立在用戶默認的表空間中。筆只留下了痕跡,人用筆留下了文化--毀人不倦語錄DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建數(shù)據(jù)表筆只留下了痕跡,7DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建索引CREATE[UNIQUE]INDEXindex_nameONtable_name(column_list)[tablespacetablespace_name];在table_name表上按照column_list建立索引,索引名為index_name,索引保存在tablespace_name表空間中。UNIQUE:唯一性索引。--毀人不倦語錄你可以不聽,但是我一定要說DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建索引--毀人不倦語錄你8DDL數(shù)據(jù)定義語言ALTER--修改表ALTERTABLEtable_nameRENAMETOnew_table_name;將table_name表名修改為new_table_name。ALTERTABLEtable_nameADD(column1datatype[default][notnull],column2datatype[default][notnull],…..);在table_name表中增加column1,column2..字段,追加到字段最后。ALTERTABLEtable_nameMODIFY(column1datatype[default][{notnull|nullable}],column2datatype[default][{notnull|nullable}],…..修改table_name表字段屬性,長度或精度不能小于原長度或精度。ALTERTABLEtable_nameDROPCOLUMNcolumn_name;刪除table_name表中的column_name字段。ALTERTABLEtable_nameRENAMECOLUMNold_nameTOnew_name;修改table_name表的old_name字段名為new_name。ALTERTABLEtable_nameADDCONSTRAINTpk_namePRIMARYKEY(column_list);建立table_name表的主鍵,主鍵名pk_name,主鍵字段column_list。ALTERTABLEtable_nameDROPCONSTRAINTpk_name;刪除table_name表的pk_name主鍵。一個表只能有一個主鍵--毀人不倦語錄不說了,再說就該吐了。補充一點:站著進,扶著出也許是侃爺?shù)淖罡呔辰绨蒁DL數(shù)據(jù)定義語言ALTER--修改表--毀人不倦語錄不說了9DDL數(shù)據(jù)定義語言DROP--刪除DROPTABLEtable_name;刪除table_name表。DROPINDEXindex_name;刪除index_name索引。刪除主鍵(強制限制的一種),使用ALTERTABLEtable_nameDROPCONSTRAINTpk_name;--毀人不倦猜想數(shù)據(jù)庫和水庫之間不可能沒有區(qū)別DDL數(shù)據(jù)定義語言DROP--刪除--毀人不倦猜想數(shù)據(jù)庫和10DML小結(jié)從ALTER和CREATE及DROP語法數(shù)量再一次證明需求是易變的。如果增加表字段,并要求字段的排列位置,可以使用:CREATETABLEtemp_table_nameASSELECT*FROMtable_name;DROPTABLEtable_name;CREATETABLEtable_name(column…);INSERTINTOtable_nameVALUES(column_list)(SELECTcolumn_list1FROMtemp_table_name);DROPTABLEtable_name;需要注意的是,刪除表后,表中的索引也被刪除,所以,在執(zhí)行上述操作前要保留好表的索引腳本。這里沒有寫DROPDATABASE的語法,如果大家想要嘗試刪除數(shù)據(jù)庫的話,最好在專家的指導(dǎo)下進行!人間本無對錯,因為計算機才有了對與錯--毀人不倦語錄DML小結(jié)從ALTER和CREATE及DROP語法數(shù)量再一次11DDL數(shù)據(jù)操作語言SELECT(查詢)INSERT(插入)UPDATE(更新)DELETE(刪除)如果老天能再給我一次機會,我一定做甲方--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT(查詢)如果老天能再給我一次機12DDL數(shù)據(jù)操作語言SELECT--查詢SELECT[ALL|DISTINCT[ON(expression[,...])]]*|expression[ASoutput_name][,...][INTO[TEMPORARY|TEMP][TABLE]new_table][FROMfrom_item[,...]][WHEREcondition][GROUPBYexpression[,...]][HAVINGcondition[,...]][{UNION|INTERSECT|EXCEPT[ALL]}select][ORDERBYexpression[ASC|DESC|USINGoperator][,...]][FORUPDATE[OFclass_name[,...]]][LIMIT{count|ALL}[{OFFSET|,}start]]

后續(xù)查詢范例均以oracle中的SCOTT/TIGER用戶表為例如果失眠了,就看看上面的語法吧--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--查詢?nèi)绻吡耍涂纯瓷厦?3DDL數(shù)據(jù)操作語言SCOTT/TIGER表介紹DEPT部門定義表,DEPTNO是主鍵EMP職工表,EMPNO主鍵,DEPTNO外鍵關(guān)聯(lián)DEPT其他表沒有數(shù)據(jù)或沒有關(guān)系,不在這里介紹將復(fù)雜問題簡單化是修養(yǎng),將簡單問題復(fù)雜化是藝術(shù),綜合起來叫藝術(shù)修養(yǎng)--毀人不倦語錄DDL數(shù)據(jù)操作語言SCOTT/TIGER表介紹將復(fù)雜問題簡單14DDL數(shù)據(jù)操作語言SELECT--單表查詢查詢表中所有字段和所有記錄,select后跟*表示所有字段SELECT*FROMDEPT;查詢指定字段,在select后跟查詢的字段名列表,字段間用’,’隔開SELECTDEPTNO,DNAMEFROMDEPT;條件查詢,F(xiàn)ROM后面使用WHERE,在WHERE中可以使用=,<>,>,<,>=,<=,BETWEEN,LIKE,IN,返回WHERE條件為true的數(shù)據(jù)SELECT*FROMDEPTWHEREDEPTNO=20;

--返回部門編碼為20的部門數(shù)據(jù)SELECT*FROMDEPTWHEREDEPTNOBETWEEN20AND30;--返回部門編碼在20到30之間的部門數(shù)據(jù)(包括20和30)同意的從門出去,反對的請走窗戶--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--單表查詢同意的從門出去,反15DDL數(shù)據(jù)操作語言SELECT--單表查詢SELECT*FROMDEPTWHEREDNAMELIKE‘ACCOUNT%’;--返回部門名稱以ACCOUNT開始的部門數(shù)據(jù)SELECT*FROMDEPTWHEREDNAMELIKE‘%UNT%’;--返回部門名稱含UNT的部門數(shù)據(jù),%全匹配符,?單匹配符SELECT*FROMDEPTWHEREDEPTNOIN(20,30)AND(DNAMELIKE‘%UNT%’ORDNAME=‘SALES’);--返回部門編碼等于20和30并且部門名稱含UNT或等于SALES的部門數(shù)據(jù),AND與,OR或,IN和(等同OR)知識可以拷貝,思想無法復(fù)制--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--單表查詢知識可以拷貝,思想16DDL數(shù)據(jù)操作語言SELECT--多表查詢在FROM中列舉表名,WHERE中寫表關(guān)聯(lián)SELECTEMP.EMPNO,EMP.ENAME,EMP.JOB,DEPT.DEPTNO,DEPT.DNAMEFROMEMP,DEPTWHEREEMP.DEPTNO=DEPT.DEPTNOANDDEPT.DEPTNO=20;--字段名前使用表名.指定表字段,在WHERE中先寫表關(guān)聯(lián)關(guān)系,從FROM的內(nèi)側(cè)(即左側(cè))向外側(cè)寫(即右側(cè)),表關(guān)聯(lián)寫完后再寫查詢條件,不要把表管理和查詢條件混在一起寫,這雖然不是必須的,但卻是規(guī)范推薦的。SELECTE.EMPNOAS職工編碼,E.ENAME

姓名,E.JOB,D.DEPTNO,D.DNAMEFROMEMPE,DEPTDWHEREE.DEPTNO=D.DEPTNOANDD.DEPTNO=20;--字段和表名可以使用別名,方法為AS別名,或直接寫別名,表如果指定別名,原表名在該查詢中不能再被使用。淹死的都是會游泳的,累死的都是能干的--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--多表查詢淹死的都是會游泳的17DDL數(shù)據(jù)操作語言SELECT--Joins(連接)語法

{T1}[NATURAL][INNER|{LEFT|RIGHT|FULL}[OUTER]]JOIN{T2}{ONsearchcondition|USING(joincolumnlist)}一個條件JOIN必須通過提供一個(并且只能有一個)NATURAL,ON,或者USING這樣的關(guān)鍵字來聲明它的連接條件.ON子句接受一個searchcondition,它與一個WHERE子句相同.USING子句接受一個用逗號分隔的字段名列表,連接表中必須都有這些字段,并且用那些字段連接這些表。NATURAL是USING子句的縮寫,它列出兩個表中所有公共的字段名字。對于所有JOIN而言,INNER和OUTER都是可選的.INNER是缺?。甃EFT,RIGHT和FULL只用于OUTERJOIN。DDL數(shù)據(jù)操作語言SELECT--Joins(連接)18DDL數(shù)據(jù)操作語言SELECT—INNERJOIN內(nèi)連接對于T1的每行R1,連接成的表在T2里都有一行滿足與R1的連接條件。SELECTEMP.EMPNO,EMP.ENAME,EMP.JOB,DEPT.DEPTNO,DEPT.DNAMEFROMEMPJOINDEPTUSING(DEPTNO);結(jié)果同:SELECTEMP.EMPNO,EMP.ENAME,EMP.JOB,DEPT.DEPTNO,DEPT.DNAMEFROMEMP,DEPTWHEREEMP.DEPTNO=DEPT.DEPTNOINNERJOIN完全可以寫成WHERE子句重復(fù)兩遍后你就應(yīng)該把他變?yōu)槌绦?-毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT—INNERJOIN內(nèi)連接19DDL數(shù)據(jù)操作語言SELECT—OUTERJOIN外連接LEFT[OUTER]JOIN首先執(zhí)行一次INNERJOIN,然后,如果T1里有一行對任何T2的行都不滿足連接條件,那么返回一個連接行,該行的T2的字段為null。左表數(shù)據(jù)全部返回,右表無對應(yīng)數(shù)據(jù)返回NULL。Oracle也可以寫成:WHEREEMP.DEPTNO=DEPT.DEPTNO(+)RIGHT[OUTER]JOIN首先執(zhí)行一次INNERJOIN,然后,如果T2里有一行對任何T1的行都不滿足連接條件,那么返回一個連接行,該行的T1的字段為null。右表數(shù)據(jù)全部返回,左表無對應(yīng)數(shù)據(jù)返回NULL。Oracle也可以寫成:WHEREEMP.DEPTNO(+)=DEPT.DEPTNOFULL[OUTER]JOIN首先執(zhí)行一次INNERJOIN,然后,如果T1里有一行對任何T2的行都不滿足連接條件,那么返回一個連接行,該行的T1的字段為null。同樣,如果T2里有一行對任何T1的行都不滿足連接條件,那么返回一個連接行,該行的T2的字段為null。兩個表數(shù)據(jù)全部返回,相互之間沒有對應(yīng)數(shù)據(jù)返回NULL。三分技術(shù),七分管理--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT—OUTERJOIN外連接20DDL數(shù)據(jù)操作語言SELECT--DISTINCT取差異數(shù)據(jù),在SELECT查詢列表中只返回有差異的結(jié)果集。SELECT--統(tǒng)計函數(shù)

統(tǒng)計操作(AVG,COUNT,SUM,MIN,MAX)以表達式為參數(shù)。滿足WHERE子句的行均被計算,通常,一個聚集對整個SELECT語句生成一個計算結(jié)果。如果在一個查詢里面聲明了分組,那么數(shù)據(jù)庫將對每個組進行一次獨立的計算。SELECT--分組操作SQL使用GROUPBY實現(xiàn)查詢結(jié)果的分組,GROUPBY后面跟著字段列表,字段列表值均相同的記錄成為一組。分組操作伴隨聚集操作使用才有使用價值(注意:是分組伴隨聚集,而不是聚集伴隨分組)。SELECT--HAVING

在分組操作后可以跟HAVING子句,限定分組統(tǒng)計函數(shù)的查詢結(jié)果。WHERE是分組之前限定查詢結(jié)果,HAVING是對分組后的限定,即:HAVING伴隨GROUPBY子句才有意思。難道我現(xiàn)在是和上帝說話?怎么總是沒有回答!--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--DISTINCT難道我現(xiàn)在21DDL數(shù)據(jù)操作語言SELECT--范例查詢?nèi)藬?shù)和人次,KC61是中心門診報銷表,其中AAC001是個人編碼,一個人只有一個唯一的編碼,可以使用DISTINCT和聚集查詢SELECTCOUNT(*)AS人次,COUNT(DISTINCT(AAC001))AS人數(shù)FROMKC61;統(tǒng)計各部門人數(shù)、工資總額和平均工資SELECTDEPTNO,COUNT(*)AS人數(shù),SUM(SAL)AS工資總額,AVG(SAL)AS平均工資FROMEMPGROUPBYDEPTNO;如果需要顯示部門名稱,必須關(guān)聯(lián)DEPT表SELECTD.DEPTNO,D.DNAME,COUNT(*)AS人數(shù),SUM(E.SAL)AS工資總額,AVG(E.SAL)AS

平均工資FROMSCOTT.DEPTD,SCOTT.EMPEWHERED.DEPTNO=E.DEPTNOGROUPBYD.DEPTNO,D.DNAME;--非聚集字段必須在GROUPBY中列舉,如果列舉字段太多勢必影響性能,可以使用查詢子句解決此問題,有關(guān)查詢子句見后詳述。解決問題的問題,而不是問題,這是關(guān)鍵性問題--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--范例解決問題的問題,而不是22DDL數(shù)據(jù)操作語言SELECT--UNION,UNIONALL,MINUS,INTERSECT返回兩個查詢結(jié)果的集合操作,兩個查詢結(jié)果集必須字段相同。UNION和UNIONALL并集操作,UNION并集后去掉重復(fù)結(jié)果,UNIONALL直接并集MINUS差集操作INTERSECT交集操作SELECT*FROMSCOTT.DEPTUNIONSELECT*FROMSCOTT.DEPTWHEREDEPT.DEPTNO=20;--返回所有部門,因為去掉了重復(fù)的結(jié)果SELECT*FROMSCOTT.DEPTUNIONALLSELECT*FROMSCOTT.DEPTWHEREDEPT.DEPTNO=20;--返回所有部門,部門編碼為20的有兩條。工作境界:吃苦耐勞,苦中作樂,樂在其中,無苦無樂--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--UNION,UNIONA23DDL數(shù)據(jù)操作語言SELECT--ORDERBYORDERBY排序,跟數(shù)字(代表字段位置)或字段名,ASC升序,DESC降序,默認升序。SELECTDEPTNO,DNAMEFROMSCOTT.DEPTWHEREDEPTNO>10GROUPBYDEPTNO,DNAMEHAVINGCOUNT(*)>0ORDERBYDEPTNODESC;

--ORDERBY是對返回的結(jié)果進行排序,所以必須放在最后一句。SELECTDEPTNO,DNAMEFROMSCOTT.DEPTWHEREDEPTNO>10GROUPBYDEPTNO,DNAMEHAVINGCOUNT(*)>0ORDERBY1DESC;

--結(jié)果同第一個查詢,字段位置從1開始。我是來做項目的,不是來創(chuàng)造奇跡的--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--ORDERBY我是來做項24DDL數(shù)據(jù)操作語言SELECT--FORUPDATE鎖等待查詢。當(dāng)查詢結(jié)果中有被鎖定記錄時等待解鎖,當(dāng)記錄被解鎖后返回結(jié)果集,并鎖定返回的記錄。如果FORUPDATE后跟NOWAIT,遇到鎖后不等待,返回錯誤。ORACLE使用記錄級鎖定,當(dāng)事物被提交或回滾后鎖定被釋放。死鎖問題當(dāng)兩個事物以不同的順序同時更新多個表時就會發(fā)生死鎖(對牛),解決死鎖的途徑是手工殺掉死鎖的進程或者重新啟動數(shù)據(jù)庫。因此,在使用事物更新多表數(shù)據(jù)時一定要小心,使用面向?qū)ο蟮姆椒ǚ庋b數(shù)據(jù)操作可以在很大程度上解決死鎖問題。沒有經(jīng)過嚴(yán)格測試的軟件開發(fā)進度報告不看也罷--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--FORUPDATE沒有經(jīng)25DDL數(shù)據(jù)操作語言SELECT--子查詢查詢語句可以嵌套,任何產(chǎn)生數(shù)值的地方都可以使用子查詢。在查詢條件中使用子查詢時,當(dāng)子查詢返回多個結(jié)果時只能使用IN。查詢順序是先執(zhí)行被依賴的底層查詢,然后一層層向上查。子查詢只被執(zhí)行一次。查詢平均工資最低的部門情況SELECTDEPTNO,AVG(SAL)FROMSCOTT.EMPGROUPBYDEPTNOHAVINGAVG(SAL)=(SELECTMIN(AVG(SAL))FROMSCOTT.EMPGROUPBYDEPTNO);--子查詢先查詢出最低的部門平均工資,然后查詢部門最低平均工資等于子查詢工資的部門就是喜歡編程也不能為了編程而放棄和用戶的功能確認,如果你把用戶對程序的任意修改提升為對你自身價值的否定,你還不先確認嗎?--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--子查詢就是喜歡編程也不能為26DDL數(shù)據(jù)操作語言SELECT--子查詢在FROM中使用子查詢,子查詢在這里相對與VIEWSELECTD.DEPTNO,D.DNAME,S.AVG_SAL,S.SUM_SAL,S.NUMFROMSCOTT.DEPTD,(SELECTDEPTNO,AVG(SAL)ASAVG_SAL,SUM(SAL)ASSUM_SAL,COUNT(*)ASNUMFROMSCOTT.EMPGROUPBYDEPTNO)SWHERED.DEPTNO=S.DEPTNO;在WHERE中使用子查詢,例子不好,應(yīng)該直接寫表關(guān)聯(lián),這里只是為了說明語法。SELECT*FROMSCOTT.EMPWHEREDEPTNOIN(SELECTDEPTNOFROMSCOTT.DEPTWHEREDEPTNO=20);驢怎么了?人家采用的可是軟件工程中的螺旋法則--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--子查詢驢怎么了?人家采用的27DDL數(shù)據(jù)操作語言SELECT--子查詢使用EXISTS(NOTEXISTS)替換IN(NOTIN)IN(NOTIN)在執(zhí)行數(shù)據(jù)庫操作時性能非常低下,應(yīng)該使用EXISTS(NOTEXISTS)替換,特別是NOTIN子句將執(zhí)行一個內(nèi)部的排序和合并;EXISTS子查詢使用主表的字段限制查詢數(shù)據(jù)SELECT*FROMSCOTT.EMPE

WHEREEXISTS(SELECT*FROMSCOTT.DEPTWHEREDEPT.DEPTNO=E.DEPTNOANDDEPTNO=20);--因為EXISTS可以看到外表,所以,如果表名重復(fù),使用表別名區(qū)分,在子查詢中一定寫清楚和外表的關(guān)聯(lián)關(guān)系,另外,子查詢寫SELECT*是對的,不用寫字段名。多做一點,早知道一點--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--子查詢多做一點,早知道一點28DDL數(shù)據(jù)操作語言UPDATE—修改用來更新數(shù)據(jù)表中的數(shù)據(jù)

UPDATEtable_name

SETcolumn_name=new_value[,…]

WHEREcondition;更新DEPT表,將20號部門名稱修改為’銷售部’,地址修改為’北京’UPDATEDEPT

SETDNAME='銷售部',

LOC='北京'

WHEREDEPTNO=20;子查詢也可在UPDATE中使用,將職工領(lǐng)導(dǎo)是KING的人員薪資增加100元UPDATESCOTT.EMPSETSAL=SAL+100WHEREEMPNOIN(SELECTE.EMPNOFROMSCOTT.EMPE,SCOTT.EMPGWHEREE.MGR=G.EMPNOANDG.ENAME='KING');UPDATESCOTT.EMP

SETSAL=SAL+100

WHEREEXISTS(SELECT*FROMSCOTT.EMPE,SCOTT.EMPG

WHEREE.MGR=G.EMPNO

ANDE.EMPNO=EMP.EMPNO

ANDG.ENAME='KING');

金保工程是“陽光工程”,所以我才陽光--毀人不倦語錄DDL數(shù)據(jù)操作語言UPDATE—修改金保工程是“陽光工程”,29DDL數(shù)據(jù)操作語言INSERT--插入語法:INSERTINTOtable_name[(column[,...])]{VALUES(expression[,…])|SELECTquery}當(dāng)表字段和插入值相同時,可以省略字段列表INSERTINTOSCOTT.BONUSVALUES('TURNER','SALESMAN',200,40);當(dāng)只插入部分字段時,必須列舉字段,未賦值字段使用默認值或為空INSERTINTOSCOTT.BONUS(ENAME,JOB,SAL)VALUES('CLARK','MANAGER',100);也可以使用查詢給表插入數(shù)據(jù)INSERTINTOSCOTT.BONUS(ENAME,JOB,SAL)SELECTENAME,JOB,SALFROMSCOTT.EMPWHEREMGR=7698;

理論上都是問題,做起來沒有問題--毀人不倦語錄DDL數(shù)據(jù)操作語言INSERT--插入理論上都是問題,做起來30DDL數(shù)據(jù)操作語言DELETE--刪除語法:DELETEFROMtable_nameWHEREcondition;刪除BONUS中ENAME為‘CLARK’的記錄DELETEFROMSCOTT.BONUSWHEREENAME='CLARK'刪除重復(fù)記錄,ROWID是記錄的物理位置,一經(jīng)確定永不改變DELETEFROMSCOTT.BONUSBWHEREROWID<(SELECTMAX(ROWID)FROMSCOTT.BONUSWHEREBONUS.ENAME=B.ENAMEGROUPBYENAMEHAVINGCOUNT(*)>1);--刪除ENAME重復(fù)記錄自己先擦塊玻璃再交代給別人擦,安排工作同理--毀人不倦語錄DDL數(shù)據(jù)操作語言DELETE--刪除自己先擦塊玻璃再交代給31序列號創(chuàng)建CREATESEQUENCEname[INCREMENTBYn][STARTWITHn][{MAXVALUEn|NOMAXVALUE}][{MINVALUEn|NOMINVALUE}][{CYCLE|NOCYCLE}][{CACHEn|NOCACHE}];說明:INCREMENTBYn一次增長n個數(shù)字STARTWITHn初始值NOMAXVALUE缺省值10E+27NOMINVALUE缺省值1NOCYCLE不循環(huán),常用于唯一關(guān)鍵字CACHEn在內(nèi)存里緩存n個序列,出錯回退時會丟失創(chuàng)建從1開始,不緩存的EMP_EMPNO序列。CREATESEQUENCEEMP_EMPNOSTARTWITH1NOCACHE;修改ALTERSEQUENCEname[INCREMENTBYn][{MAXVALUEn|NOMAXVALUE}][{MINVALUEn|NOMINVALUE}][{CYCLE|NOCYCLE}][{CACHEn|NOCACHE}];--起始值不能改變,如果要改變序列的起始值,先刪除,再新建。刪除DROPSEQUENCEname;DROPSEQUENCEEMP_EMPNO;序列號創(chuàng)建32序列號使用NEXTVAL下一個序列號值CURRVAL當(dāng)前序列號值如果EMP_EMPNO是一個序列號,可以用下面SQL取序列值--去序列的當(dāng)前值SELECTEMP_EMPNO.CURRVALFROMDUAL;--去序列的下一個值SELECTEMP_EMPNO.NEXTVALFROMDUAL;--使用序列插入數(shù)據(jù)INSERTINTOEMP(EMPNO,ENAME,…)VALUES(EMP_EMPNO.NEXTVAL,‘JONE’,…);不能用序列號的nextval和currval的地方視圖查詢、distinct查詢、有g(shù)roupby,having,orderby的查詢、有子查詢的查詢、表里的缺省值序列號使用33注釋/*注釋內(nèi)容*/--注釋內(nèi)容--SELECT*DELETEFROMEMPWHEREDEPTNO=20;提示:刪除數(shù)據(jù)前最好先查詢一下??梢韵葘慡ELECT*,然后把SELECT*注釋掉,增加DELETE。如果再想不出來就去上廁所--毀人不倦語錄注釋/*注釋內(nèi)容*/如果再想不出來就去上廁所--毀人不34常用函數(shù)數(shù)字函數(shù)ABS取絕對值POWER乘方LN10為底數(shù)取冪SQRT平方根EXPe的n次乘方LOG(m,n)m為底數(shù)n取冪數(shù)學(xué)運算函數(shù):ACOSATANATAN2COSCOSHSIGNSINSINHTANTANHCEIL大于或等于取整數(shù)FLOOR小于或等于取整數(shù)MOD取余數(shù)ROUND(n,m)按m的位數(shù)取四舍五入值如果round(日期):中午12以后將是明天的日期.round(sysdate,'Y')是年的第一天TRUNC(n,m)按m的位數(shù)取前面的數(shù)值如果trunc(日期),確省的是去掉時間沖鋒號響起后執(zhí)行的是命令而不是計劃--毀人不倦語錄常用函數(shù)數(shù)字函數(shù)沖鋒號響起后執(zhí)行的是命令而不是計劃--毀人不35常用函數(shù)字符函數(shù)CHR按數(shù)據(jù)庫的字符集由數(shù)字返回字符CONCAT(c1,c2)把兩個字符c1,c2組合成一個字符,和||相同REPLACE(c,s,r)把字符c里出現(xiàn)s的字符替換成r,返回新字符SUBSTR(c,m,n)m大于0,字符c從前面m處開始取n位字符,m等于0和1一樣,m小與0,字符c從后面m處開始取n位字符TRANSLATE(c,f1,t1)字符c按f1到t1的規(guī)則轉(zhuǎn)換成新的字符串INITCAP字符首字母大寫,其它字符小寫LOWER字符全部小寫UPPER字符全部大寫LTRIM(c1,c2)去掉字符c1左邊出現(xiàn)的字符c2RTRIM(c1,c2)去掉字符c1右邊出現(xiàn)的字符c2TRIM(c1,c2)去掉字符c1左右兩邊的字符c2LPAD(c1,n,c2)字符c1按指定的位數(shù)n顯示,不足的位數(shù)用c2字符串替換左邊的空位RPAD(c1,n,c2)字符c1按指定的位數(shù)n顯示,不足的位數(shù)用c2字符串替換右邊的空位提示:去掉字符串中間的空格可以使用replace如果有三條路供你選擇,不要選中間的,剩下兩條可以扔硬幣決定--毀人不倦語錄常用函數(shù)字符函數(shù)如果有三條路供你選擇,不要選中間的,剩下兩條36常用函數(shù)日期函數(shù)ADD_MONTHS(d,n)日期值加n月LAST_DAY(d)返回當(dāng)月的最后一天的日期MONTHS_BETWEEN(d1,d2)兩個日期值間的月份NEXT_DAY(d)返回日期值下一天的日期SYSDATE當(dāng)前的系統(tǒng)時間DUAL是SYS用戶下一個空表,它只有一個字段dummy提示:dual可以理解為虛表,多在查詢系統(tǒng)函數(shù)返回值時使用,以滿足SELECT語法規(guī)則,如selectsysdatefromdual;select3+4fromdual;零也是錢--毀人不倦語錄常用函數(shù)日期函數(shù)零也是錢--毀人不倦語錄37常用函數(shù)轉(zhuǎn)換函數(shù)TO_CHAR(date,'日期顯示格式')TO_CHAR(number)用于顯示或報表的格式對齊TO_DATE(char,'日期顯示格式')TO_LOB把long字段轉(zhuǎn)換成lob字段TO_NUMBER(char)用于計算或者比較大小日期顯示格式年:YYYY,YEAR,YY季:Q月:MM,MONTH,MON日:DD,DAY,DY時:HH24,HH12,HH(12小時)分:MI秒:SS還差最后一點--毀人不倦語錄常用函數(shù)轉(zhuǎn)換函數(shù)還差最后一點--毀人不倦語錄38常用函數(shù)邏輯比較函數(shù)NVL(EXPR1,EXPR2)當(dāng)EXPR1為空用EXPR2替代DECODE(EXPR﹐V1﹐R1﹐V2﹐R2....)當(dāng)EXPR=V1時返回R1當(dāng)EXPR=V2是放回V2…EXPR后條件和返回值成對出現(xiàn),最后一個單值是不在條件中的返回值,如果沒有單值,不滿足條件的返回NULL。SELECTENAME,DECODE(JOB,'MANAGER','經(jīng)理','PRESIDENT','總裁','SALESMAN','銷售','不詳')FROMSCOTT.EMP;CASEWHENconditionTHENexpress1ELSEexpress2END當(dāng)condition成立返回express1否則返回express2SELECTENAME,HIREDATE,(CASEWHENTO_NUMBER(TO_CHAR(HIREDATE,'MM'))>6THEN'下半年'ELSE'上半年'END)AS入職時間FROMSCOTT.EMP;--TO_CHAR(HIREDATE,'MM')取時間月份寫SQL時小心一點,別讓硬盤飛出來傷到你--毀人不倦語錄常用函數(shù)邏輯比較函數(shù)寫SQL時小心一點,別讓硬盤飛出來傷到你39ORACLE數(shù)據(jù)庫教程你可以不知道,但是絕對不能不懂--毀人不倦語錄2007年5月SQL基礎(chǔ)知識篇SQL-001ORACLE數(shù)據(jù)庫教程你可以不知道,但是絕對不能不懂--毀人40簡介SQL(StructuredQueryLanguage)結(jié)構(gòu)化查詢語言是IBM公司SanJose實驗室為SystemR而設(shè)計的查詢語言,后被國際標(biāo)準(zhǔn)化組織(ISO)批準(zhǔn)作為關(guān)系數(shù)據(jù)庫語言的國際標(biāo)準(zhǔn)。SQL目前遵循的是1992年標(biāo)準(zhǔn),即SQL-92。各數(shù)據(jù)庫廠家對SQL-92標(biāo)準(zhǔn)均有擴充,擴充部分不能完全保證數(shù)據(jù)庫之間的兼容性。我的熱情會灼傷一些人,但我是無心的--毀人不倦語錄簡介SQL(StructuredQueryLanguag41簡介SQL可以分為:(基礎(chǔ)篇只介紹前兩種)DML:數(shù)據(jù)操作語言(DataManipulationLanguage):select,insert,update,delete,(其他:truncate)DDL:數(shù)據(jù)定義語言(DataDefinitionLanguages):create,drop,alter,(其他:rename)DCL數(shù)據(jù)控制語言:grant、revoke、setrole事務(wù)控制:commit、rollback、savepoint(其他:locktable、setconstraint(s)、settransaction)審計控制:audit、noaudit系統(tǒng)控制:altersystem會話控制:altersession其他語句:comment(添加注釋)、explainplan、analyze、validate、call如果我的話沒有錯,一定是你聽錯了--毀人不倦語錄簡介SQL可以分為:(基礎(chǔ)篇只介紹前兩種)如果我的話沒有錯42DDL數(shù)據(jù)定義語言CREATE(建立)ALTER(修改)DROP(刪除)無知者無畏,無畏者不一定無知--毀人不倦語錄DDL數(shù)據(jù)定義語言CREATE(建立)無知者無畏,無畏者不一43語言描述約定[]:表示可選項{|}:表示選擇項CREATE:粗體表示關(guān)鍵字或必輸項Table_name:斜體表示用戶輸入項創(chuàng)建

:藍色表示說明如果1+1>2,我相信那說的是團隊的力量--毀人不倦語錄語言描述約定[]:表示可選項如果1+1>2,我相信那說44DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建用戶CREATEUSERuser_nameIDENTIFIEDBYpassword[DEFAULTTABLESPACEtablespace_name][TEMPORARYTABLESPACEtablespace_name];創(chuàng)建user_name用戶,密碼為password,使用tablespace_name表空間,如果沒有指定表空間,默認表空間為system表空間。Oracle10g有用戶默認表空間設(shè)置。建議在創(chuàng)建用戶時一定要指名表空間。先有雞,還是先有蛋,這么重要的問題還是留給雞去考證吧--毀人不倦語錄DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建用戶先有雞,還是先有蛋45DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建數(shù)據(jù)表CREATETABLEtable_name(Column1datatype[default][notnull][primarykey],[………,][constraintkey_nameprimarykey(column_list)[usingindextablespacetablespace_name]])[tablespacetablespace_name];Datatype是數(shù)據(jù)類型:varchar2(x),number(x,x),date,integer等。Notnull非空限制,如果不寫表示可為空。Primarykey主鍵,可以緊跟在字段后,或在最后使用constraint。未指名表空間,數(shù)據(jù)表建立在用戶默認的表空間中。筆只留下了痕跡,人用筆留下了文化--毀人不倦語錄DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建數(shù)據(jù)表筆只留下了痕跡,46DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建索引CREATE[UNIQUE]INDEXindex_nameONtable_name(column_list)[tablespacetablespace_name];在table_name表上按照column_list建立索引,索引名為index_name,索引保存在tablespace_name表空間中。UNIQUE:唯一性索引。--毀人不倦語錄你可以不聽,但是我一定要說DDL數(shù)據(jù)定義語言CREATE--創(chuàng)建索引--毀人不倦語錄你47DDL數(shù)據(jù)定義語言ALTER--修改表ALTERTABLEtable_nameRENAMETOnew_table_name;將table_name表名修改為new_table_name。ALTERTABLEtable_nameADD(column1datatype[default][notnull],column2datatype[default][notnull],…..);在table_name表中增加column1,column2..字段,追加到字段最后。ALTERTABLEtable_nameMODIFY(column1datatype[default][{notnull|nullable}],column2datatype[default][{notnull|nullable}],…..修改table_name表字段屬性,長度或精度不能小于原長度或精度。ALTERTABLEtable_nameDROPCOLUMNcolumn_name;刪除table_name表中的column_name字段。ALTERTABLEtable_nameRENAMECOLUMNold_nameTOnew_name;修改table_name表的old_name字段名為new_name。ALTERTABLEtable_nameADDCONSTRAINTpk_namePRIMARYKEY(column_list);建立table_name表的主鍵,主鍵名pk_name,主鍵字段column_list。ALTERTABLEtable_nameDROPCONSTRAINTpk_name;刪除table_name表的pk_name主鍵。一個表只能有一個主鍵--毀人不倦語錄不說了,再說就該吐了。補充一點:站著進,扶著出也許是侃爺?shù)淖罡呔辰绨蒁DL數(shù)據(jù)定義語言ALTER--修改表--毀人不倦語錄不說了48DDL數(shù)據(jù)定義語言DROP--刪除DROPTABLEtable_name;刪除table_name表。DROPINDEXindex_name;刪除index_name索引。刪除主鍵(強制限制的一種),使用ALTERTABLEtable_nameDROPCONSTRAINTpk_name;--毀人不倦猜想數(shù)據(jù)庫和水庫之間不可能沒有區(qū)別DDL數(shù)據(jù)定義語言DROP--刪除--毀人不倦猜想數(shù)據(jù)庫和49DML小結(jié)從ALTER和CREATE及DROP語法數(shù)量再一次證明需求是易變的。如果增加表字段,并要求字段的排列位置,可以使用:CREATETABLEtemp_table_nameASSELECT*FROMtable_name;DROPTABLEtable_name;CREATETABLEtable_name(column…);INSERTINTOtable_nameVALUES(column_list)(SELECTcolumn_list1FROMtemp_table_name);DROPTABLEtable_name;需要注意的是,刪除表后,表中的索引也被刪除,所以,在執(zhí)行上述操作前要保留好表的索引腳本。這里沒有寫DROPDATABASE的語法,如果大家想要嘗試刪除數(shù)據(jù)庫的話,最好在專家的指導(dǎo)下進行!人間本無對錯,因為計算機才有了對與錯--毀人不倦語錄DML小結(jié)從ALTER和CREATE及DROP語法數(shù)量再一次50DDL數(shù)據(jù)操作語言SELECT(查詢)INSERT(插入)UPDATE(更新)DELETE(刪除)如果老天能再給我一次機會,我一定做甲方--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT(查詢)如果老天能再給我一次機51DDL數(shù)據(jù)操作語言SELECT--查詢SELECT[ALL|DISTINCT[ON(expression[,...])]]*|expression[ASoutput_name][,...][INTO[TEMPORARY|TEMP][TABLE]new_table][FROMfrom_item[,...]][WHEREcondition][GROUPBYexpression[,...]][HAVINGcondition[,...]][{UNION|INTERSECT|EXCEPT[ALL]}select][ORDERBYexpression[ASC|DESC|USINGoperator][,...]][FORUPDATE[OFclass_name[,...]]][LIMIT{count|ALL}[{OFFSET|,}start]]

后續(xù)查詢范例均以oracle中的SCOTT/TIGER用戶表為例如果失眠了,就看看上面的語法吧--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--查詢?nèi)绻吡耍涂纯瓷厦?2DDL數(shù)據(jù)操作語言SCOTT/TIGER表介紹DEPT部門定義表,DEPTNO是主鍵EMP職工表,EMPNO主鍵,DEPTNO外鍵關(guān)聯(lián)DEPT其他表沒有數(shù)據(jù)或沒有關(guān)系,不在這里介紹將復(fù)雜問題簡單化是修養(yǎng),將簡單問題復(fù)雜化是藝術(shù),綜合起來叫藝術(shù)修養(yǎng)--毀人不倦語錄DDL數(shù)據(jù)操作語言SCOTT/TIGER表介紹將復(fù)雜問題簡單53DDL數(shù)據(jù)操作語言SELECT--單表查詢查詢表中所有字段和所有記錄,select后跟*表示所有字段SELECT*FROMDEPT;查詢指定字段,在select后跟查詢的字段名列表,字段間用’,’隔開SELECTDEPTNO,DNAMEFROMDEPT;條件查詢,F(xiàn)ROM后面使用WHERE,在WHERE中可以使用=,<>,>,<,>=,<=,BETWEEN,LIKE,IN,返回WHERE條件為true的數(shù)據(jù)SELECT*FROMDEPTWHEREDEPTNO=20;

--返回部門編碼為20的部門數(shù)據(jù)SELECT*FROMDEPTWHEREDEPTNOBETWEEN20AND30;--返回部門編碼在20到30之間的部門數(shù)據(jù)(包括20和30)同意的從門出去,反對的請走窗戶--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--單表查詢同意的從門出去,反54DDL數(shù)據(jù)操作語言SELECT--單表查詢SELECT*FROMDEPTWHEREDNAMELIKE‘ACCOUNT%’;--返回部門名稱以ACCOUNT開始的部門數(shù)據(jù)SELECT*FROMDEPTWHEREDNAMELIKE‘%UNT%’;--返回部門名稱含UNT的部門數(shù)據(jù),%全匹配符,?單匹配符SELECT*FROMDEPTWHEREDEPTNOIN(20,30)AND(DNAMELIKE‘%UNT%’ORDNAME=‘SALES’);--返回部門編碼等于20和30并且部門名稱含UNT或等于SALES的部門數(shù)據(jù),AND與,OR或,IN和(等同OR)知識可以拷貝,思想無法復(fù)制--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--單表查詢知識可以拷貝,思想55DDL數(shù)據(jù)操作語言SELECT--多表查詢在FROM中列舉表名,WHERE中寫表關(guān)聯(lián)SELECTEMP.EMPNO,EMP.ENAME,EMP.JOB,DEPT.DEPTNO,DEPT.DNAMEFROMEMP,DEPTWHEREEMP.DEPTNO=DEPT.DEPTNOANDDEPT.DEPTNO=20;--字段名前使用表名.指定表字段,在WHERE中先寫表關(guān)聯(lián)關(guān)系,從FROM的內(nèi)側(cè)(即左側(cè))向外側(cè)寫(即右側(cè)),表關(guān)聯(lián)寫完后再寫查詢條件,不要把表管理和查詢條件混在一起寫,這雖然不是必須的,但卻是規(guī)范推薦的。SELECTE.EMPNOAS職工編碼,E.ENAME

姓名,E.JOB,D.DEPTNO,D.DNAMEFROMEMPE,DEPTDWHEREE.DEPTNO=D.DEPTNOANDD.DEPTNO=20;--字段和表名可以使用別名,方法為AS別名,或直接寫別名,表如果指定別名,原表名在該查詢中不能再被使用。淹死的都是會游泳的,累死的都是能干的--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--多表查詢淹死的都是會游泳的56DDL數(shù)據(jù)操作語言SELECT--Joins(連接)語法

{T1}[NATURAL][INNER|{LEFT|RIGHT|FULL}[OUTER]]JOIN{T2}{ONsearchcondition|USING(joincolumnlist)}一個條件JOIN必須通過提供一個(并且只能有一個)NATURAL,ON,或者USING這樣的關(guān)鍵字來聲明它的連接條件.ON子句接受一個searchcondition,它與一個WHERE子句相同.USING子句接受一個用逗號分隔的字段名列表,連接表中必須都有這些字段,并且用那些字段連接這些表。NATURAL是USING子句的縮寫,它列出兩個表中所有公共的字段名字。對于所有JOIN而言,INNER和OUTER都是可選的.INNER是缺省.LEFT,RIGHT和FULL只用于OUTERJOIN。DDL數(shù)據(jù)操作語言SELECT--Joins(連接)57DDL數(shù)據(jù)操作語言SELECT—INNERJOIN內(nèi)連接對于T1的每行R1,連接成的表在T2里都有一行滿足與R1的連接條件。SELECTEMP.EMPNO,EMP.ENAME,EMP.JOB,DEPT.DEPTNO,DEPT.DNAMEFROMEMPJOINDEPTUSING(DEPTNO);結(jié)果同:SELECTEMP.EMPNO,EMP.ENAME,EMP.JOB,DEPT.DEPTNO,DEPT.DNAMEFROMEMP,DEPTWHEREEMP.DEPTNO=DEPT.DEPTNOINNERJOIN完全可以寫成WHERE子句重復(fù)兩遍后你就應(yīng)該把他變?yōu)槌绦?-毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT—INNERJOIN內(nèi)連接58DDL數(shù)據(jù)操作語言SELECT—OUTERJOIN外連接LEFT[OUTER]JOIN首先執(zhí)行一次INNERJOIN,然后,如果T1里有一行對任何T2的行都不滿足連接條件,那么返回一個連接行,該行的T2的字段為null。左表數(shù)據(jù)全部返回,右表無對應(yīng)數(shù)據(jù)返回NULL。Oracle也可以寫成:WHEREEMP.DEPTNO=DEPT.DEPTNO(+)RIGHT[OUTER]JOIN首先執(zhí)行一次INNERJOIN,然后,如果T2里有一行對任何T1的行都不滿足連接條件,那么返回一個連接行,該行的T1的字段為null。右表數(shù)據(jù)全部返回,左表無對應(yīng)數(shù)據(jù)返回NULL。Oracle也可以寫成:WHEREEMP.DEPTNO(+)=DEPT.DEPTNOFULL[OUTER]JOIN首先執(zhí)行一次INNERJOIN,然后,如果T1里有一行對任何T2的行都不滿足連接條件,那么返回一個連接行,該行的T1的字段為null。同樣,如果T2里有一行對任何T1的行都不滿足連接條件,那么返回一個連接行,該行的T2的字段為null。兩個表數(shù)據(jù)全部返回,相互之間沒有對應(yīng)數(shù)據(jù)返回NULL。三分技術(shù),七分管理--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT—OUTERJOIN外連接59DDL數(shù)據(jù)操作語言SELECT--DISTINCT取差異數(shù)據(jù),在SELECT查詢列表中只返回有差異的結(jié)果集。SELECT--統(tǒng)計函數(shù)

統(tǒng)計操作(AVG,COUNT,SUM,MIN,MAX)以表達式為參數(shù)。滿足WHERE子句的行均被計算,通常,一個聚集對整個SELECT語句生成一個計算結(jié)果。如果在一個查詢里面聲明了分組,那么數(shù)據(jù)庫將對每個組進行一次獨立的計算。SELECT--分組操作SQL使用GROUPBY實現(xiàn)查詢結(jié)果的分組,GROUPBY后面跟著字段列表,字段列表值均相同的記錄成為一組。分組操作伴隨聚集操作使用才有使用價值(注意:是分組伴隨聚集,而不是聚集伴隨分組)。SELECT--HAVING

在分組操作后可以跟HAVING子句,限定分組統(tǒng)計函數(shù)的查詢結(jié)果。WHERE是分組之前限定查詢結(jié)果,HAVING是對分組后的限定,即:HAVING伴隨GROUPBY子句才有意思。難道我現(xiàn)在是和上帝說話?怎么總是沒有回答!--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--DISTINCT難道我現(xiàn)在60DDL數(shù)據(jù)操作語言SELECT--范例查詢?nèi)藬?shù)和人次,KC61是中心門診報銷表,其中AAC001是個人編碼,一個人只有一個唯一的編碼,可以使用DISTINCT和聚集查詢SELECTCOUNT(*)AS人次,COUNT(DISTINCT(AAC001))AS人數(shù)FROMKC61;統(tǒng)計各部門人數(shù)、工資總額和平均工資SELECTDEPTNO,COUNT(*)AS人數(shù),SUM(SAL)AS工資總額,AVG(SAL)AS平均工資FROMEMPGROUPBYDEPTNO;如果需要顯示部門名稱,必須關(guān)聯(lián)DEPT表SELECTD.DEPTNO,D.DNAME,COUNT(*)AS人數(shù),SUM(E.SAL)AS工資總額,AVG(E.SAL)AS

平均工資FROMSCOTT.DEPTD,SCOTT.EMPEWHERED.DEPTNO=E.DEPTNOGROUPBYD.DEPTNO,D.DNAME;--非聚集字段必須在GROUPBY中列舉,如果列舉字段太多勢必影響性能,可以使用查詢子句解決此問題,有關(guān)查詢子句見后詳述。解決問題的問題,而不是問題,這是關(guān)鍵性問題--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--范例解決問題的問題,而不是61DDL數(shù)據(jù)操作語言SELECT--UNION,UNIONALL,MINUS,INTERSECT返回兩個查詢結(jié)果的集合操作,兩個查詢結(jié)果集必須字段相同。UNION和UNIONALL并集操作,UNION并集后去掉重復(fù)結(jié)果,UNIONALL直接并集MINUS差集操作INTERSECT交集操作SELECT*FROMSCOTT.DEPTUNIONSELECT*FROMSCOTT.DEPTWHEREDEPT.DEPTNO=20;--返回所有部門,因為去掉了重復(fù)的結(jié)果SELECT*FROMSCOTT.DEPTUNIONALLSELECT*FROMSCOTT.DEPTWHEREDEPT.DEPTNO=20;--返回所有部門,部門編碼為20的有兩條。工作境界:吃苦耐勞,苦中作樂,樂在其中,無苦無樂--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--UNION,UNIONA62DDL數(shù)據(jù)操作語言SELECT--ORDERBYORDERBY排序,跟數(shù)字(代表字段位置)或字段名,ASC升序,DESC降序,默認升序。SELECTDEPTNO,DNAMEFROMSCOTT.DEPTWHEREDEPTNO>10GROUPBYDEPTNO,DNAMEHAVINGCOUNT(*)>0ORDERBYDEPTNODESC;

--ORDERBY是對返回的結(jié)果進行排序,所以必須放在最后一句。SELECTDEPTNO,DNAMEFROMSCOTT.DEPTWHEREDEPTNO>10GROUPBYDEPTNO,DNAMEHAVINGCOUNT(*)>0ORDERBY1DESC;

--結(jié)果同第一個查詢,字段位置從1開始。我是來做項目的,不是來創(chuàng)造奇跡的--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--ORDERBY我是來做項63DDL數(shù)據(jù)操作語言SELECT--FORUPDATE鎖等待查詢。當(dāng)查詢結(jié)果中有被鎖定記錄時等待解鎖,當(dāng)記錄被解鎖后返回結(jié)果集,并鎖定返回的記錄。如果FORUPDATE后跟NOWAIT,遇到鎖后不等待,返回錯誤。ORACLE使用記錄級鎖定,當(dāng)事物被提交或回滾后鎖定被釋放。死鎖問題當(dāng)兩個事物以不同的順序同時更新多個表時就會發(fā)生死鎖(對牛),解決死鎖的途徑是手工殺掉死鎖的進程或者重新啟動數(shù)據(jù)庫。因此,在使用事物更新多表數(shù)據(jù)時一定要小心,使用面向?qū)ο蟮姆椒ǚ庋b數(shù)據(jù)操作可以在很大程度上解決死鎖問題。沒有經(jīng)過嚴(yán)格測試的軟件開發(fā)進度報告不看也罷--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--FORUPDATE沒有經(jīng)64DDL數(shù)據(jù)操作語言SELECT--子查詢查詢語句可以嵌套,任何產(chǎn)生數(shù)值的地方都可以使用子查詢。在查詢條件中使用子查詢時,當(dāng)子查詢返回多個結(jié)果時只能使用IN。查詢順序是先執(zhí)行被依賴的底層查詢,然后一層層向上查。子查詢只被執(zhí)行一次。查詢平均工資最低的部門情況SELECTDEPTNO,AVG(SAL)FROMSCOTT.EMPGROUPBYDEPTNOHAVINGAVG(SAL)=(SELECTMIN(AVG(SAL))FROMSCOTT.EMPGROUPBYDEPTNO);--子查詢先查詢出最低的部門平均工資,然后查詢部門最低平均工資等于子查詢工資的部門就是喜歡編程也不能為了編程而放棄和用戶的功能確認,如果你把用戶對程序的任意修改提升為對你自身價值的否定,你還不先確認嗎?--毀人不倦語錄DDL數(shù)據(jù)操作語言SELECT--子查詢就是喜歡編程也不能為65DDL數(shù)據(jù)操作語言SELECT--子查詢在FROM中使用子查詢,子查詢在這里相對與VIEWSELECTD.DEPTNO,D.DNAME,S.AVG_SAL,S.SUM_SAL,S.NUMFROMSCOTT.DEPTD,(SELECTDEPTNO,AVG(SAL)ASAVG_SAL,SUM(SAL)ASSUM_SAL,COUNT(*)ASNUMFROMSCOTT.EMPGROUPBYDEPTNO)SWHERED.DEPTNO=S.DEPTNO;在WHERE中使用子查詢

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論