zoukankan      html  css  js  c++  java
  • 查询出每一个雇员的姓名,工资,部门名称,工资在公司的等级及其领导的姓名,领导的工资,以及领导所相应的等级


    如题:

    查询出每一个雇员的姓名,工资,部门名称,工资在公司的等级及其领导的姓名,领导的工资,以及领导所相应的等级


    这是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)







  • 相关阅读:
    hdu1203I NEED A OFFER!(01背包)
    poj3984迷宫问题(dfs+stack)
    hdu1422重温世界杯(动态规划,最长子序列)
    hdu1231最大连续子序列(动态规划)
    cf#514B. Forgery(暴力)
    uvaoj455Periodic Strings(枚举)
    uvaoj1225Digit Counting(暴力)
    uvaoj1586Molar mass(暴力)
    uvaoj1585Score(暴力)
    使用哈希值和&和2^n数组生成索引值的原理
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5399100.html
Copyright © 2011-2022 走看看