Disjoint5题
问题1:Disjoint
假设有一个名为 "Employee" 的表,包含以下列:
EmployeeID(整数,主键)
Department(字符串)
Salary(浮点数)
你的任务是编写一个 SQL 查询,找出工资在每个部门中都是最高的员工。也就是说,如果有两个部门 A 和 B,那么 A 部门的最高工资员工和 B 部门的最高工资员工必须是不同的人(disjoint)。
问题1:Disjoint
要找出工资在每个部门中都是最高的员工,需要使用子查询和GROUP BY语句来实现。具体的SQL查询如下:
sql
SELECT E.*
FROM Employee E
WHERE Salary = ( SELECT MAX(Salary)
FROM Employee
WHERE Department = E.Department
GROUP BY Department
);
上述查询中,子查询部分计算每个部门的最高工资,然后外部查询通过WHERE子句将工资等于各自部门最高工资的员工筛选出来,以满足在每个部门中都是最高工资的条件。
问题2:Non-disjoint
在上述 "Employee" 表的基础上,编写一个 SQL 查询,找出工资位于所有部门工资的前 10% 的员工。在这个情况下,一个员工可能同时满足多个部门的条件(non-disjoint)。
问题2:Non-disjoint
要找出工资位于所有部门工资的前10%的员工,可以使用子查询、ORDER BY和TOP语句来实现。具体的SQL查询如下:
sql
SELECT TOP 10 PERCENT *
FROM Employee
ORDER BY Salary DESC;
上述查询将按照工资(Salary)降序排序,并使用TOP 10 PERCENT筛选出工资位于所有部门工资的前10%的员工。
问题3:Disjoint Subquery
在上述 "Employee" 表的基础上,编写一个 SQL 查询,列出那些既不在工资最高的10%员工中,也不在工资最低的10%员工中的人。这个问题需要你创建两个互不相交(disjoint)的子查询。
问题3:Disjoint Subquery
要列出既不在工资最高的10%员工中,也不在工资最低的10%员工中的人,可以使用两个互不相交的子查询来实现。具体的SQL查询如下:
sql
SELECT *
FROM Employee
WHERE EmployeeID NOT IN (
SELECT TOP 10 PERCENT EmployeeID
FROM Employee
ORDER BY Salary DESC
)
AND EmployeeID NOT IN (
SELECT TOP 10 PERCENT EmployeeID
FROM Employee
ORDER BY Salary ASC);
上述查询中,第一个子查询获取工资最高的10%员工的EmployeeID,第二个子查询获取工资最低的10%员工的EmployeeID。然后,通过WHERE子句筛选出既不在工资最高的10%员工中,也不在工资最低的10%员工中的员工。
问题4:Non-disjoint Join
假设有另一个名为 "Project" 的表,包含以下列:
ProjectID(整数,主键)
Department(字符串)
Budget(浮点数)
在 "Employee" 和 "Project" 表的基础上,编写一个 SQL 查询,列出那些既在拥有最高预算项目的部门工作,又在拥有最低预算项目的部门工作的员工。这个问题需要你创建一个非互斥(non-disjoint)的联接。
问题4:Non-disjoint Join
要列出既在拥有最高预算项目的部门工作,又在拥有最低预算项目的部门工作的员工,可以使用非互斥的连接(JOIN)来实现。具体的SQL查询如下:
sqlCopy code
SELECT E.*
FROM Employee E
JOIN Project P1 ON E.Department = P1.Department
JOIN Project P2 ON E.Department = P2.Department
WHERE P1.Budget = (
SELECT MAX(Budget)
FROM Project
)
AND P2.Budget = (
SELECT MIN(Budget)
FROM Project
);
上述查询中,使用两个连接(JOIN)将 Employee 表与 Project 表关联,第一个连接用于匹配拥有最高预算的项目所属的部门,第二个连接用于匹配拥有最低预算的项目所属的部门。然后通过WHERE子句筛选出既满足拥有最高预算项目部门,又满足拥有最低预算项目部门的员工。