JOIN 이해하기
f
firststep 에디터
IT / 자격증 전문 라이터
2026년 2월 23일849
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: 모든 조합(주의)
f
firststep 에디터 · IT / 자격증 전문 라이터
firststep.kr의 실무 에디터로서 무언가를 처음 도전하는 분들이 헤매지 않도록 검증된 지식과 실습 가이드를 작성합니다.
댓글 0개
댓글을 작성하려면 로그인이 필요합니다
간단한 이메일과 비밀번호로 3초 만에 가입하고 의견을 남겨보세요.
첫 번째 댓글을 남겨보세요!