조인문을 사용할 때 ON절을 이용해서 해당 조건으로 테이블을 조인합니다.
하지만 JOIN을 하기 위해 ON절이 아닌 WHERE절을 사용할 때도 있습니다.
같은 역할이나 ON절과 WHERE절의 차이는 있습니다.
📌 SQL문 순서
ON JOIN절이 추가된 SQL문의 순서는 FROM절 다음으로 진행됩니다.
즉 > ON절은 WHERE절보다 순서로 더 빠릅니다.
실제 쿼리를 실행했을 때 차이를 봅시다.
🔫 급여가 2000이 넘는 직원들의 부서번호, 부서명, 이름, 급여를 출력하세요.
Query01
FROM 절에서 Cartesian Product에 의한 조인에서 WHERE절에서 조건을 비교
SELECT
d.deptno
,d.dname
,e.ename
,e.sal
FROM dept d,emp e
WHERE d.deptno = e.deptno
AND e.sal > 2000;
Query02
deptno에 대한 조인 작업을 한 후 WHERE 절에서 sal에 대한 비교
SELECT
d.deptno
,d.dname
,e.ename
,e.sal
FROM dept d INNER JOIN emp e
ON d.deptno = e.deptno
WHERE e.sal > 2000;
Query03
ON절에서 조인할때 모든 조건을 비교
SELECT
d.deptno
,d.dname
,e.ename
,e.sal
FROM dept d INNER JOIN emp e
ON d.deptno = e.deptno AND e.sal > 2000;
Inner Join을 사용하는 경우 문제의 결과를 얻기 위해 위의 3가지 QUERY 어느것을 사용하든지 상관이 없습니다.
Inner Join은 존재하는 값에 대해서만 출력하기 때문에 조건의 위치나 테이블의 순서에 무관하게 같은 실행 계획으로 같은 값이 출력됩니다.
BUT ❗❗ Outer Join을 사용 시, 조건의 위치와 순서가 매우 중요해집니다.
💡 Cartesian Product (카티시안 곱)
발생가능한 모든 경우의 수의 행이 출력되는 것을 의미합니다.
N 개의 행을 가진 테이블과 M 개의 행을 가진 테이블의 카티시안 곱은 N*M 이 되는거죠!
이 현상은 조인 조건을 생략한 경우이거나 조인 조건이 부적합할 경우 발생합니다.
- 조인 조건을 생략한 경우
두 개의 테이블을 조인했지만 조인 조건을 생략한 경우 Cross Join이 발생하여 불필요한 N*M만큼의 데이터가 조회 => 데이터가 방대할 경우 CPU에 과부화 걸릴 수도 있다.
그러므로 Join을 사용할 경우 조인 조건을 꼭! 작성해야 한다!!
🔫 급여가 2000이 넘는 직원들에 대해 각 부서별 급여의 합을 구하세요.
참고 블로그
Join