2015-11-13 137 views
0

这是数据库:中期解决方案SQL

EMPLOYEE (fmane, minit, lname, ssn, birthdate, address, sex, salary, superssn, dno)  KEY: ssn 
DEPARTMENT (dname, dnumber, mgrssn, mgrstartdate)    KEY: dnumber. 
PROJECT (pname, pnumber, plocation, dnum)       KEY: pnumber. 
WORKS_ON (essn, pno, hours)           KEY: (essn, pno) 
DEPENDENT (essn, dependent-name, sex, bdate, relationship)    KEY: (essn, dependent-name) 

问的问题是...

给最后的名字,谁在两个 或工作的未婚员工的SSN更多的项目。

SELECT e.Lname, e.ssn 
FROM Employee AS e 
WHERE e.ssn IN (
     SELECT w.essn 
     FROM works_on w 
     GROUP BY w.essn 
     HAVING count(*) >= 2 
     ) 
    AND e.ssn NOT IN (
     SELECT essn 
     FROM dependent 
     WHERE relationship = 'Spouse' 
     ); 

我的回答是错误的,因为我没有使用e.ssn NOT IN条款。

我的问题是:

1)什么是group by用于?严格只适用于作品?

2)关于FROM Employee AS e,是AS一个错字或命令?

3)having是否包含?它可以被其他命令取代吗?

回答

0

1)是的。该组通过出现在子选择

(
    select w.essn 
    from works_on w 
    group by w.essn 
    having count(*) >= 2 
) 

并且仅在那里有效。

2)“as”创建别名,在本例中为“employee”创建“e”。这可以让您避免在任何地方编写员工的繁琐。一些SQL数据库不需要“as”,但它通常是一个好主意,因为它使你的意图清晰。

3)“拥有”就像一个“Where”,它对一个group by子句的每个成员进行操作。 https://en.wikipedia.org/wiki/Having_%28SQL%29

+0

嘿杰夫如果你有时间你可以回答我有其他问题,我不能问另一个问题,但在Stackoverflow的问题 –

+0

有没有我可以达到你的电子邮件地址? –

+0

我用它来说,HAVING就像集合函数的WHERE。 – jarlh