Disjoint5題
問題1:Disjoint
假設(shè)有一個名為 "Employee" 的表,包含以下列:
EmployeeID(整數(shù),主鍵)
Department(字符串)
Salary(浮點(diǎn)數(shù))
你的任務(wù)是編寫一個 SQL 查詢,找出工資在每個部門中都是最高的員工。也就是說,如果有兩個部門 A 和 B,那么 A 部門的最高工資員工和 B 部門的最高工資員工必須是不同的人(disjoint)。
問題1:Disjoint
要找出工資在每個部門中都是最高的員工,需要使用子查詢和GROUP BY語句來實(shí)現(xiàn)。具體的SQL查詢?nèi)缦拢?/p>
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" 表的基礎(chǔ)上,編寫一個 SQL 查詢,找出工資位于所有部門工資的前 10% 的員工。在這個情況下,一個員工可能同時滿足多個部門的條件(non-disjoint)。
問題2:Non-disjoint
要找出工資位于所有部門工資的前10%的員工,可以使用子查詢、ORDER BY和TOP語句來實(shí)現(xiàn)。具體的SQL查詢?nèi)缦拢?/p>
sql
SELECT TOP 10 PERCENT *
FROM Employee
ORDER BY Salary DESC;
上述查詢將按照工資(Salary)降序排序,并使用TOP 10 PERCENT篩選出工資位于所有部門工資的前10%的員工。
問題3:Disjoint Subquery
在上述 "Employee" 表的基礎(chǔ)上,編寫一個 SQL 查詢,列出那些既不在工資最高的10%員工中,也不在工資最低的10%員工中的人。這個問題需要你創(chuàng)建兩個互不相交(disjoint)的子查詢。
問題3:Disjoint Subquery
要列出既不在工資最高的10%員工中,也不在工資最低的10%員工中的人,可以使用兩個互不相交的子查詢來實(shí)現(xiàn)。具體的SQL查詢?nèi)缦拢?/p>
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
假設(shè)有另一個名為 "Project" 的表,包含以下列:
ProjectID(整數(shù),主鍵)
Department(字符串)
Budget(浮點(diǎn)數(shù))
在 "Employee" 和 "Project" 表的基礎(chǔ)上,編寫一個 SQL 查詢,列出那些既在擁有最高預(yù)算項(xiàng)目的部門工作,又在擁有最低預(yù)算項(xiàng)目的部門工作的員工。這個問題需要你創(chuàng)建一個非互斥(non-disjoint)的聯(lián)接。
問題4:Non-disjoint Join
要列出既在擁有最高預(yù)算項(xiàng)目的部門工作,又在擁有最低預(yù)算項(xiàng)目的部門工作的員工,可以使用非互斥的連接(JOIN)來實(shí)現(xiàn)。具體的SQL查詢?nèi)缦拢?/p>
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 表關(guān)聯(lián),第一個連接用于匹配擁有最高預(yù)算的項(xiàng)目所屬的部門,第二個連接用于匹配擁有最低預(yù)算的項(xiàng)目所屬的部門。然后通過WHERE子句篩選出既滿足擁有最高預(yù)算項(xiàng)目部門,又滿足擁有最低預(yù)算項(xiàng)目部門的員工。