sql 中没有功能,被经理和员工搞糊涂了
not in feature in sql, confused by manager and employee
EMPLOYEE
(fmane, minit, lname, ssn, birthdate, address, sex, salary, superssn, dno);密钥:ssn
DEPARTMENT
(dname, dnumber, mgrssn, mgrstartdate);键:dnumber.
PROJECT
(pname, pnumber, plocation, dnum);关键:pnumber.
WORKS_ON
(essn、pno、小时数);关键:(essn,pno)
DEPENDENT
(essn, dependent-name, sex, bdate, relationship); KEY: (essn, dependent-name)
假设我想获取那些不在克利夫兰的任何项目中工作的经理的姓氏和 SSN。
正确答案是:
select
Lname
from
Employee e, Department d
where
(e.ssn = d.mgrssn)
and ssn NOT in (select w.essn
from works_on w, Project p
where w.pno = p.pnumber
and p.plocation = 'Cleveland')
那么(e.ssn = d.mgrssn)
是什么意思呢? mrgrssn 是经理的 ssn 吗?如果是这样,为什么不只是 select 它,而是使用 e.ssn = mgrssn?
我知道ESS不是什么意思,但是为什么不用mgrssn就不行呢?因为我们要找的是经理,而不是员工
最后为什么加了where w.pno = p.pnumber
,问题没有具体问pnummber,只是location
我们将两个不同表中的经理 ssn 等同起来。这样就可以检索相关数据,pno 也会发生同样的情况。也就是说,要找到所需查询的结果,我们需要找到它们之间的某种关系。这就是这种情况下发生的情况。
- 经理的 ssn 在部门 table。您必须将其加入 employee 才能获得 LName。
- 您可以使用 mgrssn NOT IN 而不是 ssn NOT IN,因为您要在 e.ssn = d.mgrssn 处获取记录。两个值将始终相同
- 位置是项目 table 的一部分,而不是 works_on。但是您需要 works_on 将项目与员工相关联。因此,两个 table 都必须加入。
理解复杂查询的最佳方式是从内到外。所以:
3) 我们 select 位置为 'Cleveland' 的所有项目,加入了在每个项目中工作的员工列表,以获取在克利夫兰工作的员工的 SSN 列表.
1) 我们将部门经理的 SSN 加入到员工的 SSN 中,以获得所有部门经理的姓氏。
2) 然后我们 select 那些 SSN 不在 在克利夫兰工作的员工名单的员工(他们都是第 1 步中的经理) (来自我们首先查看的第 3 步。)
在第 2 步中,我们需要经理的姓氏。经理 SSN 在 department
中,但姓名不在,因此我们需要加入 employee
才能获得这些姓名。
在第 3 步中,我们加入项目编号,因为这是在 works_on
中识别员工的方式。
EMPLOYEE
(fmane, minit, lname, ssn, birthdate, address, sex, salary, superssn, dno);密钥:ssnDEPARTMENT
(dname, dnumber, mgrssn, mgrstartdate);键:dnumber.PROJECT
(pname, pnumber, plocation, dnum);关键:pnumber.WORKS_ON
(essn、pno、小时数);关键:(essn,pno)DEPENDENT
(essn, dependent-name, sex, bdate, relationship); KEY: (essn, dependent-name)
假设我想获取那些不在克利夫兰的任何项目中工作的经理的姓氏和 SSN。
正确答案是:
select
Lname
from
Employee e, Department d
where
(e.ssn = d.mgrssn)
and ssn NOT in (select w.essn
from works_on w, Project p
where w.pno = p.pnumber
and p.plocation = 'Cleveland')
那么
(e.ssn = d.mgrssn)
是什么意思呢? mrgrssn 是经理的 ssn 吗?如果是这样,为什么不只是 select 它,而是使用 e.ssn = mgrssn?我知道ESS不是什么意思,但是为什么不用mgrssn就不行呢?因为我们要找的是经理,而不是员工
最后为什么加了
where w.pno = p.pnumber
,问题没有具体问pnummber,只是location
我们将两个不同表中的经理 ssn 等同起来。这样就可以检索相关数据,pno 也会发生同样的情况。也就是说,要找到所需查询的结果,我们需要找到它们之间的某种关系。这就是这种情况下发生的情况。
- 经理的 ssn 在部门 table。您必须将其加入 employee 才能获得 LName。
- 您可以使用 mgrssn NOT IN 而不是 ssn NOT IN,因为您要在 e.ssn = d.mgrssn 处获取记录。两个值将始终相同
- 位置是项目 table 的一部分,而不是 works_on。但是您需要 works_on 将项目与员工相关联。因此,两个 table 都必须加入。
理解复杂查询的最佳方式是从内到外。所以:
3) 我们 select 位置为 'Cleveland' 的所有项目,加入了在每个项目中工作的员工列表,以获取在克利夫兰工作的员工的 SSN 列表.
1) 我们将部门经理的 SSN 加入到员工的 SSN 中,以获得所有部门经理的姓氏。
2) 然后我们 select 那些 SSN 不在 在克利夫兰工作的员工名单的员工(他们都是第 1 步中的经理) (来自我们首先查看的第 3 步。)
在第 2 步中,我们需要经理的姓氏。经理 SSN 在 department
中,但姓名不在,因此我们需要加入 employee
才能获得这些姓名。
在第 3 步中,我们加入项目编号,因为这是在 works_on
中识别员工的方式。