




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七節(jié)高級(jí)SQL語(yǔ)句
?通過(guò)本節(jié)學(xué)習(xí),你需要掌握:
?組運(yùn)算
?高級(jí)分組子句:ROLLUP、CUBE、
GROUPINGSETS
?高級(jí)子查詢:關(guān)聯(lián)子查詢、EXISTS運(yùn)
算、WITH子句
?高級(jí)DML語(yǔ)句
09:04:36廈門大學(xué)計(jì)算機(jī)系工程碩士教材1
第七節(jié)高級(jí)SQL語(yǔ)句
?組運(yùn)算
?高級(jí)分組子句:ROLLUP、CUBE、
GROUPINGSETS
?高級(jí)子查詢:關(guān)聯(lián)子查詢、EXISTS運(yùn)算、
WITH子句
?高級(jí)DML語(yǔ)句
09:04:36廈門大學(xué)計(jì)算機(jī)系工程碩士教材2
TheSETOperators
UNION/UNIONALL
INTERSECT
■
■
MINUS
UNION運(yùn)算
TheUNIONSETOperator
TheUNIONoperatorreturnsresultsfrombothqueries
aftereliminatingduplications.
⑥展現(xiàn)所有員工當(dāng)前和歷史工作的詳細(xì)資料。
SELECTemployeejd,jobjd
FROMemployees
UNION
SELECTemployeejd,jobjd
FROMjob_history;
SELECTemployeejd,jobjd,departmentjd
FROMemployees
UNION
SELECTemployeejd,jobjd,departmentjd
FROMjob_history;
EMPLOYEEIDJOB」DDEIMRTMEN幾眼
■■■
200(AC_ACCOUNT90
200AD.ASST
200ADA?
UNIONALL運(yùn)算
TheUNIONALLOperator
AB
TheUNIONALLoperatorreturnsresultsfromboth
queriesincludingallduplications.
SELECTemployeejd,jobjd,departmentjd
FROMemployees
UNIONALL
SELECTemployeeJd,jobjd;departmentjd
FROMjob_historyORDERBY子句
id;必須放在最后寫
EMPLOYEEJDJOBJDDEPARTMENTJD
■■■
176SA_REP80
176SA_MAN80
176SA_REPJggg
INTERSECT運(yùn)算
TheINTERSECTOp|erator
B
TheINTERSECToperatorreturnsresultsthatare
commontobothqueries.aS
令展現(xiàn)現(xiàn)任工作與歷史工作相同的員工號(hào)和
工作。
SELECTemployeejd,jobjd
FROMemployees
INTERSECT
SELECTemployeejd,jobjd
FROMjob_history;
EMPLOYEEJDJOBJD
176SA_REP
200AD_ASST
SELECTemployeejd,jobjd,departmentjd
FROMemployees
INTERSECT
SELECTemployeejd,jobjd,departmentjd
FROMjob_history;
—EMPLOYEE.!_JOB_JDrDEPARTMENT口I;
176SAREPonl
MINUS運(yùn)算
TheMINUSOperator
AB
m
TheMINUSoperatorreturnsrowsfromthefirstquery
thatarenotpresentinthesecondquery.s
令展現(xiàn)至今為止沒(méi)有變更過(guò)工作的員工號(hào)
SELECTemployeejd
FROMemployees
MINUS
SELECTemployeejd
FROMjob_history;
EMPLOYEEJD
100
____________________103
104
組運(yùn)算注意事項(xiàng)
令字段數(shù)量、數(shù)據(jù)類型必須相同,字段的名
稱可以不相同。
令除UNIONALL運(yùn)算,其他運(yùn)算消除冗余,按
第一個(gè)字段的升序排列。
令不能使用DISTINCT關(guān)鍵字強(qiáng)制要求UNION
ALL消除冗余。
⑥ORDERBY子句只能出現(xiàn)在句子最后金道序、
的字段可以是第一個(gè)SELECT子句十艙字段"
名、表達(dá)式、同義詞或者位置符耳。再
4,一.一
子查詢中的組運(yùn)算
SELECTemployeejd,departmentjd
FROMemployees
WHERE[employeejd,departmentjd]
IN[SELECTemployeejd,departmentjd
FROMemployees
UNION
SELECTemployeejd,depa
FROMjob_history);
控制數(shù)據(jù)順序
COLUMNa_dummyNOPRINT
SELECT'sing*AS"Mydream",3a__dummy
FROMdual
UNION
SELECTTdliketoteach;1
FROMdual
UNION
SELECT'theworldW2
Mydream.
FROMdual
ORDERBY2;rdliketoteach
Itheworldto=
第七節(jié)高級(jí)SQL語(yǔ)句
?組運(yùn)算
?高級(jí)分組子句:ROLLUP、CUBE、
GROUPINGSETS
?高級(jí)子查詢:關(guān)聯(lián)子查詢、EXISTS運(yùn)算、
WITH子句
?高級(jí)DML語(yǔ)句
09:04:37廈門大學(xué)計(jì)算機(jī)系工程碩士教材17
ROLLUP運(yùn)算語(yǔ)法
SELECT[column^groupJunction(column)...
FROMtable
[WHEREcondition]
[GROUPBY[ROLLUP]group_by_expression]
[HAVINGhaving_expression];
[ORDERBYcolumn];
⑥ROLLUPAGROUPBY子句的擴(kuò)展,
計(jì)累計(jì)值。
SELECTdepartmentJd,jobjd,SUM[salary]
FROMemployees
WHEREdepartmentjd<60
GROUPBYROLLUP(department_id,job_id);
DEPARTMENTJDJOBJDSUM(SALARY)
10AD_ASST4400
4400
20MK_MAN13000
20MK_REP6000
19000
50ST_CLERK
50ST_MAN5800
彳30
40900
令ROLLUP運(yùn)算才艮據(jù)GROUPBY子句中字段從
右到左的順序)分別進(jìn)行數(shù)值合計(jì)。
令如果不使用ROLLUP運(yùn)算,同樣完成對(duì)n個(gè)
維度數(shù)據(jù)的統(tǒng)計(jì)與合計(jì)工作,需要n+1個(gè)
SELECT語(yǔ)句用UNIONALL連接。這樣的做
法是低效的,因?yàn)槊總€(gè)SELECT語(yǔ)句都要對(duì)
全表掃描。而ROLLUP語(yǔ)句只要掃描一次。
CUBE運(yùn)算語(yǔ)法
SELECT[column}group_function^column)...
FROMtable
[WHEREcondition]
[GROUPBY[CUBE]group_by_expression]
[HAVINGhaving_expression];
[ORDERBYcolumn];
?CUBE是GROUPBY子句的擴(kuò)展,唾線計(jì)各垂
個(gè)維度的累計(jì)值。
CUBE運(yùn)算
SELECTdepartmentjd,job_id,SUM(salary)
FROMemployees
WHEREdepartmentjd<60
GROUPBYCUBEfdepartmentJd,jobjd);
DEPARTMENT」DJOBJDSUM(SALARY)
10AD_ASST4400
104400
20MK_MAN13000
20MK_REP6000
2019000(B
50ST-CLERK11700
50ST.MAN5800
5017500?
AD_ASST4400
MK_MAN13000
MK_REP6000
ST_CLERK@17版
ST_MAN5800
令CUBE運(yùn)算實(shí)現(xiàn)了對(duì)數(shù)據(jù)模型的各個(gè)維度進(jìn)
行統(tǒng)計(jì)的要求。
令如果不采用CUBE運(yùn)算,同樣完成對(duì)n維數(shù)
據(jù)的各個(gè)維度進(jìn)行統(tǒng)計(jì)和合計(jì)工作,需要2n
個(gè)SELECT語(yǔ)句用UNIONALL連接,而且這
樣的做法是低效的。
GROUPINGSETS
SELECTdepartmentJd,job_id,
manager_id,avg(salary)
FROMemployees
GROUPBYGROUPINGSETS
[[departmentjdjobjd],(jobjd.managerjd]];
DEPARTMENTJDJOBJDMANAGERJDAVG(SALARY)
10AD.ASST4400
____________________3MK_MAN13000
20MK_REP6000
50ST_CLERK2925
■■■
MK_REP2016000
SA_MAN10010500
SA_REP1498866.66667
ST_CLERK1242925
ST_MAN100注7800.
GROUPINGSETS
⑥GROUPINGSETS是GROUPBY子句的進(jìn)一步擴(kuò)
展,可以在一個(gè)查詢語(yǔ)句中定義多種分組統(tǒng)計(jì)
方式。
.ORACLE服務(wù)器計(jì)算GROUPINGSETS中定義的
所有分組統(tǒng)計(jì))并對(duì)所有分組的返回結(jié)果使用
UNIONALL運(yùn)算。
使用GROUPINGSET只需要對(duì)全表進(jìn)行一次掃
描,比起使用復(fù)雜的UNION語(yǔ)句,是簡(jiǎn)捷而高
效的寫法。
ORACLE9i及更高版本使用。
CUBE、ROLLUP、GROUPINGSETS
的比較
CUBE?b,c)等價(jià)于GROUPINGSETS
((a,b,c),(a,b),(a,c),(b,c),
(a),(b),(c),())
ROLLUPfa,b,c)等價(jià)于GROUPINGSETS((a,b,c),(a,
b),(a),0)
第七節(jié)高級(jí)SQL語(yǔ)句
?組運(yùn)算
?高級(jí)分組子句:ROLLUP、CUBE、
GROUPINGSETS
?高級(jí)子查詢:關(guān)聯(lián)子查詢、EXISTS運(yùn)算、
WITH子句
?高級(jí)DML語(yǔ)句
09:04:37廈門大學(xué)計(jì)算機(jī)系工程碩士教材29
洞^量,了■查詢
⑥如果一^個(gè)子查詢對(duì)每行記錄都恰好返回一
個(gè)字段值,這樣的子查詢稱為標(biāo)量子查詢。
。標(biāo)量子函數(shù)能出現(xiàn)在
◎SELECT語(yǔ)句中除GROUPBY以夕卜的任意子句
◎INSERT語(yǔ)句中的VALUES子句
◎DECODE和CASE中的條件和表達(dá)式部分
◎UPDATE語(yǔ)句中SET和WHERE子句中您集?符的
左邊與買必
標(biāo)量子查詢:在CASE表達(dá)式中
SELECTemployeejd,last_name,
(CASE
WHENdepartmentjd=
(SELECTdepartmentjdFROM
departments
WHERElocationjd=1800)
THEN"Canada1ELSE'USA'END)location
FROMemployees;
標(biāo)量子查詢:在ORDERBY子句中
SELECTemployeejd,last_name
FROMemployeese
ORDERBY(SELECTdepartment_name
FROMdepartmentsd
WHEREe.departmentjd=d.departmentjd);
關(guān)聯(lián)子查詢和嵌套子查詢的區(qū)別
⑥嵌套子查詢的執(zhí)行步驟:
◎內(nèi)查詢執(zhí)行一次,并得到一個(gè)值
◎外查詢執(zhí)行一次,利用到內(nèi)查詢的值
⑥關(guān)聯(lián)子查詢:
◎外查詢?nèi)∫缓蜻x行
?用候選行的值執(zhí)行內(nèi)查詢
關(guān)聯(lián)子查詢:語(yǔ)法
SELECTcolumnl,column2f...
FROMtablelouter
WHEREcolumnloperator
(SELECTcolumnl,column2
FROMtable2
WHEREexprl=
outer,exp閽);
關(guān)聯(lián)子查詢:例1
⑥提取高于本部門平均工資的員工
SELECTlast_name,salarydepartmentjd
FROMemployeesouter
WHEREsalary>(SELECTAVG(salary)
FROMemployees
WHEREdepartmentjd=
outer.departmmtjd£七X
美"聯(lián)子查詢:例2
⑥提取至少變更2次工作的員工
SELECTe.employeejd,.e.jobjd
FROMemployeese
WHERE2<=(SELECTCOUNTf*]
FROMjob_history
WHEREemployeejd=e.employeejd);
EXISTS運(yùn)算:例子
⑥提取至少有一名下屬的員工信息
SELECTemployeejd,last_name,jobjd,
departmentjd
FROMemployeesouter
WHEREEXISTS(SELECT1
FROMemployees
WHEREmanagerJd
■
outer.e?
令可以使用IN結(jié)構(gòu)代替EXISTS運(yùn)算
SELECTemployeejd,last_name;job_id,
departmentjd
FROMemployees
WHEREemployeejdIN
(SELECTmanagerjd
FROMemployees
WHEREmanagerjdISNOTNULL);
。但相比而言,使用EXISTS的執(zhí)行效福會(huì)更
高。-
NOTEXISTS運(yùn)算
e提取沒(méi)有員工的部門
SELECTdepartmentjd,department_name
FROMdepartmentsd
WHERENOTEXISTS(SELECTX
FROMemployees
WHEREdepartmentjd
=d.depar
DEPARTMENTJD|DEPARTMENT_NAME
;190廊ntracting
令NOTIN結(jié)構(gòu)可以代替NOTEXISTS運(yùn)算
SELECTdepartmentjd,department_name
FROMdepartments
WHEREdepartmentjdNOTIN(SELECT
departmentjd
FROMemployees);
norowsselected.
關(guān)聯(lián)更新:語(yǔ)法
UPDATEtablelaliasl
SETcolumn=[SELECTexpression
FROMtable2alias2
WHEREaliasl.column=
alias2.column);
。通過(guò)關(guān)聯(lián)子查詢用一張表格的值來(lái)更新另
長(zhǎng)表格
關(guān)聯(lián)更新:例1
.在EMPLOYEES表中新增一個(gè)字段,保存部門
名稱
ALTERTABLEemployees
ADD[department_nameVARCHAR2[14]];
UPDATEemployeese
SETdepartment_name=
[SELECTdepartment_name
FROMdepartmentsd
WHEREe.departmentjd=
d.departmentjd);
關(guān)聯(lián)更新:例2
⑥根據(jù)rewards表里最新的員工工資增長(zhǎng)記錄,
更新employees表的工資(salary)字段。
reward表
EMPLOYEEJD|PAY.RAISE|PAYRAISE.DATE
12480001-Jan-08
10150001-Jan-08
UPDATEemployees
SETsalary=(SELECTemployees.salary+rewards.pay_raise
FROMrewards
WHEREemployeejd=
employees.employeejd
ANDpayraise_date=
(SELECTMAX(payraise_date)
FROMrewards
WHEREemployeejd=
employees.employeejd))
WHEREemployees.employeejd
IN(SELECTemployeejdFROMrewards);
關(guān)聯(lián)刪除:語(yǔ)法
DELETEFROMtablelaliasl
WHEREcolumnoperator
(SELECTexpression
FROMtable2alias2
WHEREaliasl.column=alias2,column);
⑥通過(guò)關(guān)聯(lián)子查詢基于一張表格來(lái)刪除另一
張表格中的記錄、4?
關(guān)聯(lián)刪除:例1
⑥在EMPLOYEES表中刪除同時(shí)存在于
EMP_HISTORY表中的記錄。
DELETEFROMemployeesE
WHEREemployeejd=
(SELECTemployeejd
FROMemp_history
WHEREemployeejd=E.employee
關(guān)聯(lián)刪除:例2
◎弓手在JOBJHSTORY表中只保留每個(gè)員工班
工,變更記錄。每當(dāng)一個(gè)員工進(jìn)行
:弟5次工作變更,需要?jiǎng)h除最早的一次工
作變更圮錄。寫出這樣的判斷刪除語(yǔ)句。
DELETEFROMjob_historyJH
WHEREstart_date=
(SELECTMIN(start_date)
FROMjob_history
WHEREemployeejd=JH.employeeJd)
AND4<(SELECTCOUNTf*)
FROMjob_history
WHEREemployeejd=JH.employeeJd);
WITH子句:例子
DEPARTMENT_NAMEDEPT.TOTAL
Executive58000
Sales3710D
WITH
dept_costsAS(
SELECT,SUM(salary]AS
dept_total
FROMemployees,departments
WHEREemployees.departmentjd=
departments.departmentjd
GROUPBY),
avg_costAS
(SELECTSUM(dept_total)/COUNT(*)ASdept.avg
FROMdept_costs)
SELECT*FROMdept_costs
WHEREdept_total>
(SELECTdept_avgFROMavg_cost)
ORDERBYdepartment_name;
WITH子句注意事項(xiàng)
⑥只能用在SELECT語(yǔ)句中。
⑥當(dāng)WITH子句定義的臨時(shí)表格的名字與數(shù)據(jù)
庫(kù)中已知表名相同,則SELECT語(yǔ)句優(yōu)先使
用WITH定義的表格。
第七節(jié)高級(jí)SQL語(yǔ)句
?組運(yùn)算
?高級(jí)分組子句:ROLLUP、CUBE、
GROUPINGSETS
?高級(jí)子查詢:關(guān)聯(lián)子查詢、EXISTS運(yùn)算、
WITH子句
?高級(jí)DML語(yǔ)句
09:04:37廈門大學(xué)計(jì)算機(jī)系工程碩士教材52
多表INSERT語(yǔ)句
⑥INSERT…SELECT語(yǔ)句可以成為多表插入語(yǔ)
句中的一部份。
令多表插入語(yǔ)句可以用在數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中,
用于從一個(gè)數(shù)據(jù)源向多個(gè)目標(biāo)分發(fā)數(shù)據(jù)。
令多表插入語(yǔ)句作為單一^勺DML語(yǔ)句)與以
下兩種方式比較,效率有明顯的提高:
◎多條INSERT…SELECT語(yǔ)句4金,
◎使用IF…THEN語(yǔ)法構(gòu)造的插入過(guò)程國(guó)魚殳:
多表INSERT語(yǔ)句:語(yǔ)法
語(yǔ)法
INSERT[ALL][conditional_insert_clause]
[insert_into_clausevalues_clause](subquery]
conditional_insert_clause
[ALL][FIRST]
[WHENconditionTHEN][insert_into_clause
values_clause]
[ELSE][insert_into_clausevalues.clause;^
多表INSERT語(yǔ)句:類型
.UnconditionalINSERT
.ConditionalALLINSERT
.ConditionalFIRSTINSERT
.Pivoting(行歹4轉(zhuǎn)換)INSERT
Uncond什ionalINSERTALL
INSERTALL
INTOsal_history
VALUES(EMPIDHIREDATE’SAL)
INTOmgr_historyVALUES(EMPID.MGR,SAL)
SELECTemployeejdEMPID,hire_date
HIREDATE,salarySAL,managerjdMGR
FROMemployees
WHEREemployeejd>200;
ConchtionalINSERTALL
INSERTALL
WHENSAL>10000THEN
INTOsal_historyVALUES(EMPID,HIREDATE7SAL]
WHENMGR>200THEN
INTOmgr_historyVALUES(EMPID’MGRSAL)
SELECTemployeejdEMPID,hire_date
HIREDATE,salarySAL,manager_idMGR
FROMemployees
WHEREemployeejd>200;
4rowscreated.Jq/維
Cond讓ionalFIRSTINSERT
INSERTFIRST
WHENSAL>25000THEN
INTOspecial_salVALUESfDEPTID,SAL)
WHENHIREDATElike('%00%')THEN
INTOhiredate_history_00VALUESfDEPTID,HIREDATE)
WHENHIREDATElike('%99%')THEN
INTOhiredate_history_99VALUESfDEPTID,HIREDATE)
ELSE
INTOhiredate.historyVALUES(DEPTID,HIREDATE)
SELECTdepartmentjdDEPTID,SUM(salary)SAL,
MAX(hire_date)HIREDATE
FROMemployees
GROUPBYdepartmentjd;
8rowscreated.
行列轉(zhuǎn)換
DESCSALES_SOURCE_DATA
NameNull?II_____31?^______
|EMPLOYEE_IDNUMBERS)
|WEEK_IDNUMBER(2)
SALES_MONNUMBER??)
|SALES_TUENUMBER且2)
^SALESWED
—?NUMBERS,2)
|SALES_THURNUMBER(8,2)
)SALES_FRINUMBER(8,2)
SELECT*FROMSALESSOURCE_DA黔良&/
EMPLOYEE」。WEEK」。SALES」##SALESTIIESALES_WEbSALESTHURSALES_FP.I
176-T—00300040005000~6000
DESCSALESINFO
NameNull?Typo
iEMPLOYEEJDNUMBER⑹
|WEEK:NUMBER(2)
:SALESNUMBER")
SELECT*FROMsalesjnfo;
[
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑工程項(xiàng)目施工總承包合同
- 承債式公司股權(quán)轉(zhuǎn)讓協(xié)議
- 站臺(tái)裝修勞務(wù)合同
- 房屋出租合同協(xié)議書
- 債轉(zhuǎn)股投資合同協(xié)議書
- 裝修材料采購(gòu)合同
- 二婚離婚協(xié)議書新
- 電商行業(yè)網(wǎng)絡(luò)購(gòu)物服務(wù)協(xié)議
- 影視內(nèi)容版權(quán)采購(gòu)協(xié)議
- 手房買賣合同官方
- 關(guān)于與旅游發(fā)展集團(tuán)成立合資公司的可行性研究報(bào)告
- 第一部分-氣排球運(yùn)動(dòng)介紹課件
- 世界局勢(shì)與主再來(lái)課件
- 思維游戲(小孩都喜歡玩的游戲)教學(xué)內(nèi)容課件
- 儲(chǔ)能技術(shù)課后參考答案梅生偉
- 過(guò)渡金屬氧化物催化劑及其催化作用
- 溫濕度對(duì)果蔬儲(chǔ)存的影響
- 遺傳性耳聾基因檢測(cè)標(biāo)準(zhǔn)Ppt
- 電是怎么產(chǎn)生的
- 八-十-天-環(huán)-游-地-球(讀書)專題培訓(xùn)課件
- 新概念英語(yǔ)第一冊(cè)課文完整版
評(píng)論
0/150
提交評(píng)論