资源描述:
《08Oracle笔记(八)复杂查询及总结》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Oracle笔记(八)复杂查询及总结一、复杂查询1、列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工资。1、确定所需要的数据表:•emp表:可以查询出员工的数量;•dept表:部门名称;•emp表:统计信息;2、确定已知的关联字段:•emp.deptno=dept.deptno;第一步:找出至少有一个员工的部门编号SELECTdeptno,COUNT(empno)FROMempGROUPBYdeptnoHAVINGCOUNT(empno)>1;第二步:找到部门名称
2、,肯定使用部门表,因为现在的数据量较小,所以可以将之前的emp表和dept表两个进行连接,统一采用多字段分组的方式查询;SELECTd.deptno,d.dname,COUNT(c.empno)FROMempc,deptdWHEREe.deptno-d.deptno(+)GROUPBYd.deptno,d.dnameHAVINGCOUNT(e.empno)>1;第三步:依然需要继续统计SELECTd.deptno,d.dname,COUNT(e.empno),AVG(sal),MIN(sal),MA
3、X(sal)FROMempe,deptdWHEREe.deptno=d.deptno(+)GROUPBYd.deptno,d.dnameHAVINGCOUNT(c.empno)>1;2、歹U出薪金比"SMITH"或"ALLEN〃多的所有员工的编号、姓名、部门名称、其领导姓名。1、确定所需要的数据表:•emp表:查询出"SMITH"或"ALLEN"工资;•emp表:最终的显示需要编号、姓名;•emp表:领导的姓名,自身关联;•dept表:部门名称;2、确定已知的关联字段:•雇员和领导:emp.mgr=
4、memp.empno;•雇员和部门:emp.deptno二dept,deptno;第一步:找出"SMITH"或"ALLEN"的工资SELECTsalFROMempWHEREenameIN('SMITH'ALLEN');第二步:以上的查询返回的多行单列的记录,按照子查询的要求在WHERE子句中写合适,所以这个时候将上面的杳询作为一个了杳询出现,继续查询符合此要求的员工的编号、姓名。SELECTe.empno,e.enameFROMempeWHEREe.sal>ALL(SELECTsalFROMempW
5、HEREenameIN('SM1TH,,'ALLEN,));第三步:查询出部门的名称,引入部门表,同时增加消除笛卡尔积的条件SELECTc.cmpno,c.cnamc,d.dnamcFROMempc,deptdWHEREc.sal>ALL(SELECTsalFROMempWHEREenameIN('SMITH'ALLEN'))ANDe.deptno=d.deptno;第四步:领导的信息需要emp表自身关联生SELECTe.empno,e.ename,d.dname,m.enameFROMempe,d
6、eptd,empmWHEREe.sal>ALL(SELECTsalFROMempWHEREenameIN('SMITH,,'ALLEN'))ANDe.deptno=d.deptnoANDe.mgr=m.empno(9;3、列岀所有员工的编号、姓名及其直接上级的编号、姓名,显示的结果按领导年工资的降序排列。1>确定所需耍的数据衣:•emp表:员工的编号、姓名;•emp表:领导的编号、姓名、计算年薪;2、确定已知的关联字段:emp.mgr=memp.empno;SELECTe.empno,e.ename
7、,m.empno,m.ename,(m.sal+NVL(m.comm,0))*12incomeFROMempe,empmWHEREe.mgr=m.empno()ORDERBYincomeDESC;4、列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数。1、确定所需要的数据表:•emp表:雇员的编号、姓名;•emp表:求出领导的工作日期;•dept表:部门名称、位置;•emp表:统计部门人数;2、确定已知的关联字段:•雇员和部门:emp.deptno=dept.deptno
8、;•雇员和领导:emp.mgr=memp.empno;第一步:列出受雇日期早于其直接上级的所有员工的编号、姓名一一□身关联emp表。SELECTe.empno,e.enameFROMempe,empmWHEREe.mgr=m.empno(+)ANDe.hiredate