注册 登录
编程论坛 SQL Server论坛

刚学数据库,遇到一道关于数据库sql语句的题目,实在不会,请高手帮忙解惑,谢谢!

WF1120034357 发布于 2011-03-24 14:03, 1154 次点击
EMPLOYEE(ESSN,Ename,Sex,Salary,Dnumber),其中ESSN是主键, 存储员工的信息,包括社会保险号、姓名、工资、所属部门号
DEPARTMENT(Dnumber,Dname,MgrSSN) 其中Dnumber是主键,存储部门信息,包括部门编号、名称、经理社会保险号
PROJECT(Pnumber,Pname,Pcity) 其中Pnumber是主键,存储项目的信息,包括项目编号、名称、所在城市
WORKS_ON(Pnumber,ESSN,Wdate,Hours) 其中Pnumber、ESSN、Wdate是主键,存储某员工在某日为某项目工作的时间

请用SQL语句实现下面计算:
(1)求工资高于其所在部门平均工资的职工姓名
(2)求至少在三个不同项目中工作过的职工姓名
(3)建立视图DeptPro(Dnumber,Pnumber,Thours),表示每个部门的所有职工在每个项目中的工作总时数。并利用该视图,求在项目'Middleware'中工作时数最多的部门名称。
8 回复
#2
jinanshui2011-03-24 20:26
查询平均成绩大于的所有学生的学号、姓名和平均成绩   
 select Sname,SC.S# ,avg(score)     from Student,SC     where Student.S#=SC.S# group by SC.S#,Sname having    avg(score)>85;
#3
WF11200343572011-03-24 23:17
我自己搞定了
(1)SELECT Ename, Dnumber, Salary FROM EMPLOYEE
JOIN
(SELECT Dnumber, avg(Salary) AS Asalary FROM EMPLOYEE
GROUP BY Dnumber) A
ON Dnumber = A.Dnumber
WHERE Salary > A.Asalary
ORDER BY Dnumber
#4
png2011-03-24 23:50
没测试 - -  表设计的好, 问题提得好.  是哪本书上的内容么? 能告知书名么?

(1)     select    Ename
        from      EMPLOYEE A
        where     Salary > (    select avg(Salary)
                                from   EMPLOYEE B
                                where  B.Dnumber = A.Dnumber
                            )                                -- check on Correlated Subquery

(2)     

       select     Ename
       from       EMPLOYEE
       where      ESSN in
                  (
                   select ESSN
                   from ( select     Pnumber, ESSN
                          from       WORKS_ON
                          group by   Pnumber, ESSN
                         ) TempTB                           -- single out Pnumber, ESSN pairs
                   group by ESSN
                   having count(*) > 2                      -- filter
                  )

(3.1)
    create view DeptPro
    as
    (
      select    E.Dnumber, W.Pnumber, sum(W.Hours) as Thours
      from      WORKS_ON W join EMPLOYEE E on W.ESSn = E.ESSN
      group by  E.Dnumber, W.Pnumber
    )

(3.2)
    select    D.Dname
    from      DeptPro DP join DEPARTMENT D on DP.Dnumber = D.Dnumber
    where     DP.Pnumber = (Select Pnumber from PROJECT where Pname = 'Widdleware')  -- specific project
              and
              DP.Thours =
                        ( select max(Thours)
                          from DeptPro
                          where Pnumber = (Select Pnumber from PROJECT where Pname = 'Widdleware')  
                         )                                           -- max hours for the specific project  
   
#5
png2011-03-25 01:34
回复 3楼 WF1120034357
(1) 用 JOIN 也很好.
#6
WF11200343572011-03-25 13:51
感谢png的回答。这道题是一道研究生入学考试数据库笔试题,是哪本书上的我也不清楚。
再请问一下上题中用‘关系代数’表示至少在两个位于南京的项目中工作过的职工社会保险号该如何写。
我写了一个,但是感觉很烦,不知道有没简化的。
我是先求出一个在南京工作的职工社会保险号的关系,然后把两个这样的关系进行乘积然后选择出社会保险号一样,项目号不一样的,再投影到社会保险号。
我想知道有没有简单点的写法。
#7
png2011-03-25 22:24
回复 6楼 WF1120034357
多谢关于问题出处的回答.  不好意思,不懂什么是"关系代数".
#8
lsyrhz2011-03-27 13:34
select ename from employee
where salary>(select avg(salary) from employee)
group by dnumber;
我也是刚学数据库,这个也不知道对不对?如果错了请你告诉我
大家相互学习,相互促进!这样中国的IT界才能得到更好的发展!
#9
WF11200343572011-03-27 23:48
有点问题 你参看一下4楼的回答
1