조인
조인(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): 양쪽 테이블의 여러 행이 서로 관계를 맺음. (보통 중간에 연결 테이블을 두어 두 개의 일대다 관계로 해결)
- 예: 학생 테이블과 과목 테이블 (수강신청 테이블을 중간에 둠)
- 일대다 (One-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';