대덕인재/Oracle

[Oracle D-12] 내부조인(Inner Join),외부조인(Outer Join), ANSI join

꼬마버거 2025. 4. 17. 10:16

🔹 JOIN이란?

두 개 이상의 테이블을 "합쳐서" 하나의 결과를 만드는 것

마치 퍼즐 조각처럼, **공통된 컬럼(열)**을 기준으로 각 테이블의 데이터를 연결하는 거야.

 

🔸 왜 JOIN을 써야 할까?

데이터베이스에서는 보통 정보를 여러 테이블에 나눠서 저장해.

관계형 데이터베이스는 데이터를 효율적으로 관리하기 위해 테이블을 나눠서 설계해. 그래서 필요한 정보를 얻으려면 관련된 테이블들을 연결해서 봐야 해. 이때 쓰는 게 조인이야!

 

 

 

✅ 조인의 종류

오라클 SQL에서 자주 쓰는 조인은 크게 아래 4가지야:

조인 종류 설명
INNER JOIN 조건에 일치하는 행만 조회
OUTER JOIN 조건이 일치하지 않더라도 한쪽 테이블의 모든 데이터 포함
CROSS JOIN 두 테이블의 모든 조합 (곱집합)
SELF JOIN 하나의 테이블을 자기 자신과 조인

 

 

1️⃣ INNER JOIN (내부 조인)

양쪽 테이블에 모두 존재하는 값만 결과에 포함시켜.

✅ 문법

SELECT 컬럼들
FROM 테이블1 A
INNER JOIN 테이블2 B
  ON A.공통컬럼 = B.공통컬럼;

✅ 예제

SELECT E.EMP_NAME, D.DEPT_NAME
FROM EMPLOYEE E
INNER JOIN DEPARTMENT D
  ON E.DEPT_ID = D.DEPT_ID;

👉 직원(EMPLOYEE) 테이블과 부서(DEPARTMENT) 테이블에서, 부서 ID가 일치하는 직원만 보여줌.

2️⃣ OUTER JOIN (외부 조인)

한쪽에는 데이터가 있어도 다른쪽에는 없을 수 있어. 그 경우에도 모든 데이터를 다 보여주고, 없는 부분은 NULL로 보여줘.

종류

  • LEFT OUTER JOIN: 왼쪽 테이블의 모든 행 + 조건에 맞는 오른쪽 테이블 행
  • RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행 + 조건에 맞는 왼쪽 테이블 행
  • FULL OUTER JOIN: 양쪽 모두의 모든 행을 보여줌

✅ LEFT OUTER JOIN 예제

SELECT E.EMP_NAME, D.DEPT_NAME
FROM EMPLOYEE E
LEFT OUTER JOIN DEPARTMENT D
  ON E.DEPT_ID = D.DEPT_ID;
 
 

👉 직원은 있는데 소속 부서 정보가 없는 경우도 다 출력, 없는 부서명은 NULL.

 

3️⃣ ANSI JOIN vs 오라클 전용 OUTER JOIN ((+))

예전 오라클 방식에서는 OUTER JOIN을 + 기호로 썼어. 지금도 일부 사용되긴 해.

✅ 예전 방식 예시 (LEFT OUTER JOIN)

SELECT E.EMP_NAME, D.DEPT_NAME
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DEPT_ID = D.DEPT_ID(+);

+가 붙은 쪽이 데이터가 없어도 출력될 수 있는 테이블 (즉, OUTER쪽)

 

 

4️⃣ SELF JOIN

자기 자신을 조인해서 사용하는 방식

✅ 예제: 직원 테이블 안에 상사(Manager) 정보가 있는 경우

SELECT E.EMP_NAME, M.EMP_NAME AS MANAGER_NAME
FROM EMPLOYEE E
LEFT JOIN EMPLOYEE M
  ON E.MANAGER_ID = M.EMP_ID;

👉 같은 테이블인데 별명(alias) 을 다르게 줘서 자기를 조인함.

 

📌 보너스: CROSS JOIN

모든 조합을 만드는 조인. 실무에선 거의 안 씀.

SELECT *
FROM EMPLOYEE E
CROSS JOIN DEPARTMENT D;
 

👉 EMPLOYEE가 5명, DEPARTMENT가 3개라면 → 15개의 결과

 

✅ 실전 팁

  1. ON 절은 조인 조건을 적는 곳 (보통 PK = FK)
  2. WHERE 절은 필터링 조건을 적는 곳
  3. 조인을 많이 쓸수록 SQL 성능이 중요해지므로 인덱스조건 순서를 신경 써야 함
  4. 같은 이름의 컬럼이 여러 테이블에 있으면 **별칭(A.컬럼)**을 꼭 써야 해

✨ 마무리 예제

SELECT E.EMP_NAME, E.SALARY, D.DEPT_NAME
FROM EMPLOYEE E
JOIN DEPARTMENT D ON E.DEPT_ID = D.DEPT_ID
WHERE E.SALARY > 3000;

→ 부서명까지 붙은 고연봉 직원 리스트를 출력하는 SQL!