查询出每个雇员的姓名,工资,部门名称,工资在公司的等级及其领导的姓名,领导的工资,以及领导所对应的等级
2015-06-05 23:55
465 查看
如题:
查询出每个雇员的姓名,工资,部门名称,工资在公司的等级及其领导的姓名,领导的工资,以及领导所对应的等级
这是oracle的默认Scott用户下面的emp,dept 和 salgrade 表间的一道思考题。
NO 字段 类型 描述
1 empno Number(4) 雇员编号
2 ename Varchar2(10) 雇员姓名
3 job Varchar2(9) 工作职位
4 mgr Number(4) 雇员的领导(经理)编号
5 hierdate date 入职日期
6 sal Number(7,2) 月薪/工资
7 comm Number(7,2) 奖金
8 deptno Number(2) 雇员所属部门的编号
NO 字段 类型 描述
1 deptno Number(2) 部门编号(唯一)
2 dname Varchar2(14) 部门名称
3 loc Varchar2(13) 地址
NO 字段 类型 描述
1 Grade number 等级名称
2 Losal number 此等级的最低工资
3 hisal number 此等级的最高工资
分析:先明确工资等级表(salgrade)中的内容
再查询查询出每个雇员的姓名,工资,部门名称,工资在公司的等级(salgrade)
在此上基础上增加查找上司姓名
最后确定雇员的经理姓名,经理的工资,以及经理工资所对应的等级
从这个例子可以看出,对于复杂的多表查询,要一步一步地实现,不要急于求成。
进一步思考:
如果要将上面求得的结果按如样式显示工资的等级,应该如何实现
1: 第五等工资
2: 第四等工资
3: 第三等工资
4: 第二等工资
5: 第一等工资
此时只能用DECODE()函数来实现
查询出每个雇员的姓名,工资,部门名称,工资在公司的等级及其领导的姓名,领导的工资,以及领导所对应的等级
这是oracle的默认Scott用户下面的emp,dept 和 salgrade 表间的一道思考题。
雇员表(emp)
记录了每个雇员的基本信息NO 字段 类型 描述
1 empno Number(4) 雇员编号
2 ename Varchar2(10) 雇员姓名
3 job Varchar2(9) 工作职位
4 mgr Number(4) 雇员的领导(经理)编号
5 hierdate date 入职日期
6 sal Number(7,2) 月薪/工资
7 comm Number(7,2) 奖金
8 deptno Number(2) 雇员所属部门的编号
部门表(emp)
记录了每个部门的基本信息NO 字段 类型 描述
1 deptno Number(2) 部门编号(唯一)
2 dname Varchar2(14) 部门名称
3 loc Varchar2(13) 地址
工资等级表 (salgrade)
一个公司的工资等级制,用来表示同一等级的工资下限及上限NO 字段 类型 描述
1 Grade number 等级名称
2 Losal number 此等级的最低工资
3 hisal number 此等级的最高工资
分析:先明确工资等级表(salgrade)中的内容
select * from salgrade;
再查询查询出每个雇员的姓名,工资,部门名称,工资在公司的等级(salgrade)
SELECT distinct e.ename,e.sal,d.dname,g.grade e_grade FROM emp e,dept d,salgrade g,emp s WHERE (e.deptno=d.deptno) AND (e.sal BETWEEN g.losal AND g.hisal);
在此上基础上增加查找上司姓名
SELECT e.ename,e.sal,d.dname,g.grade,s.ename FROM emp e,dept d,salgrade g,emp s WHERE (e.deptno=d.deptno) AND (e.sal BETWEEN losal AND hisal) AND (s.empno=e.mgr);
最后确定雇员的经理姓名,经理的工资,以及经理工资所对应的等级
SELECT e.ename,e.sal,d.dname,g.grade e_grade,s.ename mgr_name,g2.grade m_grade FROM emp e,dept d,salgrade g,emp s,salgrade g2 WHERE (e.deptno=d.deptno) AND (e.sal BETWEEN g.losal AND g.hisal) AND (s.empno=e.mgr) AND (s.sal BETWEEN g2.losal AND g2.hisal);
从这个例子可以看出,对于复杂的多表查询,要一步一步地实现,不要急于求成。
进一步思考:
如果要将上面求得的结果按如样式显示工资的等级,应该如何实现
1: 第五等工资
2: 第四等工资
3: 第三等工资
4: 第二等工资
5: 第一等工资
此时只能用DECODE()函数来实现
SELECT e.ename, e.sal, d.dname, decode(g.grade,5,'第一等工资',4,'第二等工资',3,'第三等工资',2,'第四等工资',1,'第五等工资') e_grade, s.ename mgr_name, s.sal mgr_sal, decode(g2.grade,5,'第一等工资',4,'第二等工资',3,'第三等工资',2,'第四等工资',1,'第五等工资') m_grade FROM emp e,dept d,salgrade g,emp s,salgrade g2 WHERE (e.deptno=d.deptno) AND (e.sal BETWEEN g.losal AND g.hisal) AND (s.empno=e.mgr) AND (s.sal BETWEEN g2.losal AND g2.hisal)
相关文章推荐
- [LeetCode] Surrounded Regions 包围区域
- [note] java与DB
- Java for LeetCode 168 Excel Sheet Column Title
- WorldWind源码剖析系列:代理助手类ProxyHelper
- 纳什均衡
- 轻量级java web服务器--tomcat
- swift基础控件的创建
- POJ 1006 生理周期 【中国剩余定理】
- lucene入门实例
- 为什么转置512x512矩阵,会比513x513矩阵慢很多?
- Qt for android 截屏、Qml保存图片到本地
- 哈希(2) - 垂直打印一棵二叉树(使用哈希表实现)
- HDU 3790 最短路径问题 【求花费最少的最短路径】
- 结构体变相实现数组赋值
- Java学习篇之---LinkedList
- c++的句柄
- 结构体变相实现数组赋值
- 前端模块化
- mysql 慢查询表记录开启
- HDU 2896 病毒侵袭 【AC自动机】