조인(JOIN)

Joo·2024년 3월 7일

RDB & SQL

목록 보기
14/24

Standard Join (ANSI/ISO)

형태설명
INNER JOIN디폴트
OUTER JOINLEFT, RIGHT, FULL
NATURAL JOIN두 테이블에서 같은 이름을 가진 모든 컬럼에 대한 equi 조인
CROSS JOIN
(=Cartesian Product)
두 테이블 간 조인 조건이 없는 경우,
조합할 수 있는 모든 경우를 출력
USING 조건절USING (컬럼)
ON 조건절

OUTER JOIN의 위치에 따른 필터링

  • WHERE 절에 위치하는 경우
    : OUTER JOIN으로 이미 조인된 결과에 대해 추가적인 필터링 수행

  • ON 절에 위치하는 경우
    : 조인 데이터에 대해 필터링 수행

    NATURAL JOIN과 HAVING 조건절

  • NATURAL JOIN

    • 반드시 두 테이블 간의 동일한 이름, 타입을 가진 컬럼이 있어야 함
    • 조인에 이용되는 컬럼은 명시하지 않아도 자동으로 조인에 이용됨
    • 조인하는 테이블 간의 동일 컬럼이 SELECT 절에 기술되어도 테이블 이름을 생략해야 함
  • USING 조건절

    • 테이블 간 동일한 이름과 타입의 컬럼이 둘 이상인 경우 사용
    • USING 절은 조인에 사용될 컬럼을 지정 (조인 컬럼을 기술해야 함)
    • NATURAL JOIN과 USING 조건절은 동시에 사용 X
    • JOIN 컬럼은 괄호로 묶어서 기술해야 함
  • 공통점

    • 조인할 컬럼에 alias나 테이블명 접두사 사용 불가능
    • equi join만 표현 가능
    • 기준 컬럼은 맨 앞에 출력됨
  • 차이점

    • USING 조건절은 조인할 컬럼을 지정할 수 있음

ON 조건절

  • 컬럼명이 서로 다르더라도 join 조건을 사용할 수 있음
  • alias나 접두사 사용 가능

FULL OUTER JOIN vs UNION

  • FULL OUTER JOIN
    • 왼쪽 테이블과 오른쪽 테이블에서 일치하는 값이 있는 모든 레코드를 반환하며, 일치하지 않는 경우에는 NULL 값을 가진 레코드를 반환함
    • 왼쪽 테이블과 오른쪽 테이블의 모든 데이터를 포함하는 결과를 얻음
  • UNION
    • 두 개 이상의 SELECT 문의 결과를 하나의 결과 집합으로 결합하는 연산
    • SELECT 문의 열 수와 데이터 유형이 일치해야 하고, 각 SELECT 문은 컬럼이 동일한 순서로 정렬되어야 함

INNER JOIN vs INTERSECT

  • INNER JOIN
    • 두 테이블 간 일치하는 값이 있는 경우에만 결과에 포함되고, 일치하지 않는 값은 제외함
  • INTERSECT
    • 두 개의 SELECT 문 결과에서 공통된 레코드를 반환하는 연산

SELF JOIN

  • 하나의 테이블 내에서 자기 자신과 조인
  • 동일한 테이블을 서로 다른 alias를 사용해 조인
  • 주로 테이블 내에 계층 구조나 부모-자식 관계가 있는 경우에 사용 (예, 조직도)




그 외 대표적인 조인 기법


NL JoinSort Merge JoinHash Join
동작 방식중첩된 반복문과 유사한 방식으로 조인 수행
for 선행테이블 읽음
for 후행테이블 읽음
- 조인 컬럼 기준으로 데이터를 정렬하여 조인
- equi, non equi join 가능
- 해쉬 함수 이용해 조인
- equi join만 가능
- CPU 작업 위주 처리
데이터 읽기랜덤 액세스스캔 방식(넓은 데이터 범위)
인덱스사용사용 X없어도 가능
사용온라인 프로그램데이터 집계 업무대용량 데이터 집계 업무

HASH JOIN

  • 한 테이블의 데이터를 해쉬 테이블로 메모리에 저장하고, 다른 테이블을 스캔하면서 해쉬 테이블을 사용해 매칭되는 행을 빠르게 찾음
  • 두 개의 큰 테이블을 조인할 때 사용됨

NESTED LOOP JOIN(중첩 반복 조인)

  • 선행 테이블에서 액세스한 각 값을 후행 테이블과 조인하는 방식
    • 두 테이블 중 한 테이블 먼저 스캔한 후 그 결과에 기반해 두 번째 테이블에서 매칭되는 행 찾기
  • 조인의 입력값이 한 쪽은 10개 이하로 매우 적고, 다른 한 쪽은 매우 큰 경우와
  • 조인으로 연결할 열에 인덱스가 설정되어 있다면
  • 최소한의 I/O 동작이 이루어지기 때문에 nested loop join이 가장 빠름
5NESTED LOOPS
4    HASH JOIN
3        TABLE ACCESS (FULL) TAB1
3        TABLE ACCESS (FULL) TAB2
2    TABLE ACCESS (BY ROWID) TAB3
1        INDEX (UNIQUE SCAN) PK_TAB3

✔️ 해쉬 조인의 결과와 TAB3의 데이터를 중첩 루프를 통해 결합함
✔️ 각각의 해쉬 조인 결과 행에 대해 TAB3에서 매칭되는 행이 있는지 검사하고, 조건에 맞는 행들을 최종 결과 집합에 추가함

SEMI JOIN

  • 서브 쿼리 결과와 같은 값을 가진 데이터 추출 (IN, EXISTS)

ANTI JOIN

  • 서브 쿼리 결과와 다른 값을 가진 데이터 추출 (NOT IN, NOT EXISTS)
profile
적당히 공부한 거 정리하는 곳

0개의 댓글