본문 바로가기
ORACLE/Tunning

[Oracle] ON절과 WHERE절 조건 차이, JOIN 대상 차이

by 마이자몽 🌻♚ 2020. 8. 9.

ON절과 WHERE절 차이

조인문을 사용할때 ON절을 이용해서 해당 조건으로 테이블 조인을 하게됩니다. 그런데 JOIN을 하기 위해 ON절이 아닌 WHERE절에 사용할때도 있습니다. 같은 내용같지만 확실히 두가지 절의 차이는 있습니다. 이번 글에서는 ON절과 WHERE절의 차이와 어떤 상황에서 각각 사용해야하는지 알아보도록 하겠습니다.

 

 

SQL문 순서

ON JOIN 절이 추가된 SQL문의 순서는 FROM 절 다음으로 진행합니다. 즉 ON절은 WHERE절 보다 순서상으로 더 빠릅니다. 그럼 이게 실제 쿼리를 실행했을 때 어떤 차이가 있는지 확인해보겠습니다.

 

 

WHERE절 ON절 실습

OS : Red Hat Enterprise Linux Server release 6.3
DB : Oracle 12.1.0.2
user : scott

기본으로 주어지는 scott 계정의 테이블을 갖고 실습을 진행하겠습니다.

 

 

inner join

급여가 2000이 넘는 직원들의 부서번호, 부서명, 이름, 급여를 출력하시오.

 

QUERY1

SELECT
	d.deptno
	,d.dname
	,e.ename
	,e.sal
FROM dept d,emp e
WHERE d.deptno = e.deptno
AND e.sal > 2000;

QUERY2

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;

QUERY3

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;

동일한 RESULT

inner join을 사용하는 경우 문제의 결과를 얻기위해 위의 3가지 QUERY 어느것을 사용하든지 상관이 없습니다. QUERY1번의 경우 FROM 절에서 Cartesian Product에 의한 조인에서 WHERE절에서 조건을 비교하는 것이고, QUERT2에서는 deptno에 대한 조인 작업을 한 후 WHERE 절에서 sal에 대한 비교를 하는 것이고, QUERY3는 ON절에서 조인할때 모든 조건을 비교하는것입니다.

 

inner join은 존재하는 값에 대해서만 출력하기 때문에 조건의 위치나 테이블의 순서에 무관하게 같은 실행계획으로 같은 값이 출력됩니다. 하지만 outer join을 사용하게되면 조건의 위치와 순서가 매우 중요해집니다.

 

 

outer join

급여가 2000이 넘는 직원들에 대해 각 부서별 급여의 합을 구하시오.

 

QUERY1

SELECT d.deptno, sum(e.sal)
FROM dept d LEFT OUTER JOIN emp e
ON d.deptno = e.deptno
WHERE e.sal > 2000
GROUP BY d.deptno
ORDER BY d.deptno;

얼핏보면 정답같지만... SQL QUERY의 의도상 잘못된 정보를 갖고오고 있습니다. 뭐가 문제인지 확인하기 위해 조인된 테이블의 결과만 확인해보겠습니다.

 

SELECT *
FROM dept d LEFT OUTER JOIN emp e
ON d.deptno = e.deptno;

outer join을 사용하는 의도는 특정 테이블의 모든 값이 포함된 결과를 보기 위해서 입니다. dept 테이블에는 40번 부서가 존재하는데 emp테이블상으로 현재 40번 부서에 소속되어있는 직원이 없습니다. 하지만, 결과로 40번부서도 함께 표시되도록하는 것이 문제의 목적입니다.

 

QUERY1의 경우, deptno로 조인을 하고 WHERE절에서 2000이 초과되는 직원들을 필터링합니다. 이때 40번 부서의 행은 sal값이 null이기 때문에 비교조건에서 해당 행을 지워버립니다. 그래서 최종적으로 40번 부서가 없는 결과를 출력하게됩니다.

40번 부서도 함께 보이기 위해 아래의 SQL QUERY처럼 출력하면 됩니다.

 

QUERY2

SELECT d.deptno, sum(e.sal)
FROM dept d LEFT OUTER JOIN emp e
ON d.deptno = e.deptno AND e.sal > 2000
GROUP BY d.deptno
ORDER BY d.deptno;

QUERY2는 ON절에 해당 2000 초과 조건을 명시합니다. 즉 JOIN할때 해당 조건을 처리하고 outer join이기 때문에 dept에 존재하고 emp에는 존재하지 않는 결과도 함께 출력하게됩니다.

 

ON절과 WHERE절의 차이는 outer join을 사용했을때 확실히 확인이 가능합니다. ON절의 조건으로 조인되는 결과가 달라지고 조건을 비교하는 대상이 달라지니 확실한 차이를 알아두고 QUERY 작성이 필요합니다.

 

태그

,

댓글0