我需要帮助编写一些非常基本的SQL代码。我不需要复杂的代码,SQL的基础知识。我将首先编写我的数据库,然后在下面提出问题。
好的,我有以下四个表:
分部(执行,dname,managerID)
员工( empid ,姓名,工资, )
项目( pid ,pname,预算,做了)
Workon( pid , empid ,小时数)
文本为粗体是主键,斜体文本是外键。 Workon表连接员工和项目表。
以下是我的问题:
列出拥有/赞助项目员工的部门的名称' 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表中取出它,但我不确定如何。
列出其部门中薪水最低的员工姓名,并列出该员工正在处理的项目总数(使用相关子查询)。
这就是我所拥有的
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
我很困惑因为第一个代码不仅给了我这个部门的最低工资。 (如果你查看我写的第二个代码,它会显示平均值。)
列出比他/她的部门同事(相关子查询)执行更多项目的员工姓名。
我有......
select pname
from project p, workon w
where p.pid= w.pid
group by pname
having count (empid) >2
我觉得这不应该超过2.它应该比同事更多,但我无法弄清楚如何写出来。
列出正在/正在处理的某些员工的项目名称低于部门平均工资。
select dname
from division d, employee e
where d.did= e.did
group by dname
having avg(salary)>(select avg(salary) from employee)
我认为这也不对,但我知道我差不多了
答案 0 :(得分:0)
在SO上搜索TDQD以了解我如何进行测试驱动的查询设计。您可以在构建查询时测试查询的每个步骤,如果步骤出现问题,请采取适当的纠正措施以使查询正确。
我将解决您的第一个问题:
鉴于您尝试过的查询,我将假设您的DBMS支持函数LOWER(x)
,该函数将其参数中的所有字母转换为小写字母,只留下任何非字母。
一步一步,我们可能会提出:
SELECT EmpID
FROM Employee
WHERE LOWER(Name) = 'chen'
SELECT W.PID
FROM WorkOn AS W
JOIN Employee AS E
ON E.EmpID = W.EmpID
WHERE LOWER(E.Name) = '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'
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。如果我花了足够长的时间,我可能会想出一个相关的子查询,但这样的查询不太可能像直接查询那样执行,并且可能更难以阅读(和写入)。您需要评估您的导师是否接受不使用相关子查询的正确答案(但确实产生了正确的答案)。