![sshhhh](https://t1.daumcdn.net/tistory_admin/static/manage/images/r3/default_L.png)
CROSS APPLY → INNER JOIN
OUTER APPLY → OUTTER JOIN
그러나, CROSS APPLY와 INNER JOIN, 그리고 OUTER APPLY와 OUTER JOIN은 같은 결과를 반환하지 않습니다.
- CROSS APPLY vs. INNER JOIN:
- CROSS APPLY: 왼쪽 테이블의 각 행에 대해 오른쪽 테이블의 서브쿼리를 실행하고, 조건에 맞는 결과를 반환합니다. 이 때, 오른쪽 서브쿼리는 왼쪽 테이블의 각 행에 대해 실행되므로, 왼쪽 테이블의 모든 행에 대한 조인이 발생할 수 있습니다. 따라서, 두 테이블 간의 관계가 매우 밀접하게 형성됩니다.
- INNER JOIN: 두 테이블 간의 조인 조건에 맞는 행만 반환합니다. INNER JOIN은 두 테이블 간의 관계를 확인하고, 해당 관계에 맞는 행만을 선택합니다. 따라서, 왼쪽 테이블과 오른쪽 테이블 간의 관계가 덜 밀접할 수 있습니다.
- OUTER APPLY vs. OUTER JOIN:
- OUTER APPLY: 왼쪽 테이블의 각 행에 대해 오른쪽 테이블의 서브쿼리를 실행하고, 조건에 맞는 결과를 반환합니다. 그러나 OUTER APPLY는 왼쪽 테이블의 각 행에 대해 오른쪽 테이블의 서브쿼리를 실행하지만, 조인 조건에 맞지 않는 경우에도 왼쪽 테이블의 결과를 모두 반환합니다. 따라서, 왼쪽 테이블의 각 행에 대한 오른쪽 테이블의 서브쿼리 결과가 반환됩니다.
- OUTER JOIN: 두 테이블 간의 조인 조건에 따라 결과를 반환합니다. OUTER JOIN은 왼쪽 테이블과 오른쪽 테이블을 조인하고, 조인 조건에 맞지 않는 경우에도 왼쪽 또는 오른쪽 테이블의 모든 결과를 반환합니다. 따라서, OUTER JOIN은 왼쪽 또는 오른쪽 테이블에 일치하지 않는 행을 반환할 수 있습니다.
요약하면, CROSS APPLY와 INNER JOIN은 왼쪽 테이블과 오른쪽 테이블 간의 관계 및 결과에 차이가 있으며, OUTER APPLY와 OUTER JOIN도 유사한 방식으로 동작하지만 결과가 다를 수 있습니다.
Departments 테이블:
| DepartmentID | DepartmentName |
|--------------|----------------|
| 1 | HR |
| 2 | IT |
| 3 | Sales |
Employees 테이블:
| EmployeeID | EmployeeName | Salary | DepartmentID |
|------------|--------------|--------|--------------|
| 1 | John | 5000 | 1 |
| 2 | Jane | 5500 | 1 |
| 3 | Bob | 6000 | 2 |
| 4 | Alice | 6500 | 2 |
| 5 | Eve | 7000 | 2 |
| 6 | Mike | 4500 | 3 |
| 7 | Lisa | 5000 | 3 |
위의 Departments 테이블은 부서 정보를 저장하며, Employees 테이블은 직원 정보를 저장합니다.
두 테이블은 DepartmentID 열을 사용하여 관계를 맺고 있으며, 각 부서에는 여러 직원이 속해 있습니다.
예제에서 사용된 쿼리는 Departments와 Employees 테이블을 활용하여 각 부서의 평균 급여를 계산하고,
각 부서와 해당 부서의 직원 정보를 결합하여 결과를 반환합니다.
"APPLY" 연산자의 특징 중 하나는 오른쪽 테이블의 서브쿼리나 함수에 왼쪽 테이블의 값을 인자로 전달할 수 있다는 점입니다. 이것은 "JOIN" 쿼리로는 구현하기 어려운 일부 작업에 유용합니다.
아래 예제와 실행 결과를 통해 이러한 특징을 이해해 보겠습니다.
예제:
다음은 "APPLY" 연산자를 사용하여 각 부서의 평균 급여를 구하는 예제입니다.
이 예제에서는 Departments 테이블과 Employees 테이블이 사용됩니다.
SELECT d.DepartmentName, e.EmployeeName, e.Salary, a.AvgSalary
FROM Departments d
OUTER APPLY (
SELECT AVG(Salary) AS AvgSalary
FROM Employees
WHERE DepartmentID = d.DepartmentID
) a
LEFT JOIN Employees e ON d.DepartmentID = e.DepartmentIDㄹ
1.OUTER APPLY를 사용하여 각 부서별로 평균 급여를 계산하고,
| AvgSalary |
|-----------|
| 5250 | (HR 부서의 평균 급여)
| 6175 | (IT 부서의 평균 급여)
| 4750 | (Sales 부서의 평균 급여)
2.LEFT JOIN을 통해 부서와 직원 정보와 결합 (WHERE DepartmentID = d.DepartmentID)
| DepartmentName | EmployeeName | Salary | AvgSalary |
|----------------|--------------|--------|-----------|
| HR | John | 5000 | 5250 |
| HR | Jane | 5500 | 5250 |
| IT | Bob | 6000 | 6175 |
| IT | Alice | 6500 | 6175 |
| IT | Eve | 7000 | 6175 |
| Sales | Mike | 4500 | 4750 |
| Sales | Lisa | 5000 | 4750 |
결과적으로 각 직원의 부서와 해당 부서의 평균 급여가 같은 행에 표시됩니다.
"APPLY" 연산자를 사용하면 서브쿼리나 함수 등을 오른쪽 테이블에서 실행하면서
왼쪽 테이블의 값을 활용할 수 있으므로,
특정한 상황에서는 "JOIN"으로 구현하기 어려운 작업을 수행하는 데 유용합니다.
SELECT d.DepartmentName, e.EmployeeName, e.Salary, a.AvgSalary
FROM Departments d
outer join (
SELECT AVG(Salary) AS AvgSalary
FROM Employees
WHERE DepartmentID = d.DepartmentID --join할땐 이렇게 사용불가함 : 서브쿼리 내에서 직접 참조x
) a
LEFT JOIN Employees e ON d.DepartmentID = e.DepartmentID