반응형
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 |