본문 바로가기
sqld

JOIN 이해하기

by 자격증원톱 2026. 2. 23.
반응형
SELECT s.ID, s.NAME, d.DNAME
FROM STUDENT s
INNER JOIN DEPARTMENT d
ON s.DEPTNO = d.DEPTNO;

 

JOIN 이해하기

반응형

 

1) JOIN이란?

  • 서로 다른 테이블의 데이터를 **공통 기준 컬럼(키)**으로 연결해서 한 결과로 보는 것.
  • 보통 ON 조건으로 “어떤 컬럼이 같을 때 붙일지”를 정합니다.

✅ 기본 형태

SELECT ...
FROM A
JOIN B
ON A.key = B.key;
 

2) 식별자 관계 조인 vs 비식별자 조인

① 식별자 관계 조인(정석)

  • PK–FK로 연결되는 조인
  • 가장 흔하고 데이터 정합성이 좋음

✅ 예시(직원-부서)

  • EMP_NEW: DEPTNO(FK)
  • DEPT_NEW: DEPTNO(PK)
SELECT e.ENAME, d.DNAME
FROM EMP_NEW e
JOIN DEPT_NEW d
ON e.DEPTNO = d.DEPTNO;
 

② 비식별자 조인(주의해서 사용)

  • PK–FK가 아닌 컬럼으로 조인 (예: LOCATION 같은 값)
  • 가능은 하지만 중복/오류 가능성이 커서 조심해야 함
  • 이런 경우 조인 기준 컬럼은 카디널리티(고유성)가 높을수록 좋음

✅ 예시(근무지 LOCATION으로 조인)

SELECT e.ENAME, d.DNAME
FROM EMP_NEW e
JOIN DEPT_NEW d
ON e.LOCATION = d.LOCATION;
 

3) JOIN 종류(가장 중요)

① INNER JOIN

  • 두 테이블에 둘 다 존재하는(매칭되는) 행만 반환

✅ 예시(STUDENT에 DEPTNO가 있는 학생만)

SELECT s.ID, s.NAME, d.DNAME
FROM STUDENT s
INNER JOIN DEPARTMENT d
ON s.DEPTNO = d.DEPTNO;
 

② LEFT OUTER JOIN

  • 왼쪽 테이블은 전부 유지
  • 오른쪽에 매칭이 없으면 오른쪽 컬럼은 NULL

✅ 예시(학과가 없어도 학생은 모두 보여주기)

SELECT s.ID, s.NAME, d.DNAME
FROM STUDENT s
LEFT JOIN DEPARTMENT d
ON s.DEPTNO = d.DEPTNO;
 

③ RIGHT OUTER JOIN

  • 오른쪽 테이블은 전부 유지
  • 왼쪽에 매칭이 없으면 왼쪽 컬럼이 NULL

✅ 예시(학생이 없어도 학과는 모두 보여주기)

SELECT s.ID, s.NAME, d.DNAME
FROM STUDENT s
RIGHT JOIN DEPARTMENT d
ON s.DEPTNO = d.DEPTNO;
 

④ FULL OUTER JOIN

  • 양쪽 테이블 모든 행을 다 반환
  • 서로 매칭 안 되는 쪽은 NULL로 채움

✅ 예시(학생도 전부 + 학과도 전부)

SELECT s.ID, s.NAME, d.DNAME
FROM STUDENT s
FULL OUTER JOIN DEPARTMENT d
ON s.DEPTNO = d.DEPTNO;
 
 

4) UNION / UNION ALL (JOIN이 아니라 “결과 합치기”)

  • UNION: 두 SELECT 결과를 합치되 중복 행 제거
  • UNION ALL: 합치되 중복도 그대로 포함

✅ 예시(학생 목록 + 학과 목록을 한 리스트로)

SELECT ID, NAME, DEPTNO
FROM STUDENT
UNION
SELECT DEPTNO AS ID, DNAME AS NAME, NULL AS DEPTNO
FROM DEPARTMENT;
  • UNION은 컬럼 개수/타입/의미가 맞아야 함

5) EQUI JOIN vs NON-EQUI JOIN

① EQUI JOIN(등가 조인)

  • = 로 같은 값끼리 조인 (가장 일반적)
ON A.key = B.key
 
 

② NON-EQUI JOIN(비등가 조인)

  • =가 아닌 범위 조건으로 조인 (BETWEEN, >=, <= 등)

✅ 예시(점수로 등급 테이블과 조인)

  • 학생 점수 SCORE가 90~100이면 A, 80~89면 B…
SELECT s.NAME, s.SCORE, g.GRADE
FROM NEW_STUDENT s
JOIN NEW_GRADE g
ON s.SCORE BETWEEN g.MIN_SCORE AND g.MAX_SCORE;
 
 

6) 3개 이상 테이블 JOIN(실무에서 매우 흔함)

  • 조인은 “두 개씩” 붙여가며 확장하면 됩니다.

✅ 예시(주문 + 고객 + 직원(영업사원))

SELECT
o.ORDER_ID,
o.ORDER_DATE,
c.NAME AS CUSTOMER_NAME,
e.FIRST_NAME,
e.LAST_NAME
FROM ORDERS o
JOIN CUSTOMERS c
ON o.CUSTOMER_ID = c.CUSTOMER_ID
JOIN EMPLOYEES e
ON o.SALESMAN_ID = e.EMPLOYEE_ID;
 
 

7) NATURAL JOIN (편하지만 위험)

  • 두 테이블에 이름이 같은 컬럼을 자동으로 찾아서 조인
  • ON을 쓰지 않아도 됨
  • 하지만 공통 컬럼이 여러 개면 예상치 못한 조인이 될 수 있어 실무에서는 보통 비추천
SELECT *
FROM EMP
NATURAL JOIN DEPT;
 
 

8) USING 절 (공통 컬럼을 “명시적으로” 지정)

  • NATURAL JOIN처럼 공통 컬럼을 쓰지만, 어떤 컬럼인지 지정할 수 있어 더 안전
  • 결과에서 공통 컬럼은 한 번만 출력됨
SELECT *
FROM EMP
JOIN DEPT
USING (DEPTNO);
 
 

9) ON 절 vs USING 절 차이

  • ON: 컬럼명이 달라도 가능, 조건을 복잡하게 만들 수 있음
    예) ON A.deptno = B.dept_no AND A.status='Y'
  • USING: 컬럼명이 같아야만 가능, 공통 컬럼은 결과에 1번만 나옴

10) CROSS JOIN (카티션 곱)

  • 조인 조건 없이 모든 조합을 만들어냄
  • A가 3행, B가 4행이면 결과는 12행
  • 실무에서는 보통 의도적으로 만들 때만 사용(테스트/조합 생성)
SELECT *
FROM A
CROSS JOIN B;
 
 
 

초간단 요약

  • INNER: 공통만
  • LEFT: 왼쪽 전부 + 오른쪽 없으면 NULL
  • RIGHT: 오른쪽 전부 + 왼쪽 없으면 NULL
  • FULL: 양쪽 전부
  • UNION/UNION ALL: 결과를 “합치기” (중복 제거/유지)
  • EQUI: = 조인 / NON-EQUI: 범위 조인
  • NATURAL: 자동(위험) / USING: 공통 컬럼 지정 / ON: 가장 유연
  • CROSS: 모든 조합(주의)
반응형

'sqld' 카테고리의 다른 글

집합연산자  (0) 2026.02.24
서브쿼리  (0) 2026.02.24
집계함수와 group by절  (0) 2026.02.23
SELECT와 WHERE절  (0) 2026.02.23
SQL 함수에 대해 알아봅시다!  (0) 2026.02.23