版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第七節(jié)高級SQL語句
?通過本節(jié)學(xué)習(xí),你需要掌握:
?組運(yùn)算
?高級分組子句:ROLLUP、CUBE、
GROUPINGSETS
?高級子查詢:關(guān)聯(lián)子查詢、EXISTS運(yùn)
算、WITH子句
?高級DML語句
09:04:36廈門大學(xué)計(jì)算機(jī)系工程碩士教材1
第七節(jié)高級SQL語句
?組運(yùn)算
?高級分組子句:ROLLUP、CUBE、
GROUPINGSETS
?高級子查詢:關(guān)聯(lián)子查詢、EXISTS運(yùn)算、
WITH子句
?高級DML語句
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)任工作與歷史工作相同的員工號和
工作。
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)至今為止沒有變更過工作的員工號
SELECTemployeejd
FROMemployees
MINUS
SELECTemployeejd
FROMjob_history;
EMPLOYEEJD
100
____________________103
104
組運(yùn)算注意事項(xiàng)
令字段數(shù)量、數(shù)據(jù)類型必須相同,字段的名
稱可以不相同。
令除UNIONALL運(yùn)算,其他運(yùn)算消除冗余,按
第一個字段的升序排列。
令不能使用DISTINCT關(guān)鍵字強(qiáng)制要求UNION
ALL消除冗余。
⑥ORDERBY子句只能出現(xiàn)在句子最后金道序、
的字段可以是第一個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é)高級SQL語句
?組運(yùn)算
?高級分組子句:ROLLUP、CUBE、
GROUPINGSETS
?高級子查詢:關(guān)聯(lián)子查詢、EXISTS運(yùn)算、
WITH子句
?高級DML語句
09:04:37廈門大學(xué)計(jì)算機(jī)系工程碩士教材17
ROLLUP運(yùn)算語法
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)算,同樣完成對n個
維度數(shù)據(jù)的統(tǒng)計(jì)與合計(jì)工作,需要n+1個
SELECT語句用UNIONALL連接。這樣的做
法是低效的,因?yàn)槊總€SELECT語句都要對
全表掃描。而ROLLUP語句只要掃描一次。
CUBE運(yùn)算語法
SELECT[column}group_function^column)...
FROMtable
[WHEREcondition]
[GROUPBY[CUBE]group_by_expression]
[HAVINGhaving_expression];
[ORDERBYcolumn];
?CUBE是GROUPBY子句的擴(kuò)展,唾線計(jì)各垂
個維度的累計(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)了對數(shù)據(jù)模型的各個維度進(jìn)
行統(tǒng)計(jì)的要求。
令如果不采用CUBE運(yùn)算,同樣完成對n維數(shù)
據(jù)的各個維度進(jìn)行統(tǒng)計(jì)和合計(jì)工作,需要2n
個SELECT語句用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ò)
展,可以在一個查詢語句中定義多種分組統(tǒng)計(jì)
方式。
.ORACLE服務(wù)器計(jì)算GROUPINGSETS中定義的
所有分組統(tǒng)計(jì))并對所有分組的返回結(jié)果使用
UNIONALL運(yùn)算。
使用GROUPINGSET只需要對全表進(jìn)行一次掃
描,比起使用復(fù)雜的UNION語句,是簡捷而高
效的寫法。
ORACLE9i及更高版本使用。
CUBE、ROLLUP、GROUPINGSETS
的比較
CUBE?b,c)等價于GROUPINGSETS
((a,b,c),(a,b),(a,c),(b,c),
(a),(b),(c),())
ROLLUPfa,b,c)等價于GROUPINGSETS((a,b,c),(a,
b),(a),0)
第七節(jié)高級SQL語句
?組運(yùn)算
?高級分組子句:ROLLUP、CUBE、
GROUPINGSETS
?高級子查詢:關(guān)聯(lián)子查詢、EXISTS運(yùn)算、
WITH子句
?高級DML語句
09:04:37廈門大學(xué)計(jì)算機(jī)系工程碩士教材29
洞^量,了■查詢
⑥如果一^個子查詢對每行記錄都恰好返回一
個字段值,這樣的子查詢稱為標(biāo)量子查詢。
。標(biāo)量子函數(shù)能出現(xiàn)在
◎SELECT語句中除GROUPBY以夕卜的任意子句
◎INSERT語句中的VALUES子句
◎DECODE和CASE中的條件和表達(dá)式部分
◎UPDATE語句中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í)行一次,并得到一個值
◎外查詢執(zhí)行一次,利用到內(nèi)查詢的值
⑥關(guān)聯(lián)子查詢:
◎外查詢?nèi)∫缓蜻x行
?用候選行的值執(zhí)行內(nèi)查詢
關(guān)聯(lián)子查詢:語法
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í)行效福會更
高。-
NOTEXISTS運(yùn)算
e提取沒有員工的部門
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)更新:語法
UPDATEtablelaliasl
SETcolumn=[SELECTexpression
FROMtable2alias2
WHEREaliasl.column=
alias2.column);
。通過關(guān)聯(lián)子查詢用一張表格的值來更新另
長表格
關(guān)聯(lián)更新:例1
.在EMPLOYEES表中新增一個字段,保存部門
名稱
ALTERTABLEemployees
ADD[department_nameVARCHAR2[14]];
UPDATEemployeese
SETdepartment_name=
[SELECTdepartment_name
FROMdepartmentsd
WHEREe.departmentjd=
d.departmentjd);
關(guān)聯(lián)更新:例2
⑥根據(jù)rewards表里最新的員工工資增長記錄,
更新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)刪除:語法
DELETEFROMtablelaliasl
WHEREcolumnoperator
(SELECTexpression
FROMtable2alias2
WHEREaliasl.column=alias2,column);
⑥通過關(guān)聯(lián)子查詢基于一張表格來刪除另一
張表格中的記錄、4?
關(guān)聯(lián)刪除:例1
⑥在EMPLOYEES表中刪除同時存在于
EMP_HISTORY表中的記錄。
DELETEFROMemployeesE
WHEREemployeejd=
(SELECTemployeejd
FROMemp_history
WHEREemployeejd=E.employee
關(guān)聯(lián)刪除:例2
◎弓手在JOBJHSTORY表中只保留每個員工班
工,變更記錄。每當(dāng)一個員工進(jìn)行
:弟5次工作變更,需要刪除最早的一次工
作變更圮錄。寫出這樣的判斷刪除語句。
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語句中。
⑥當(dāng)WITH子句定義的臨時表格的名字與數(shù)據(jù)
庫中已知表名相同,則SELECT語句優(yōu)先使
用WITH定義的表格。
第七節(jié)高級SQL語句
?組運(yùn)算
?高級分組子句:ROLLUP、CUBE、
GROUPINGSETS
?高級子查詢:關(guān)聯(lián)子查詢、EXISTS運(yùn)算、
WITH子句
?高級DML語句
09:04:37廈門大學(xué)計(jì)算機(jī)系工程碩士教材52
多表INSERT語句
⑥INSERT…SELECT語句可以成為多表插入語
句中的一部份。
令多表插入語句可以用在數(shù)據(jù)倉庫系統(tǒng)中,
用于從一個數(shù)據(jù)源向多個目標(biāo)分發(fā)數(shù)據(jù)。
令多表插入語句作為單一^勺DML語句)與以
下兩種方式比較,效率有明顯的提高:
◎多條INSERT…SELECT語句4金,
◎使用IF…THEN語法構(gòu)造的插入過程國魚殳:
多表INSERT語句:語法
語法
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語句:類型
.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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)醫(yī)療人力資源服務(wù)合同模板版B版
- 2025年度桉樹苗木物流配送與倉儲服務(wù)合同3篇
- 2024期房買賣合同協(xié)議書(含智能家居升級)3篇
- 2024攝影師與視覺設(shè)計(jì)公司勞動合同范本匯編3篇
- 2024擔(dān)保公司過橋合同協(xié)議
- 2024施工勞務(wù)合同-生態(tài)環(huán)保園建設(shè)版3篇
- 紅木知識培訓(xùn)課件
- 2024年跨境電商出口業(yè)務(wù)預(yù)約合作合同3篇
- 正德職業(yè)技術(shù)學(xué)院《民航服務(wù)禮儀》2023-2024學(xué)年第一學(xué)期期末試卷
- 《財(cái)務(wù)部入職培訓(xùn)》課件
- 阜陽市重點(diǎn)中學(xué)2025屆高考數(shù)學(xué)全真模擬密押卷含解析
- 房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(2024版)宣傳海報
- 2024年市特殊教育學(xué)校工作總結(jié)范文(2篇)
- LNG采購框架合同范例
- 2024版機(jī)床維護(hù)保養(yǎng)服務(wù)合同3篇
- 課題1 金屬材料 教學(xué)設(shè)計(jì) 九年級化學(xué)下冊人教版2024
- 能源崗位招聘筆試題與參考答案(某大型國企)
- 《論拒不執(zhí)行判決、裁定罪“執(zhí)行能力”之認(rèn)定》
- 工業(yè)設(shè)計(jì)基礎(chǔ)知識單選題100道及答案解析
- 2024年貴州省公務(wù)員錄用考試《行測》真題及答案解析
- 山西省晉中市2023-2024學(xué)年高一上學(xué)期期末考試 化學(xué) 含解析
評論
0/150
提交評論