본문 바로가기

Oracle

Oracle JOIN(조인) 총정리

테이블을 정규화해 중복과 이상 현상은 줄이되, 여러 테이블의 데이터를 한 번에 조회하려면 조인이 필수입니다.
이 글에서는 외래 키(FK) 설정을 시작으로, INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN, SELF JOIN의 개념·문법·흔한 실수 예제를 모두 다룹니다.


목차

  1. 외래 키(FK) 설정
  2. 조인의 개념과 종류
  3. INNER JOIN
    3.1. 개념
    3.2. 문법
    3.3. 잘못된 예제
    3.4. 올바른 예제
  4. LEFT OUTER JOIN
    4.1. 개념
    4.2. 문법
    4.3. 잘못된 예제
    4.4. 올바른 예제
  5. RIGHT OUTER JOIN
    5.1. 개념
    5.2. 문법
  6. FULL OUTER JOIN
    6.1. 개념
    6.2. 문법
  7. SELF JOIN
    7.1. 개념
    7.2. 문법
  8. 다중 테이블 조인 실전 예제
  9. 조인 활용 팁

1. 외래 키(FK) 설정

ALTER TABLE sawon
  ADD CONSTRAINT fk_sawon_deptno 
    FOREIGN KEY(deptno)
    REFERENCES dept(deptno);

ALTER TABLE sawon
  ADD CONSTRAINT fk_sawon_samgr 
    FOREIGN KEY(samgr)
    REFERENCES sawon(sabun);

ALTER TABLE gogek
  ADD CONSTRAINT fk_gogek_godam 
    FOREIGN KEY(godam)
    REFERENCES sawon(sabun);

설정된 제약 조건은 USER_CONSTRAINTS 뷰에서 확인할 수 있습니다.

SELECT constraint_type, constraint_name
FROM user_constraints
WHERE table_name = 'SAWON';

SELECT constraint_type, constraint_name
FROM user_constraints
WHERE table_name = 'GOGEK';

 


2. 조인의 개념과 종류

  • 조인(JOIN): 둘 이상의 테이블을 특정 조건으로 연결해 결과를 반환
  • 정규화된 데이터를 조합해 보고서, 통계, 분석 등에 사용
  • 정규화의 목적 : 데이터 중복 배제, 이상현상 배제

3. INNER JOIN

3.1. 개념

  • 두 테이블의 조인 조건을 모두 만족하는 행만 추출
  • 관련 데이터만 조회할 때 사용

3.2. 잘못된 예제

  1. ON 절 없이 조인
  2. -- 의도: deptno 기준 결합 SELECT * FROM sawon, dept -- CROSS JOIN 발생 WHERE sawon.deptno = dept.deptno AND deptno = 10; -- ORA-00918: 열의 정의가 애매합니다
  3. WHERE 절에만 조인 조건 + 일반 필터
    SELECT *
    FROM sawon, dept
    WHERE sawon.deptno = dept.deptno
      AND sawon.deptno = 10;  
    -- 기능은 하지만, 테이블이 많아질수록 조건이 섞여 헷갈립니다.
    

3.3. 바른 예제 (ANSI-92 SQL)

  1. INNER JOIN + ON 절
    SELECT *
    FROM sawon
    INNER JOIN dept
      ON sawon.deptno = dept.deptno
    WHERE sawon.deptno = 10;
    

3.4. NATURAL JOIN / USING

  • 공통 컬럼을 자동 매칭
    SELECT * FROM sawon NATURAL JOIN dept;
    SELECT * FROM sawon JOIN dept USING(deptno);
    

3.5. 자기 참조(Self JOIN)

사원 테이블에서 사원 ↔ 상사 정보를 함께 조회할 때 사용합니다.

  1. 크로스 조인
  2. SELECT * FROM sawon s1, sawon s2; -- 모든 조합 반환
  3. 잘못된 WHERE 조인
  4. SELECT * FROM sawon s1, sawon s2 WHERE s1.samgr = s2.sabun ORDER BY s1.sabun;
  5. ANSI-92 INNER JOIN
    SELECT
      s1.sabun, s1.sajob, s1.saname,
      s2.sabun, s2.sajob, s2.saname
    FROM sawon s1
    INNER JOIN sawon s2
      ON s1.samgr = s2.sabun
    ORDER BY s1.sabun;
    

4. LEFT OUTER JOIN

4.1. 개념

  • 왼쪽(LEFT) 테이블의 모든 행을 우선 반환
  • 조인 조건에 맞지 않는 오른쪽(OUTER) 테이블 컬럼은 NULL로 채움

4.2. 잘못된 예제

SELECT
  s1.sabun, s1.saname, s2.saname AS manager_name
FROM sawon s1
LEFT OUTER JOIN sawon s2
  ON s1.samgr = s2.sabun
WHERE s2.sajob = '부장';
-- WHERE 절에서 필터링하면 NULL인 행이 모두 제거되어
-- LEFT OUTER JOIN 효과가 사라집니다.

4.3. 바른 예제 (ANSI-92 SQL)

SELECT
  s1.sabun,   s1.saname,
  s2.sabun    AS manager_id,
  s2.saname   AS manager_name
FROM sawon s1
LEFT OUTER JOIN sawon s2
  ON s1.samgr = s2.sabun
  AND s2.sajob = '부장'  -- 필터를 ON 절로 이동
ORDER BY s1.sabun;

4.4. Oracle 전통 문법

SELECT
  s1.sabun, s1.saname, s1.samgr,
  s2.sabun, s2.sajob, s2.saname
FROM sawon s1, sawon s2
WHERE s1.samgr = s2.sabun(+)
ORDER BY s1.sabun;

 


5. RIGHT OUTER JOIN

5.1. 개념

  • 오른쪽 테이블의 모든 행 반환
  • 조건 미충족 시 왼쪽 컬럼 NULL

5.2. 문법

SELECT *
FROM A
RIGHT OUTER JOIN B
  ON A.key = B.key;

6. FULL OUTER JOIN

6.1. 개념

  • A, B 양쪽 테이블의 모든 행 반환
  • 불일치하는 컬럼은 NULL

6.2. 문법

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

7. SELF JOIN

7.1. 개념

  • 자기 자신 테이블을 두 번 참조해 조인

7.2. 문법

SELECT s1.sabun, s1.saname, s2.saname AS manager
FROM sawon s1
INNER JOIN sawon s2
  ON s1.samgr = s2.sabun;

8. 다중 테이블 조인 실전 예제

SELECT
  s.sabun AS 사원번호,
  s.saname AS 사원명,
  d.dname  AS 부서명,
  g.gobun  AS 고객번호,
  g.goname AS 고객명,
  s2.sabun AS 상사번호,
  s2.saname AS 상사명,
  g2.gobun AS 상사고객번호,
  g2.goname AS 상사고객명
FROM sawon s
  INNER JOIN dept   d  ON d.deptno = s.deptno
  LEFT OUTER JOIN gogek g  ON g.godam  = s.sabun
  LEFT OUTER JOIN sawon s2 ON s2.sabun = s.samgr
  LEFT OUTER JOIN gogek g2 ON g2.godam = s2.sabun
ORDER BY s.sabun;

9. 조인 활용 팁

  • 조인 조건은 항상 ON 절에 명시
  • 별칭(Alias) 활용해 컬럼 모호성 방지
  • INNER vs OUTER 조인 선택 기준:
    • INNER: 양쪽 모두에서 일치하는 데이터만
    • OUTER: 한쪽 테이블의 모든 데이터 유지
  • 복잡한 조인은 **뷰(View)**로 분리해 재사용성↑
  • 대용량 조인은 성능 고려(인덱스·파티셔닝 활용)

다양한 조인 방식을 익혀 실무에 바로 적용해 보세요!