【问题标题】:Can you explain these 2 SQL queries to me?你能向我解释一下这两个 SQL 查询吗?
【发布时间】:2017-03-30 05:09:32
【问题描述】:

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

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

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 试图对前面的子查询做什么。如果有人可以解释这一点,那就太好了。

【问题讨论】:

  • 永远不要使用逗号连接语法。并查看相关子查询和非相关子查询。
  • 您使用的是 MySQL 还是 MS SQL Server? (不要标记未涉及的产品。)

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


【解决方案1】:
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

【讨论】:

    【解决方案2】:

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

    对于第二个问题,这样想:选择一个员工,其中员工编号[Ssn] 员工ID [Essn] 列表中,该员工ID [Essn] 通过子查询返回每个给定的员工编号[Ssn] ]。这应该可以正常工作。但是,因为 Essn 和 Dependent Name 都是 Dependent 表的键,所以您也可以使用简单的连接语句来完成它。在这里阅读:http://www.w3schools.com/sql/sql_join.asp

    【讨论】:

    • 感谢@Strawberry 启发我
    【解决方案3】:

    对于 Q13:您需要在 WHERE 子句中再包含一个条件,说明 Works_onProject 之间的关系,即

    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:使用相关子查询

    【讨论】:

      猜你喜欢
      • 2022-10-13
      • 2022-07-06
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      相关资源
      最近更新 更多