你能解释一下这两个SQL查询吗?

时间:2016-11-16 05:34:24

标签: mysql sql sql-server database database-design

我正在攻读我的数据库考试,该考试涵盖了我需要手工编写的大量SQL语句。下面是我的书中概述的2个场景的架构图和解决方案,这些场景对我来说似乎没有意义。

enter image description here

问题13:检索在ProductX项目中每周工作超过10小时的部门5中所有员工的姓名。

SELECT FNAME, LNAME
FROM EMPLOYEE,PROJECT, WORKS_ON
WHERE DNO = 5 AND PNAME = ‘PRODUCT X’ AND HOURS>10 AND ESSN=SSN; 

WHERE 子句不应包含 PNO = NUM​​BER 吗? WORKS_ON 表如何知道引用 PROJECT 表而不包含此内容?是因为我们引用了ESSN = SSN吗?

Q1:检索具有相同名字且与员工性别相同的受抚养人的每位员工的姓名。

SELECT E.FNAME, E.LNAME
FROM EMPLOYEE AS E
WHERE E.SSN IN (SELECT D.ESSN FROM DEPENDENT AS D WHERE E.FNAME = D.DEPENDENT_NAME AND D.SEX = E.SEX);

我一直理解这个查询,直到 WHERE 子句。我不明白 E.SSN IN 正在尝试使用之前的子查询。如果有人可以解释这一点,那就太好了。

3 个答案:

答案 0 :(得分:1)

对于Q13:您需要在 WHERE 子句中再包含一个条件,该条件告诉 Works_on 项目之间的关系,这是

SELECT FNAME, LNAME
FROM EMPLOYEE,PROJECT, WORKS_ON
WHERE Pno = Pnumber AND DNO = 5 AND PNAME = ‘PRODUCT X’ AND HOURS>10 AND ESSN=SSN;

Q1:使用相关子查询

答案 1 :(得分:1)

对于第一个问题,是的,你猜对了。应该有另一个条款 PNO = NUM​​BER

对于第二个问题,请以这种方式考虑:选择员工编号[Ssn] 在每个给定员工编号的子查询返回的 employeeIDs [Essn]列表中的员工[Ssn ]。这应该工作正常。但是,因为Essn和Dependent Name都是Dependent表的键,所以您也可以使用简单的join语句来完成它。在此处阅读:http://www.w3schools.com/sql/sql_join.asp

答案 2 :(得分:0)

SELECT E.FNAME, E.LNAME
FROM EMPLOYEE E
INNER JOIN WORKS_ON WO
ON WO.Essn = E.Ssn
INNER JOIN PROJECT P
ON P.Pnumber = WO.Pno
where E.DNO = 5 
and P.name = 'ProductX'
and WO.Hours > 10