Skip to main content

조인


조인(JOIN)의 개념과 필요성

  • 조인 (JOIN) 이란?: 두 개 이상의 테이블에 분산되어 저장된 데이터를 관계를 기반으로 연결하여 하나의 결과 집합으로 조회하는 방법.
  • 필요성:
    • 데이터 정규화: 데이터 중복을 최소화하기 위해 정보를 여러 테이블로 나누어 저장.
    • 정보 통합: 분리된 테이블의 데이터를 연결하여 의미 있는 통합된 정보를 얻기 위함.
    • 예시: 기업 정보와 해당 기업의 재무 정보를 함께 보거나, 기업 정보와 해당 기업의 여신 정보를 연결하여 분석.
  • 핵심: 테이블 간의 공통된 열(컬럼) 또는 의미적으로 연결되는 열을 기준으로 데이터를 결합.

테이블 간 관계 이해

  • 관계형 데이터베이스의 핵심: 테이블 간의 논리적인 연결.
  • 주요 관계 유형:
    • 일대다 (One-to-Many): 한 테이블의 행 하나가 다른 테이블의 여러 행과 관계를 맺음. (가장 흔한 관계)
      • 예: TB_COMPANY_MASTER (기업정보) 1건 : TB_LOAN_ACCOUNT (여신정보) 여러 건
      • (TB_COMPANY_MASTER.BIZ_REG_NO (PK) ↔ TB_LOAN_ACCOUNT.BIZ_REG_NO (FK))
    • 일대일 (One-to-One): 한 테이블의 행 하나가 다른 테이블의 행 하나와만 관계를 맺음. (자주 사용되지는 않음, 테이블 분리 목적)
      • 예: 직원 정보 테이블과 직원 상세 정보 테이블 (주민번호로 연결)
    • 다대다 (Many-to-Many): 양쪽 테이블의 여러 행이 서로 관계를 맺음. (보통 중간에 연결 테이블을 두어 두 개의 일대다 관계로 해결)
      • 예: 학생 테이블과 과목 테이블 (수강신청 테이블을 중간에 둠)
  • 관계 설정의 기반: 기본 키 (Primary Key)와 외래 키 (Foreign Key).

INNER JOIN (내부 조인)

  • INNER JOIN: 두 테이블을 연결할 때, 양쪽 테이블에 모두 조인 조건이 일치하는 행만 결과에 포함.
  • 가장 기본적이고 널리 사용되는 조인 유형.
  • 문법
SELECT table1.column1, table1.column2, table2.column1, ...
FROM table1
INNER JOIN table2 ON table1.join_column = table2.join_column
WHERE condition; -- (선택 사항)
  • INNER 키워드는 생략 가능 (JOIN만 써도 내부 조인으로 동작).
  • 예시: TB_COMPANY_MASTER (기업정보)와 TB_FINANCIAL_STATEMENT (재무정보)를 내부 조인하여, 재무 정보가 있는 기업의 이름과 해당 기업의 2023년도 매출액 조회
SELECT
c.COMPANY_NM AS "회사명",
f.FS_YM AS "결산년월",
f.REVENUE AS "매출액"
FROM
TB_COMPANY_MASTER c
INNER JOIN
TB_FINANCIAL_STATEMENT f ON c.BIZ_REG_NO = f.BIZ_REG_NO
WHERE
f.FS_YM = '202312' AND f.FS_TYPE = 'ANNUAL';

조인 시 테이블 별칭(Alias) 사용 및 조인 조건 지정

  • 테이블 별칭 (Table Alias)의 필요성:
    • 테이블 이름이 길 경우 코드를 간결하게 만듦.
    • 같은 테이블을 여러 번 조인할 때(예: SELF JOIN) 구분 가능.
    • 여러 테이블에서 동일한 컬럼명을 사용할 때 어떤 테이블의 컬럼인지 명확히 지정 (별칭.컬럼명).
  • 별칭 사용법: FROM 절의 테이블명 뒤에 한 칸 띄고 별칭을 지정
    • Oracle에서는 FROM에서는 AS를 사용하지 않음(타 DBMS에서는 사용할 수 있음)
  • ON 키워드를 사용한 명시적 조인 조건 지정 (권장):
    • 조인할 테이블 간의 연결 조건을 명확하게 기술.
    • 복잡한 조인 조건이나 여러 조건을 AND, OR로 연결 가능.
SELECT c.COMPANY_NM, l.LOAN_ACCT_NO, l.LOAN_AMT
FROM TB_COMPANY_MASTER c -- c를 TB_COMPANY_MASTER의 별칭으로 사용
INNER JOIN TB_LOAN_ACCOUNT l ON c.BIZ_REG_NO = l.BIZ_REG_NO; -- l을 TB_LOAN_ACCOUNT의 별칭으로 사용

WHERE를 이용한 JOIN

  • 과거에 사용하던 문법
  • 실제 실행 과정은 INNER JOIN과 동일함
SELECT
c.COMPANY_NM AS "회사명",
f.FS_YM AS "결산년월",
f.REVENUE AS "매출액"
FROM
TB_COMPANY_MASTER c, TB_FINANCIAL_STATEMENT f
WHERE
c.BIZ_REG_NO = f.BIZ_REG_NO AND
f.FS_YM = '202312' AND f.FS_TYPE = 'ANNUAL';

USING 절을 사용한 조인 조건 지정

  • 조인하려는 두 테이블의 연결 컬럼명이 동일할 경우 사용 가능.
  • 괄호 안에 공통 컬럼명을 명시.
  • USING 절에 명시된 컬럼은 조회 시 테이블 별칭 없이 사용해야 함 (일부 DBMS).
-- BIZ_REG_NO 컬럼명이 양쪽 테이블에 동일하다고 가정
SELECT c.COMPANY_NM, l.LOAN_ACCT_NO, BIZ_REG_NO -- USING 절의 컬럼은 별칭 없이
FROM TB_COMPANY_MASTER c
INNER JOIN TB_LOAN_ACCOUNT l USING (BIZ_REG_NO);

여러 개의 테이블 JOIN

  • 3개의 테이블을 JOIN
SELECT c.BIZ_REG_NO, c.COMPANY_NM, i.CREDIT_GRADE, EVAL_DT, f.TOTAL_ASSETS
FROM TB_COMPANY_MASTER c
LEFT JOIN TB_CREDIT_INFO i USING (BIZ_REG_NO)
LEFT JOIN TB_FINANCIAL_STATEMENT f USING (BIZ_REG_NO)
WHERE
i.EVAL_DT > '2024-01-01' AND i.CREDIT_INFO_TYPE_CD = 'GRADE' AND
f.FS_YM >= '202312' AND f.FS_TYPE = 'ANNUAL';

퀴즈