본문 바로가기
Today I learned

2021 04 23 - sqlBooster JOIN JOIN JOIN

by soheemon 2021. 4. 23.

JOIN

INNER-JOIN

SQL의 WHERE절에는 필터 조건과 조인 조건이 존재한다.

필터 조건은 FROM 절의 테이블에서 필요한 데이터를 걸러내는 역할을 한다.

JOIN 조건은 두개의 테이블을 연결하는 역할을 한다.

필터 조건을 만족한 데이터만 조인에 참여한다. 또한 조인을 만족하는 데이터만 결과에 나올 수 있다.

같은 값을 가진 데이터끼리 조인하는것이 아니라, 조인 조건을 만족하는 데이터간에 조인이 이루어지는 것임을 명심하자.

여러 테이블간의 조인
  • 아무리 많은 테이블을 조인해도 결국은 두 데이터 지합의 조인을 계속하는것에 불과하다.
  • 테이블/필터링을 거친 테이블/두개의 데이터 집합을 조인한 결과 도 결국 데이터 집합이라고 불 수 있다.
  • 테이블 간의 관계를 이해하고 조인을 작성하자.
  • !!!! 필터링 조건과 JOIN조건이 마구 섞여서 헷갈릴 때에는 하나하나씩 JOIN전에 먼저 데이터집합을 필터링 한다음에, 그 다음에 조인을 해보자!
관계 차수에 따른 조인 결과 건수
  • 1:1 관계 조인 = 1건의 결과 발생
  • 1:M 관계 조인 = M건의 결과 발생
  • M:M 관계 조인 = M*M 결과 발생. -> 테이블 설계에 문제가 있거나 조인을 수행해서는 안되는 대상임! 주로 문제가 되는 JOIN 조건이다.
잘못 작성한 조인 (M:1:M 조인)
  • M:1:M의 관계는 조인이 아닌 UNION ALL을 사용하거나, M:1을 먼저 1로 만든 후 나머지 조인을 해야한다.
  • !!!! 잘못 조인해서 DISTINCT를 사용하는건 결과를 강제로 맞춘것이다..
  • 또는 모두 1로 만든 후 1:1:1 조인을 만들어야 한다.

OUTER JOIN

  • 기준 데이터 집합: 아우터 조인의 기준이 되는 집합 : 일단 모두 결과에 포함된다!
  • 참조 데이터 집합: 아우터 조인의 참조가 되는 집합 (+) : 기준 데이터 집합과 일치하는 애들만 포함된다.

기준 데이터 집합은 조인 조건을 만족하지 않아도 모두 결과에 포함된다. ( 단 where절의 필터 조건을 만족해야함!)

(+)가 붙은 쪽은 참조 데이터 집합이다.

기준 데이터 집합의 데이터를 모두 가져오되, 참조데이터 집합과 일치하는 결과가 없는 곳은 NULL로 채워준다.

OUTER-JOIN의 필터 조건

아우터 조인에서는 '참조 데이터 집합'의 필터 조건에도 (+)표시를 추가해야 한다. 추가를 안해도 돌아는 가지만, 결과가 서로 다르다.

WHERE CUS_ID (+) >= TO_DATE('20210101', 'YYYYMMDD')
  • 참조쪽 필터 조건에 (+) 사용 : 아우터 조인 전에 필터 조건이 사용된다! 필터로 한번 걸러주고 아우터 조인을 실행한다. (일반적인 경우다. 필터에 (+)를 빼야한다면 이너 조인을 사용하는것이 일반적이다.)
  • 사용 X : 아우터 조인을 하고 나서 조인 결과를 필터로 걸러준다.

 

OUTER JOIN을 하고나서 INNER JOIN을 하게될 때 문제가 발생하기도 한다.

예를들어, OUTER JOIN은 기준 데이터를 몽땅 가져와서 (그림에서는 A의 a컬럼)

참조 데이터와 조건에 일치하는 컬럼을 가져오는데(그림에서는 B.b컬럼)

이때 기준이 되는 A테이블의 a컬럼과 일치하는 B.b컬럼이 없을경우 B.b를 NULL로 채워준다.

 

이때 NULL이 들어갈 수 있는 B.b컬럼과 또다른 C테이블의 c결과와 JOIN을 할 경우에 문제가 생긴다. NULL과 NULL은 비교 할 수 없기 때문에 아우터조인에 결과가 있더라도, 이너조인의 결과로 아무런 결과가 나오지 않는다.

댓글