SQL 조인(JOIN) 사용법 총정리 (LEFT, RIGHT, INNER, OUTER) #1

|

SQL 조인 이란?

DB에서 SQL 을 통해값을 가져올 때 테이블을 연결시켜 가져올 필요가 있습니다.
이 때 사용하는 것이 조인 구문이며 테이블과 테이블을 연결하는 역할을 하고 있습니다.
데이터를 활용하는데 큰 활용 포인트가 됩니다.

조인(JOIN) 도식표

자주 사용하는 순서

  1. INNER JOIN (또는 JOIN)
    • 특징: 두 테이블에서 일치하는 레코드만 반환합니다.
    • 주로 사용되는 경우: 두 테이블의 교집합이 필요할 때, 예를 들어, 고객 정보와 주문 정보를 결합할 때 등.
  2. LEFT JOIN (또는 LEFT OUTER JOIN)
    • 특징: 첫 번째 테이블의 모든 레코드와 두 번째 테이블의 일치하는 레코드를 반환합니다.
    • 주로 사용되는 경우: 하나의 테이블의 레코드를 기반으로 다른 테이블의 정보를 가져올 때, 일치하지 않아도 첫 번째 테이블의 레코드는 유지되어야 할 때.
  3. RIGHT JOIN (또는 RIGHT OUTER JOIN)
    • 특징: 두 번째 테이블의 모든 레코드와 첫 번째 테이블의 일치하는 레코드를 반환합니다.
    • 주로 사용되는 경우: LEFT JOIN과 유사하나, 두 번째 테이블을 기준으로 첫 번째 테이블의 정보를 가져올 때 사용합니다.
  4. FULL JOIN (또는 FULL OUTER JOIN)
    • 특징: 두 테이블의 모든 레코드를 반환하며, 일치하지 않는 경우 NULL 값을 갖습니다.
    • 주로 사용되는 경우: 두 테이블의 전체 레코드를 결합해야 할 때 사용합니다. MySQL에서는 이 타입의 조인을 지원하지 않습니다.
  5. CROSS JOIN
    • 특징: 첫 번째 테이블의 모든 레코드에 두 번째 테이블의 모든 레코드를 결합합니다 (카르테지안 곱).
    • 주로 사용되는 경우: 모든 가능한 조합을 생성해야 할 때 사용됩니다.
  6. SELF JOIN
    • 특징: 테이블을 자기 자신과 조인합니다.
    • 주로 사용되는 경우: 계층적 또는 순차적 데이터를 처리할 때 주로 사용됩니다.

사용 시 주의사항

  • (INNER) JOIN: 두 테이블에서 일치하는 값을 가진 레코드를 반환합니다.
  • LEFT (OUTER) JOIN: A 테이블 전체 레코드와 A 테이블에 연결된 B 테이블의 레코드를 반환합니다.
  • RIGHT (OUTER) JOIN: B 테이블 전체 레코드와 B 테이블에 연결된 A 테이블의 레코드를 반환합니다.
  • FULL (OUTER) JOIN: 양쪽에 일치 항목이 있을 때 모든 레코드를 반환합니다.

모든 JOIN 을 사용할 때 INNER 혹은 OUTER 글자를 생략할 수 있습니다.
사용할 때 이를 주의하여 활용할 필요가 있습니다.

CROSS JOIN(카테시안 곱)

테이블 전체를 활용할 수 있는 CROSS JOIN 이 존재합니다.

전체 JOIN 설명

SELECT *
  FROM tableA a
  JOIN tableB b ON a.id = b.id

조인은 A 테이블과 B 테이블을 연결하는 과정을 이야기 합니다.
조금 더 활용해보자면 C 테이블을 연결하는 방법도 존재합니다.

SELECT *
  FROM tableA a
  JOIN tableB b ON b.id = a.id
  JOIN tableC c ON c.lv = b.lv 

지금 A 테이블 – B 테이블 – C 테이블 을 연결했습니다.
SELECT 조회를 하면 모든 테이블 열을 가져오게 됩니다. 이는 원하는 결과를 가져오는 방법이 아닙니다.

SELECT a.id, b.lv, c.key
  FROM tableA a
  JOIN tableB b ON b.id = a.id
  JOIN tableC c ON c.lv = b.lv 

이렇게 원하는 값만 출력할 수 있습니다.

LEFT JOIN

   SELECT DISTINCT a.id, b.lv, c.key
     FROM tableA a
LEFT JOIN tableB b ON b.id = a.id
LEFT JOIN tableC c ON c.lv = b.lv 

레코드에서 JOIN 하는 법에 따라 복수의 값으로 가져올 경우가 존재합니다.
이는 LEFT JOIN 을 했을 때 생기는데요, 중복된 값을 제거하려면
DISTINCT 를 활용하여 해결 할 수 있습니다.
이 연산은 리소스를 많이 사용할 수 있기 때문에 주의가 필요합니다.

  • LEFT JOIN 을 하면 다른 테이블의 값이 NULL 이어도 값을 일괄 출력하게 됩니다.
    그렇기 때문에 중복된 값이 출력이 될 수 있습니다.

LEFT JOIN 을 사용할 때 조인 되지 않는 레코드에 대한 NULL 처리를 신경써야 합니다.
예로 IS NULL 혹은 IS NOT NULL 을 사용하여 이러한 값을 필터링할 수 있습니다.

성능을 높이려면

  • JOIN 순서 : 일반적으로 조인을 할 때 순서를 잘 정해야 합니다.
    이는 성능 이슈에 연결되어 있습니다.
  • JOIN 연결 : JOIN 을 할 때 컬럼을 제대로 연결하지 않으면 값이 나오지 않을 수 있습니다.
  • SELECT * 최소화 : JOIN 조건을 명확하게 하는 것이 중요합니다.
    네트워크 대역폭을 절약하고, 데이터베이스의 부하를 줄여줍니다.

참조

댓글(1)

  1. helper

    테이블 별로 ,(콤마)를 이용한 조인도 있으니 참고하시면 좋을 것 같아요~

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다