sol 개발 블로그 로고
Published on

Join 개념 정리

Authors
  • avatar
    Name
    Chan Sol OH
    Twitter

목차

관계형 데이터베이스

데이터베이스를 세세하게 정규화해놓고 외래키와 후보키로 관계시켜놓으면 데이터 무결성을 높이고 중복 데이터를 최소화할 수 있다. 또한 무결성 규칙을 강제해서 데이터 일관성을 유지하기 쉽다. 이렇게 정규화된 여러 테이블 데이터를 한번에 불러오는 것은 JOIN을 통해 수행할 수 있다.

SQL Join Visualizer를 이용하면 벤다이어그램의 형태로 join의 결과물을 예상해볼 수 있다. 예를 들어 INNER JOIN은 교집합의 내용이 출력되는 것을 확인할 수 있다.

sql inner join

LEFT JOIN

가장 인기있는 join!

LEFT OUTER JOIN은 아래 그림처럼 두개 테이블이 있을 때, 교집합과 A에만 있는 정보를 함께 출력할 때 사용한다. 당연히 LEFT JOIN은 교집합을 제외하고 A에만 있는 정보를 출력할 것이다.

두 테이블 간 온전히 맞지 않는 부분이 존재한다면, LEFT OUTER JOIN과 LEFT JOIN의 결과가 달라질 것이다. 예를 들어 댓글 테이블에는 저자 id가 1부터 2까지 있고, 익명 댓글이 있으며, 저자 테이블에 1부터 3번 저자가 있다면?

  • LEFT JOIN 결과는 댓글 테이블과 1, 2번 저자 정보를 가져오고 익명 저자 데이터는 가져올 수 없으므로 null로 출력한다.
  • LEFT OUTER JOIN 결과는 1번부터 3번까지 저자 정보를 가져오고 익명 저자 데이터는 가져올 수 없으므로 null로 출력한다. 그리고 3번 저자의 댓글은 없으므로 null로 출력한다.

RIGHT와 RIGHT OUTER JOIN도 동일하지만, 보통 LEFT (outer) JOIN으로 환원시켜서 쓴다.

INNER JOIN

INNER JOIN은 A, B 테이블 모두에 있는 데이터를 출력하기 때문에 null 행이 만들어지지 않는다.

sql inner join

다시 댓글 테이블과 저자 테이블을 INNER JOIN하게 되면 1,2번 저자의 정보와 댓글만 출력한다.

FULL OUTER JOIN

양쪽 모든 행을 출력할 때 FULL OUTER JOIN을 하게된다. 그리고 대부분의 DBMS는 FULL OUTER JOIN을 지원하지 않기 때문에 여러 sql문을 조합해서 구현해야한다.

  1. LEFT JOIN 수행
  2. RIGHT JOIN 수행
  3. 1번 결과와 2번 결과를 UNION DISTINCT 하여 결과를 합침
    • DISTINCT는 두 부분에서 중복되는 부분(ex, 1,2번 저자정보와 댓글)을 제거
  4. 최종적으로 교집합과 A에만 있고, B에만 있는 데이터가 전부 출력된다.