Blog
스터디
CS Study with SON
11
데이터베이스 조인

출처 - https://github.com/jmxx219/CS-Study (opens in a new tab)

DB JOIN


JOIN


개념

  • 두 릴레이션으로부터 관련된 튜플들을 결합하여 하나의 튜플로 만드는 가장 대표적인 데이터 연결 방법

목적

  • 둘 이상의 테이블을 결합해 하나의 테이블처럼 사용
  • 두 개 이상의 릴레이션을 갖는 관계 데이터 베이스에 대해서 릴레이션들 간의 관계를 처리할 수 있음

특성

  • 데이터베이스에서 테이블 분리로 데이터 중복 최소화데이터의 일관성 유지

  • 질의 처리에서 가장 시간이 많이 소요되는 연산 중 하나

  • 어떤 조인 방향이나 조인 방법을 선택할 지라도 결과 집합은 동일하나, 조인하고자 하는 두 집합의 데이터 상황에 따라 조인방향, 조인 방법에 따른 수행 속도의 영향이 큼



DB Join의 종류

INNER JOIN과 OUTER JOIN

  • JOIN은 크게 INNER JOIN과 OUTER JOIN으로 구분된다

    • INNER JOIN : INNER JOIN, CROSS JOIN, EQUI JOIN, NON-EQUI JOIN, NATURAL JOIN
    • OUTER JOIN : LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN
  • OUTER JOIN

    • 두 테이블 간의 교집합이 되는 데이터뿐만 아니라 해당되지 않는 값까지 가져옴
    • 드라이빙 테이블이 필요하다
      • 기준 테이블(드라이빙 테이블)의 모든 정보는 가져옴
      • 대상 테이블은 기준 테이블과 연결되는 행을 포함하는 정보 가져옴
    • 데이터의 개수: 기준이 되는 테이블의 데이터 수
    • 일반적으로 LEFT(RIGHT) JOIN과 LEFT(RIGHT) OUTHER JOIN은 같은 의미로 사용한다

드라이빙 테이블 : 처음으로 가져오는, 기준이 되는 테이블



대표적인 DB JOIN


INNER JOIN

  • ( A ∩ B )
  • 테이블 간 JOIN 조건을 만족하는 행만 반환
    • 공통적인 부분만 SELECT
  • 데이터의 개수 : 데이터의 교집합 부분
  • MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미로 사용 됨
  • 어느 테이블을 기준으로 JOIN하든 JOIN관계에 부합하는 레코드를 모두 가짐
SELECT A.ID, A.ENAME, A.KNAME
FROM A INNER JOIN B
ON A.ID = B.ID;


LEFT (OUTER) JOIN

  • ( (A ∩ B) ∪ (A - B) )

  • 조인 기준이 왼쪽으로, 왼쪽 테이블은 모두 SELECT 됨

    • 왼쪽 테이블 + 교집합
  • 왼쪽 테이블의 모든 레코드가 결과에 포함되며, 오른쪽 테이블에서 일치하는 레코드가 없는 경우에는 NULL 값으로 채워짐

  • EXCLUSIVE LEFT JOIN

    • 왼쪽 테이블의 데이터만 가져오는 것
SELECT A.ID, A.ENAME, A.KNAME
FROM A LEFT OUTER JOIN B
ON A.ID = B.ID;


RIGHT (OUTER) JOIN

  • ( (A ∩ B) ∪ (A - B) )
  • 조인 기준이 오른쪽으로, 오른쪽 테이블은 모두 SELECT 됨
    • 오른쪽 테이블 + 교집합
  • 오른쪽 테이블의 모든 레코드가 결과에 포함되며, 왼쪽 테이블에서 일치하는 레코드가 없는 경우에는 NULL 값으로 채워짐
SELECT A.ID, A.ENAME, A.KNAME
FROM A RIGHT OUTER JOIN B
ON A.ID = B.ID;


EXCLUSIVE JOIN

위 그림의 LEFT, RIGHT JOIN에서 초승달 모양에 해당하는 JOIN

  • 어느 특정 테이블에 있는 레코드만 가져오는 것
  • 두 테이블 조인시, 둘 중 한가지 테이블에만 있는 데이터를 가져옴
    • 왼쪽/오른쪽 테이블 - 교집합
  • 별도의 EXCLUSIVE JOIN함수가 존재하는 것이 아닌 LEFT, RIGHT JOIN과 WHERE절의 조건을 함께 사용해 만드는 조인 문법
SELECT A.ID, A.ENAME, A.KNAME
FROM A LEFT OUTER JOIN B
ON A.ID = B.ID;
WHERE B.ID IS NULL  // 조인한 B 테이블의 값이 null만 출력 >> 조인이 안된 A 레코드 나머지값만 출력

LEFT, RIGHT JOIN시 주의점

  1. INNER JOIN과는 달리 조인하는 테이블의 순서가 상당히 중요하다.
  2. 조인 순서의 일관성을 위해 LEFTRIGHT JOIN을 쓰다가 갑자기 INNER JOIN 이나 다른 조인을 사용하지 않는다.


FULL OUTER JOIN

  • 두 개의 테이블에서 일치하는 레코드뿐만 아니라 양쪽 테이블에 일치하지 않는 레코드도 모두 포함하는 JOIN 연산
  • 일치하는 레코드가 없는 경우에도 NULL 값으로 채워짐
  • 대부분의 DB는 FULL OUTER JOIN을 지원하지 않는다
    • 하지만 간접적으로 구현하는 방법이 존재한다 (LEFT 조인한 테이블과 RIGHT조인한 테이블을 UNION 합집합)

FULL OUTER JOIN

SELECT *
FROM A FULL OUTER JOIN B
ON A.ID = B.ID;

LEFT 조인한 테이블과 RIGHT조인한 테이블을 UNION 합집합으로 구현

SELECT * from A LEFT JOIN B on A_ID = B.ID
UNION
SELECT * from A RIGHT JOIN B on A_ID = B.ID


UNION JOIN

  • 여러개의 SELECT문의 결과를 하나의 테이블이나 결과 집합으로 합치는 연산
  • 각각의 SELECT문으로 선택된 필드의 개수타입은 모두 같아야하며 필드순서 또한 같아야함
  • 중복된 행을 제거하고 유일한 결과 반환
    • 기본 집합 쿼리에는 (DISTINCT) 중복제거가 자동 포함되어있음
    • 중복되는 레코드까지 모두 출력하고 싶다면 UNION ALL 키워드 사용
SELECT 필드이름 from 테이블A
UNION
SELECT 필드이름 from 테이블B

FULL OUTER JOIN은 두 개의 테이블을 조인하여 모든 레코드를 포함하는 결과를 생성하는 반면, UNION JOIN은 두 개의 SELECT 문의 결과를 합치는 것을 의미


FMI - JOIN의 내부적 구현 방식에 대한 세부내용 (opens in a new tab)


참고

세 가지 JOIN 계획 정리 (opens in a new tab)