版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七节高级SQL语句
♦通过本节学习,你需要掌握:
♦组运算
♦高级分组子句:ROLLUP、CUBE、
GROUPINGSETS
♦高级子查询:关联子查询、EXISTS运
算、WITH子句
♦高级DML语句
09:04:36厦门大学计算机系工程硕士教材1
第七节高级SQL语句
♦组运算
♦高级分组子句:ROLLUP、CUBE、
GROUPINGSETS
♦高级子查询:关联子查询、EXISTS运算、
WITH子句
♦高级DML语句
09:04:36厦门大学计算机系工程硕士教材2
TheSETOperators
UNION/UNIONALL
INTERSECT
■
■
MINUS
UNION运算
TheUNIONSETOperator
TheUNIONoperatorreturnsresultsfrombothqueries
aftereliminatingduplications.
⑥展现所有员工当前和历史工作的详细资料。
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运算
TheUNIONALLOperator
AB
TheUNIONALLoperatorreturnsresultsfromboth
queriesincludingallduplications.
SELECTemployeejd,jobjd,departmentjd
FROMemployees
UNIONALL
SELECTemployeeJd,jobjd;departmentjd
FROMjob_historyORDERBY子句
id;必须放在最后写
EMPLOYEEJDJOBJDDEPARTMENTJD
■■■
176SA_REP80
176SA_MAN80
176SA_REPJggg
INTERSECT运算
TheINTERSECTOp|erator
B
TheINTERSECToperatorreturnsresultsthatare
commontobothqueries.aS
令展现现任工作与历史工作相同的员工号和
工作。
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运算
TheMINUSOperator
AB
m
TheMINUSoperatorreturnsrowsfromthefirstquery
thatarenotpresentinthesecondquery.s
令展现至今为止没有变更过工作的员工号
SELECTemployeejd
FROMemployees
MINUS
SELECTemployeejd
FROMjob_history;
EMPLOYEEJD
100
____________________103
104
组运算注意事项
令字段数量、数据类型必须相同,字段的名
称可以不相同。
令除UNIONALL运算,其他运算消除冗余,按
第一个字段的升序排列。
令不能使用DISTINCT关键字强制要求UNION
ALL消除冗余。
⑥ORDERBY子句只能出现在句子最后金道序、
的字段可以是第一个SELECT子句十舱字段"
名、表达式、同义词或者位置符耳。再
4,一.一
子查询中的组运算
SELECTemployeejd,departmentjd
FROMemployees
WHERE[employeejd,departmentjd]
IN[SELECTemployeejd,departmentjd
FROMemployees
UNION
SELECTemployeejd,depa
FROMjob_history);
控制数据顺序
COLUMNa_dummyNOPRINT
SELECT'sing*AS"Mydream",3a__dummy
FROMdual
UNION
SELECTTdliketoteach;1
FROMdual
UNION
SELECT'theworldW2
Mydream.
FROMdual
ORDERBY2;rdliketoteach
Itheworldto=
第七节高级SQL语句
♦组运算
♦高级分组子句:ROLLUP、CUBE、
GROUPINGSETS
♦高级子查询:关联子查询、EXISTS运算、
WITH子句
♦高级DML语句
09:04:37厦门大学计算机系工程硕士教材17
ROLLUP运算语法
SELECT[column^groupJunction(column)...
FROMtable
[WHEREcondition]
[GROUPBY[ROLLUP]group_by_expression]
[HAVINGhaving_expression];
[ORDERBYcolumn];
⑥ROLLUPAGROUPBY子句的扩展,
计累计值。
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运算才艮据GROUPBY子句中字段从
右到左的顺序)分别进行数值合计。
令如果不使用ROLLUP运算,同样完成对n个
维度数据的统计与合计工作,需要n+1个
SELECT语句用UNIONALL连接。这样的做
法是低效的,因为每个SELECT语句都要对
全表扫描。而ROLLUP语句只要扫描一次。
CUBE运算语法
SELECT[column}group_function^column)...
FROMtable
[WHEREcondition]
[GROUPBY[CUBE]group_by_expression]
[HAVINGhaving_expression];
[ORDERBYcolumn];
♦CUBE是GROUPBY子句的扩展,唾线计各垂
个维度的累计值。
CUBE运算
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运算实现了对数据模型的各个维度进
行统计的要求。
令如果不采用CUBE运算,同样完成对n维数
据的各个维度进行统计和合计工作,需要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子句的进一步扩
展,可以在一个查询语句中定义多种分组统计
方式。
.ORACLE服务器计算GROUPINGSETS中定义的
所有分组统计)并对所有分组的返回结果使用
UNIONALL运算。
使用GROUPINGSET只需要对全表进行一次扫
描,比起使用复杂的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)
第七节高级SQL语句
♦组运算
♦高级分组子句:ROLLUP、CUBE、
GROUPINGSETS
♦高级子查询:关联子查询、EXISTS运算、
WITH子句
♦高级DML语句
09:04:37厦门大学计算机系工程硕士教材29
洞^量,了■查询
⑥如果一^个子查询对每行记录都恰好返回一
个字段值,这样的子查询称为标量子查询。
。标量子函数能出现在
◎SELECT语句中除GROUPBY以夕卜的任意子句
◎INSERT语句中的VALUES子句
◎DECODE和CASE中的条件和表达式部分
◎UPDATE语句中SET和WHERE子句中您集•符的
左边与买必
标量子查询:在CASE表达式中
SELECTemployeejd,last_name,
(CASE
WHENdepartmentjd=
(SELECTdepartmentjdFROM
departments
WHERElocationjd=1800)
THEN"Canada1ELSE'USA'END)location
FROMemployees;
标量子查询:在ORDERBY子句中
SELECTemployeejd,last_name
FROMemployeese
ORDERBY(SELECTdepartment_name
FROMdepartmentsd
WHEREe.departmentjd=d.departmentjd);
关联子查询和嵌套子查询的区别
⑥嵌套子查询的执行步骤:
◎内查询执行一次,并得到一个值
◎外查询执行一次,利用到内查询的值
⑥关联子查询:
◎外查询取一候选行
©用候选行的值执行内查询
关联子查询:语法
SELECTcolumnl,column2f...
FROMtablelouter
WHEREcolumnloperator
(SELECTcolumnl,column2
FROMtable2
WHEREexprl=
outer,exp阍);
关联子查询:例1
⑥提取高于本部门平均工资的员工
SELECTlast_name,salarydepartmentjd
FROMemployeesouter
WHEREsalary>(SELECTAVG(salary)
FROMemployees
WHEREdepartmentjd=
outer.departmmtjd£七X
美"联子查询:例2
⑥提取至少变更2次工作的员工
SELECTe.employeejd,.e.jobjd
FROMemployeese
WHERE2<=(SELECTCOUNTf*]
FROMjob_history
WHEREemployeejd=e.employeejd);
EXISTS运算:例子
⑥提取至少有一名下属的员工信息
SELECTemployeejd,last_name,jobjd,
departmentjd
FROMemployeesouter
WHEREEXISTS(SELECT1
FROMemployees
WHEREmanagerJd
■
outer.e?
令可以使用IN结构代替EXISTS运算
SELECTemployeejd,last_name;job_id,
departmentjd
FROMemployees
WHEREemployeejdIN
(SELECTmanagerjd
FROMemployees
WHEREmanagerjdISNOTNULL);
。但相比而言,使用EXISTS的执行效福会更
高。-
NOTEXISTS运算
e提取没有员工的部门
SELECTdepartmentjd,department_name
FROMdepartmentsd
WHERENOTEXISTS(SELECTX
FROMemployees
WHEREdepartmentjd
=d.depar
DEPARTMENTJD|DEPARTMENT_NAME
;190廊ntracting
令NOTIN结构可以代替NOTEXISTS运算
SELECTdepartmentjd,department_name
FROMdepartments
WHEREdepartmentjdNOTIN(SELECT
departmentjd
FROMemployees);
norowsselected.
关联更新:语法
UPDATEtablelaliasl
SETcolumn=[SELECTexpression
FROMtable2alias2
WHEREaliasl.column=
alias2.column);
。通过关联子查询用一张表格的值来更新另
长表格
关联更新:例1
.在EMPLOYEES表中新增一个字段,保存部门
名称
ALTERTABLEemployees
ADD[department_nameVARCHAR2[14]];
UPDATEemployeese
SETdepartment_name=
[SELECTdepartment_name
FROMdepartmentsd
WHEREe.departmentjd=
d.departmentjd);
关联更新:例2
⑥根据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);
关联删除:语法
DELETEFROMtablelaliasl
WHEREcolumnoperator
(SELECTexpression
FROMtable2alias2
WHEREaliasl.column=alias2,column);
⑥通过关联子查询基于一张表格来删除另一
张表格中的记录、4„
关联删除:例1
⑥在EMPLOYEES表中删除同时存在于
EMP_HISTORY表中的记录。
DELETEFROMemployeesE
WHEREemployeejd=
(SELECTemployeejd
FROMemp_history
WHEREemployeejd=E.employee
关联删除:例2
◎弓手在JOBJHSTORY表中只保留每个员工班
工,变更记录。每当一个员工进行
:弟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子句注意事项
⑥只能用在SELECT语句中。
⑥当WITH子句定义的临时表格的名字与数据
库中已知表名相同,则SELECT语句优先使
用WITH定义的表格。
第七节高级SQL语句
♦组运算
♦高级分组子句:ROLLUP、CUBE、
GROUPINGSETS
♦高级子查询:关联子查询、EXISTS运算、
WITH子句
♦高级DML语句
09:04:37厦门大学计算机系工程硕士教材52
多表INSERT语句
⑥INSERT…SELECT语句可以成为多表插入语
句中的一部份。
令多表插入语句可以用在数据仓库系统中,
用于从一个数据源向多个目标分发数据。
令多表插入语句作为单一^勺DML语句)与以
下两种方式比较,效率有明显的提高:
◎多条INSERT…SELECT语句4金,
◎使用IF…THEN语法构造的插入过程国鱼殳:
多表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转换)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.
行列转换
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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年初二数学教学工作计划
- 二零二四年林地买卖与林业大数据建设合同3篇
- 大学学生会社团部学期工作计划范文
- 2024年人才培育共赢协议:校企合作框架
- 2024年家庭和平分手详细合同样本版B版
- 兴安街道阡里小学研学旅行计划
- 2024年人事工作目标计划
- 初三上期语文教学计划
- 2024八年级语文教学计划024八年级下册语文书
- 幼儿小班语言教学计划幼儿园小班教学计划表
- 湖北省武汉市硚口区2023-2024学年九年级上学期12月月考数学试题(含答案)
- 马工程《经济法学》教学课件()
- 2024年陕西延长石油物流集团有限公司招聘笔试参考题库含答案解析
- 北师大版七年级数学上册 专题16 应用一元一次方程(14大题型)(原卷版+解析)
- 《童年》阅读测试题及答案
- 北师大版七年级数学上册 专题17 解一元一次方程50道题专训(5大题型)(原卷版+解析)
- 2024届广东省佛山市普通高中高三下学期一模考试物理试题含解析
- 幼儿园二十四节气课程教研方案
- 银矿的开采与加工
- 共享菜园的可行性分析方案
- 《室内设计公共空间》课件
评论
0/150
提交评论