非常基本的初学者SQL脚本

时间:2015-03-31 02:37:36

标签: mysql sql oracle

我需要帮助编写一些非常基本的SQL代码。我不需要复杂的代码,SQL的基础知识。我将首先编写我的数据库,然后在下面提出问题。

好的,我有以下四个表:

  • 分部(执行,dname,managerID)

  • 员工( empid ,姓名,工资,

  • 项目( pid ,pname,预算,做了

  • Workon( pid empid ,小时数)

文本为粗体是主键,斜体文本是外键。 Workon表连接员工和项目表。

以下是我的问题:

  1. 列出拥有/赞助项目员工的部门的名称' chen'继续努力。

    这就是我的......

    select pname, d.dname
    from project p, division d
    where pid in
         (select pid
          from employee e, workon w
          where e.empid=w.empid and lower (name) 'Chen')
    

    现在我知道这不完全正确,因为我认为我必须从Workon表中取出它,但我不确定如何。

  2. 列出其部门中薪水最低的员工姓名,并列出该员工正在处理的项目总数(使用相关子查询)。

    这就是我所拥有的

    select name, did, min(salary) as "lowest salary"
    from employee
    group by name, did
    order by did
    

    我也有这个代码..

    select did, min(salary)
    from employee
    group by did
    order by did
    

    我很困惑因为第一个代码不仅给了我这个部门的最低工资。 (如果你查看我写的第二个代码,它会显示平均值。)

  3. 列出比他/她的部门同事(相关子查询)执行更多项目的员工姓名。

    我有......

    select pname
    from project p, workon w
    where p.pid= w.pid
    group by pname
    having count (empid) >2
    

    我觉得这不应该超过2.它应该比同事更多,但我无法弄清楚如何写出来。

  4. 列出正在/正在处理的某些员工的项目名称低于部门平均工资。

    select dname 
    from division d, employee e
    where d.did= e.did 
    group by dname
    having avg(salary)>(select avg(salary) from employee)
    

    我认为这也不对,但我知道我差不多了

1 个答案:

答案 0 :(得分:0)

在SO上搜索TDQD以了解我如何进行测试驱动的查询设计。您可以在构建查询时测试查询的每个步骤,如果步骤出现问题,请采取适当的纠正措施以使查询正确。

我将解决您的第一个问题:

  • 列出赞助员工' chen'继续工作。

鉴于您尝试过的查询,我将假设您的DBMS支持函数LOWER(x),该函数将其参数中的所有字母转换为小写字母,只留下任何非字母。

一步一步,我们可能会提出:

1。员工&chen'

的员工ID
SELECT EmpID
  FROM Employee
 WHERE LOWER(Name) = 'chen'

2。员工' chen'适用于

SELECT W.PID
  FROM WorkOn   AS W
  JOIN Employee AS E
    ON E.EmpID = W.EmpID
 WHERE LOWER(E.Name) = 'chen'

3。分支机构的部门ID,赞助员工' chen'适用于

SELECT P.DID
  FROM Project  AS P
  JOIN WorkOn   AS W ON W.PID = P.PID
  JOIN Employee AS E ON E.EmpID = W.EmpID
 WHERE LOWER(E.Name) = 'chen'

4。赞助员工' chen'适用于

SELECT DISTINCT D.Dname
  FROM Division AS D
  JOIN Project  AS P ON P.DID = D.DID
  JOIN WorkOn   AS W ON W.PID = P.PID
  JOIN Employee AS E ON E.EmpID = W.EmpID
 WHERE LOWER(E.Name) = 'chen'

DISTINCT删除任何重复,如果' chen'在同一部门赞助的几个项目上工作。

您需要对问题中的其他查询应用类似的技巧。我不确定您是否需要任何相关的子查询。你可能需要在FROM子句中使用子查询,但是你不应该需要相关的子查询 - 当然是IMO。如果我花了足够长的时间,我可能会想出一个相关的子查询,但这样的查询不太可能像直接查询那样执行,并且可能更难以阅读(和写入)。您需要评估您的导师是否接受不使用相关子查询的正确答案(但确实产生了正确的答案)。