讓我們深入研究兩種方法的執行流程:內嵌視圖方法和相關子查詢方法。了解這些查詢的逐步執行將有助於闡明 SQL 如何處理每個場景以獲得所需的結果。
內嵌視圖方法使用 FROM 子句中的子查詢建立臨時結果集(內聯視圖),然後在外部查詢中處理。
查詢:
選擇部門 ID,MAX(薪水)為最高薪水
來自 (
選擇部門 ID、薪資
來自員工
) AS 內聯視圖
按部門 ID 分組;
執行步驟:
先執行內部查詢(SELECT DepartmentId, Salary FROM Employee)。
它從 Employee 表中選擇 DepartmentId 和 Salary 欄位。
此步驟本質上建立一個臨時結果集(內聯視圖),其中包括 Employee 表中的所有行,但僅包含 DepartmentId 和 Salary 列。
內部查詢結果範例:
建立內嵌視圖(暫存結果集)後,外部查詢會取得該結果集並使用 MAX(Salary) 函數進行聚合。
GROUP BY DepartmentId 確保計算每個部門的最高工資。
外部查詢掃描內嵌檢視中的行並根據 DepartmentId 對行進行分組。然後,它計算每個組的最高工資。
查詢返回各部門的最高薪資。
最終結果:
執行流程摘要:
執行內部查詢以建立內聯視圖。
外部查詢聚合(使用 MAX)並按 DepartmentId 分組結果。
傳回最終結果。
在相關子查詢方法中,內部子查詢針對外部查詢中的每一行執行,使其更加動態,但可能比內聯視圖方法慢。
查詢:
選擇部門 ID、員工 ID、薪資 AS HighestSalary
來自員工 e
工資 = (
選擇最高(薪資)
來自員工
WHERE DepartmentId = e.DepartmentId
);
執行步驟:
外部查詢首先讀取 Employee 表中的每一行。
對於 Employee 表中的每一行,查詢都會檢索 DepartmentId、EmployeeId 和 Salary。
外部查詢的逐行處理範例:
對於外部查詢中的每一行,都會執行內部查詢 (SELECT MAX(Salary) FROM Employee WHERE DepartmentId = e.DepartmentId)。
子查詢計算目前行DepartmentId對應的部門的最高工資。
外查詢和子查詢之間的關聯是透過 DepartmentId 條件進行的 (WHERE DepartmentId = e.DepartmentId)。
例如:
對於 EmployeeId = 1 的行,子查詢計算 DepartmentId = 101 的最高工資,即 6000。
對於 EmployeeId = 3 的行,子查詢計算 DepartmentId = 102 的最高工資,即 7500。
每行子查詢的執行範例:
計算出對應DepartmentId的最高薪資後,外層查詢將目前行的Salary與子查詢傳回的最高薪資進行比較。
如果薪資與部門的最高薪資相符,則保留該行。
不匹配的行將被過濾掉。
例如:
EmployeeId = 2 的行將被保留,因為其薪資 6000 與部門 101 的最高薪資相符。
EmployeeId = 1 的行將被過濾掉,因為其薪資 5000 小於部門 101 的最高薪資。
外部查詢傳回員工薪資與其部門最高薪資相符的行。
最終結果:
執行流程摘要:
對於外部查詢中的每一行,執行內部相關子查詢。
子查詢計算目前DepartmentId的最高工資。
將員工的薪資與子查詢的結果進行比較。
過濾並傳回員工薪資與其部門最高薪資相符的行。
実行フローの主な違い:
パフォーマンスに関する考慮事項:
詳細な従業員情報を必要とせず、各部門の最高給与のみに関心がある場合は、インライン表示方法がより効率的です。データの単一パスで集計を実行します。
相関サブクエリ方式は、外部クエリのすべての行に対してサブクエリを実行し、多くの冗長な計算が発生する可能性があるため、大規模なデータセットでは速度が低下する可能性があります。ただし、部門の最高給与と詳細な従業員情報 (従業員 ID、名前など) の両方を取得できます。
以上是SQL中的內聯視圖方法和相關子查詢的詳細內容。更多資訊請關注PHP中文網其他相關文章!