본문 바로가기

프로그래밍/오라클

[ORACLE] JOIN _ ON 과 WHERE _ 오라클 조인

[ORACLE] JOIN _ ON 과 WHERE _ 오라클 조인


Join의 정석  |  

1. Join 선택기준
2. On 과 Where 어디 조건을 줄 것인가?
3. Join결과에서 Group By 사용법 
4. 공통된 컬럼이 없는 경우 Join이 사용 가능한가? 
    가능하다면 그 기준은 어떻게 되는가?
5. Outer Join시 (Left, Right, Full Join)의 기준은?
6. 카타시안 곱은 도대체 뭐냐?



두번째, ON과 WHERE 조건을 어디에 줄 것 인가?

먼저, ON에 조건을 거는 것과 WHERE에 조건을 거는 것의 차이를 알아야합니다. ANSI 표준에 따른 코딩에서는 조인 조건을 ON절에 달아주고, WHERE절에는 검색조건을 달게 됩니다. 근데 문제는 ON절에 검색조건을 달아도 상관없다는 것이죠. 아래의 예제를 보면 제가 무슨 말을 하는지 단번에 이해가 되실겁니다. 




예제1. ON 과 WHERE 의 차이 1
-- ON에 조건
  SELECT  A.EMPNO, A.DEPTNO, B.DNAME, B.LOC
    FROM  EMP A
   INNER 
    JOIN  DEPT B
      ON  A.DEPTNO = B.DEPTNO
     AND  A.DEPTNO = 10;
-- WHERE에 조건     
  SELECT  A.EMPNO, A.DEPTNO, B.DNAME, B.LOC
    FROM  EMP A
   INNER 
    JOIN  DEPT B
      ON  A.DEPTNO = B.DEPTNO
   WHERE  A.DEPTNO = 10;     



결론부터 말하자면, 두 쿼리의 결과는 같습니다. 하지만, 내부 동작과정이 아예 다릅니다. 


ON에 조건을 거는 것은 애초에 시작이 다릅니다. 간단하게 살펴보겠습니다. ON절에 조건을 주면, 테이블을 합칠 때 조건이 걸려서 하나의 가상테이블(join된 결과)이 만들어집니다. 그와 반대로 WHERE절에 조건이 걸리면, 다 만들어진 테이블을 다시 훑으면서 해당 조건에 맞는 결과물을 반환하는 게 됩니다. 이는 OUTER JOIN에서 확연하게 차이를 보입니다.




예제1. ON 과 WHERE 의 차이 2

-- ON 절
  SELECT  A.EMPNO, A.DEPTNO, B.DNAME, B.LOC
    FROM  EMP A
    LEFT  OUTER 
    JOIN  DEPT B
      ON  A.DEPTNO = B.DEPTNO
     AND  B.LOC = 'NEW YORK';

-- WHERE 절     
  SELECT  A.EMPNO, A.DEPTNO, B.DNAME, B.LOC
    FROM  EMP A
    LEFT  OUTER
    JOIN  DEPT B
      ON  A.DEPTNO = B.DEPTNO
   WHERE  B.LOC = 'NEW YORK';


왼쪽은 ON절에 조건을 걸었을때, 오르쪽은 WHERE절에 조건을 걸었을 때 입니다. ON에 조건표기시, LEFT OUTER JOIN시 왼쪽 테이블에 있는 모든 컬럼을 출력후 그에 매칭이되는 값이 있으며 채워서 출력이되고, 아닌 것은 NULL로 표현되기에 14개의 결과가 나왔습니다. 반면에, 이미 14개의 결과를 가진 테이블을 만든 후 'NEW YORK' 조건을 걸어주면 그림처럼 3개의 결과가 나오게 됩니다. 


대부분 INNER JOIN을 사용해서 테이블을 만들기 때문에 별다른 차이를 못 느끼고 그냥 만들때가 많았는데, 공부하면서 명확히 구분하게 되었습니다. 어떤 목적을 갖고 데이터를 다루는지에 따라서 어떤 모양의 테이블을 만들어야 효율적인지 계속해서 공부해봅시다!!




*참고

튜닝에 있어서는 ON에 조건을 걸어주는 것이 좋다. 애초에 걸러서 테이블을 만드는 것과 다 만들어진 테이블을 다시 한 번 뒤적거리는 것은 수고로움이 다른 것이다. 기억하자!