1.有关系emp(eno,ename,salary,dno,joblevel),其中各属性的含义依次为职工号、姓名、工资,所在部门号和职
务等级,以及关系dept(dno,dname,manager),其中各属性含义依次为部门号、部门名称、部门经理的职工号。试用
sql语句完成以下查询: 1)列出各部门中工资不低于600元的职工的平均工资。  6分2)将“销售部”的那些工资数额低于600的职工的工资上调10% ;  5分3)将“销售部”所有员工中工资排名前10名的人员列出来 ; 5分4)列出部门经理职工号为“001” 的部门名称及该部门经理的工资 ; 5分5)简述视图的作用;创建一个视图,市场部经理只能看到本部门的员工信息; 6分

解决方案 »

  1.   

    1) select dno,avg(salary) from emp where salary>=600 group by dno
    2) update emp set salary=salary*1.1 where salary<600 and sno=(select sno from dept where dname='销售部')
    3) select * from 
    (select * from emp where sno=(select sno from dept where dname='销售部') order by salary desc) c where rownum>=10;
    4) select dname,salary from emp e,dept d where  e.dno=d.dno and e.eno='001'
    5) 视图的作用:通过视图用户只能查询和修改他们所能见到的数据,简化用户对数据的理解,也可以简化他们的操作。
    create view v_emp_dept as 
       select * from emp e,dept d where e.dno=d.dno and dname='市场部'------第5个描述感觉有点问题,通常都是经理只能查询到自己下属的信息,但这就需要一个输入值,这用视图来做的话视乎又有点不合适
      

  2.   


    1)列出各部门中工资不低于600元的职工的平均工资
    select eno, avg(salary) salary
    from emp
    where salary >600 or salary=600
    group by eno2)将“销售部”的那些工资数额低于600的职工的工资上调10%
    update emp
    set salary =
    (select salary from emp,dept where emp.dno=dept.dno and dept.dname='销售部' and emp.salary<600) * 1.13)将“销售部”所有员工中工资排名前10名的人员列出来
    select enmae from (
    select ename,dense_rank()over(partition by emp.eno order by salary desc) rn
    from emp,dept
    where emp.dno=dept.dno and dept.dname='销售部'
    ) where rn < 114)列出部门经理职工号为“001” 的部门名称及该部门经理的工资
    select dname,salary
    from emp,dept
    where emp.dno = dept.dno and manager='001'5)简述视图的作用;创建一个视图,市场部经理只能看到本部门的员工信息
             1)提供各种数据表现形式, 可以使用各种不同的方式将基表的数据展现在用户面前, 以便符合用户的使用习惯(主要手段: 使用别名).
             2)隐藏数据的逻辑复杂性并简化查询语句, 多表查询语句一般是比较复杂的, 而且用户需要了解表之间的关系, 否则容易写错; 如果基于这样的查询语句创建一个视图, 用户就可以直接对这个视图进行"简单查询"而获得结果. 这样就隐藏了数据的复杂性并简化了查询语句. 这也是oracle提供各种"数据字典视图"的原因之一,all_constraints就是一个含有2个子查询并连接了9个表的视图(在catalog.sql中定义).
             3)执行某些必须使用视图的查询. 某些查询必须借助视图的帮助才能完成. 比如, 有些查询需要连接一个分组统计后的表和另一表, 这时就可以先基于分组统计的结果创建一个视图, 然后在查询中连接这个视图和另一个表就可以了.
            4)提供某些安全性保证. 视图提供了一种可以控制的方式, 即可以让不同的用户看见不同的列, 而不允许访问那些敏感的列, 这样就可以保证敏感数据不被用户看见.
            5)简化用户权限的管理. 可以将视图的权限授予用户, 而不必将基表中某些列的权限授予用户, 这样就简化了用户权限的定义.--首先需要给各个部门经理创建用户,用户名为该部门的部门编号
    create or replace view view_name
    as
    select emp.* from emp,dept where emp.dno=dept.dno and dept.manager in (select username from user_users)
    ;
      

  3.   

    1、  select dno,AVG(salary) from dbo.emp group by dno having AVG(salary)>600;
    2、 update dbo.emp set salary=salary+salary*0.1 where dbo.emp.salary<600 and dno=(select dno from dbo.dept where dname='销售部')
    3、select top 10 * from dbo.emp where dno=(select dno from dbo.dept where dname='销售部') order by salary desc
    4、select dname,salary from dbo.dept,dbo.emp where dbo.dept.dno=(select dno from dbo.emp where eno='001') and dbo.emp.eno='001'
      

  4.   

    这个好像是某公司的面试题。数据库的sql题本来就没神马难度