DB/SQL 전문가 가이드

[과목 II 1장 7절] 조인

꾸준함. 2025. 3. 25. 00:03

1. 조인 개요

  • 두 개 이상의 테이블들을 연결해서 데이터를 출력하는 것을 조인 (JOIN)이라고 지칭
  • 조인은 관계형 데이터베이스의 가장 큰 장점이면서 핵심 기능
  • 일반적인 경우 행들은 PK (Primary Key)나 FK(Foreign Key) 값의 연관에 의해 조인이 성립되지만 어떤 경우에는 이러한 PK, FK의 관계가 없어도 논리적인 값들의 연관만으로 조인이 성립될 수 있음
  • 한 가지 주의할 점은 FROM 절에 여러 테이블이 나열되더라도 SQL에서 데이터를 처리할 때는 단 두 개의 집합 간에만 조인이 일어난다는 것
    • FROM 절에 A, B, C 테이블이 나열됐더라도 특정 두 개의 테이블만 먼저 조인 처리되고, 조인의 결과인 중간 데이터 집합과 남은 한 개의 테이블이 다음 차례로 조인되는 것
    • 해당 순서는 네 개 이상의 테이블이 사용되더라도 동일한 프로세스를 반복함

 

2. EQUI JOIN

  • EQUI (동기) JOIN은 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용되는 방법
  • 대부분 PK <-> FK의 관계를 기반으로 하지만 반드시 PK <-> FK 관계로만 EQUI JOIN이 성립하는 것은 아님
  • JOIN의 조건은 WHERE 절에 기술하게 되는데 "=" 연산자를 사용해서 표현함

 

 

  • 위 SQL에서 특정 칼럼에 접근하기 위해 해당 칼럼이 어느 테이블에 존재하는 칼럼이지를 명시하는 것은 두 가지 이유가 있음
    • 조인에 사용되는 여러 개의 테이블에 같은 칼럼명이 존재하는 경우, DMBS는 어떤 칼럼을 사용해야 할지 모르기 때문에 파싱 단계에서 오류가 발생함
    • 개발자나 사용자가 조회할 데이터가 어느 테이블에 있는 칼럼인지 쉽게 알 수 있게 하므로 SQL에 대한 가독성이나 유지보수성을 높이는 효과가 있음

 

  • 조인 조건에 맞는 데이터만 출력하는 INNER JOIN에 참여하는 대상 테이블이 N개라고 했을 때, N개의 테이블로부터 필요한 데이터를 조회하기 위해 필요한 조인 조건은 대상 테이블의 개수에서 하나를 뺀 N + 1개 이상이 필요함
    • ex) FROM 절에 테이블이 세 개가 표시돼 있다면, 조인 조건은 3 - 1 = 2개 이상이 필요함
    • 옵티마이저의 발전으로 옵티마이저가 일부

 

 

3. Non EQUI JOIN

  • Non EQUI (비동기) JOIN은 두 개의 테이블 간에 논리적인 연관 관계를 갖고 있으나, 칼럼 값들이 서로 일치하지 않은 경우에 사용
    • Non EQUI JOIN의 경우에는 "=" 연산자가 아닌 다른 (Between, >, >=, <, <= 등) 연산자들을 사용해 JOIN을 수행

 

  • 두 개의 테이블이 PK, FK로 연관관계를 갖거나 논ㄴ리적으로 같은 값이 존재하는 경우에는 "=" 연산자를 이용해 EQUI JOIN을 사용하지만 두 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우에는 EQUI JOIN을 사용할 수 없음
    • 이런 경우 Non EQUI JOIN을 시도할 수 있으나 데이터 모델에 따라서 Non EQUI JOIN이 불가능한 경우도 있음

 

 

 

4. 3개 이상 TABLE JOIN

  • 선수 테이블의 소속팀ID (TEAM_ID)가 팀 테이블의 팀ID (TEAM_ID)와 PK, FK 관계가 있음
  • 경기장 테이블의 경기장ID (STADIUM_ID)와 팀 테이블의 전용구장ID (STADIUM_ID)가 PK, FK 관계
  • 세 개의 테이블에 대한 조인이므로 WHERE 절에 두 개 이상의 조인 조건이 필요

 

 

 

5. OUTER JOIN

  • 앞서 다루었던 EQUI JOIN, Non EQUI JOIN은 모두 조인 조건의 결과가 참인 행들만 반환하는 INNER JOIN
  • OUTER JOIN은 조인 조건을 만족하지 않는 행들도 함께 반환할 때 사용

 

https://blog.naver.com/liberty264/220559237445?photoView=0

 

  • [그림 II-2-3]ㅇ는 TAB1 테이블과 TAB2 테이블을 조인하되 TAB2에 JOIN 할 데이터가 있으면 TAB2의 데이터를 함께 출력하고, TAB2에 JOIN 할 데이터가 없어도 TAB1의 모든 데이터를 표시하고 싶은 경우
    • TAB1의 모든 값에 대해 TAB2의 데이터가 반드시 존재한다는 보장이 없는 경우 OUTER JOIN을 사용해 해결할 수 있음
    • Oracle은 다음과 같이 조인 칼럼 뒤에 '(+)' 기호를 표시해 OUTER JOIN을 나타냄


 

부연 설명

  • OUTER JOIN을 사용하기 위해 '(+)'를 표시할 때, 주의할 점은 '(+)' 기호의 위치
    • 위의 예시에서 OUTER JOIN의 기준이 되는 테이블 (조인할 데이터가 없는 경우에도 모든 데이터를 표시하는 테이블)은 '테이블1'
    • 즉 '(+)' 표시의 반대편에 있는 테이블이 OUTER JOIN의 기준 테이블

 

  • OUTER JOIN의 결과에서 조인에 성공한 행들은 INNER JOIN과 동일하게 조인에 참여한 각 테이블의 칼럼 값들이 표시됨
    • 반면 조인에 실패한 행들의 경우 테이블1과 같은 기준테이블은 칼럼들의 값이 표시되고, 그 외 테이블에서 가져오는 칼럼들은 NULL로 표시

 

정리

  • 정규화란 불필요한 데이터의 정합성을 확보하고 이상현상 발생을 피하기 위해 테이블을 분할해 생성하므로 조인이라는 개념이 필요함
  • 사실 데이터 조회의 편리성만 생각한다면, 하나의 테이블에 모든 데이터를 집중시켜 놓고 해당 테이블로부터 필요한 데이터를 조회할 수도 있지만 이렇게 됐을 경우 가장 중요한 데이터의 정합성에 더 큰 비용을 지불해야 하며, 데이터를 추가, 삭제 및 수정하는 작업 역시 상당한 노력이 요구될 것
    • 성능 측면에서도 간단한 데이터를 조회하는 경우에도 규모가 큰 테이블에서 필요한 데이터를 찾아야 하므로 오히려 검색  속도가 떨어질 수도 있음
    • 테이블을 정규화하여 데이터를 분할하면 문제를 자연스럽게 해결할 수 있으며, 분할된 테이블 간 논리적 연관관계를 조인해 특정 요구 사항을 만족하는 여러 데이터를 조회할 수 있음

 

  • 관계형 데이터베이스의 큰 장점이면서 SQL 튜닝의 중요 대상이 되는 조인을 잘 못 기술할 경우 시스템 자원 부족이나 과다한 응답시간 지연을 발생시키는 중요 원이 되므로 조인 조건은 신중하게 작성해야 함

 

참고

SQL 전문가 가이드 2020 개정판 - 한국데이터산업진흥원

반응형