본문 바로가기
SQL Professional

[독학! SQLP] SQL 조인!

by 개발자의 2025. 8. 20.

1. EQUI JOIN (= 내부 조인, 등가 조인)

  • 정의: 두 테이블의 조인 조건이 = 비교로 이루어진 조인. 가장 기본적인 
  • 형식: INNER JOIN … ON A.col = B.col
  • 예시
SELECT e.empno, e.ename, d.dname
FROM emp e
JOIN dept d
  ON e.deptno = d.deptno;
  • 포인트: 시험에서는 “EQUI JOIN = INNER JOIN”을 묻는 경우 多.

2. NON-EQUI JOIN

  • 정의: 조인 조건이 = 이외(>, <, BETWEEN 등)로 구성된 조인.
  • 예시 (급여 등급 매칭)
SELECT e.ename, e.sal, s.grade
FROM emp e
JOIN salgrade s
  ON e.sal BETWEEN s.losal AND s.hisal;
  • 포인트: 급여 등급, 성적 등 범위 매칭 문제로 출제.

3. SELF JOIN

  • 정의: 하나의 테이블을 자기 자신과 조인.
  • 예시 (사원의 상사 찾기)
SELECT e.ename AS 사원, m.ename AS 상사
FROM emp e
JOIN emp m
  ON e.mgr = m.empno;
  • 포인트: 별칭(alias) 반드시 필요.

4. OUTER JOIN (LEFT / RIGHT / FULL)

  • 정의: 한쪽 테이블에만 있는 데이터도 NULL 포함해 보여줌.
  • 예시
-- LEFT (OUTER) JOIN (부서 없는 직원도 표시)
SELECT e.empno, e.ename, d.dname
  FROM emp e
    LEFT JOIN dept d
    ON e.deptno = d.deptno;

-- RIGHT (OUTER) JOIN (직원이 없는 부서도 표시)
SELECT e.empno, e.ename, d.dname
  FROM emp e
    RIGHT JOIN dept d
    ON e.deptno = d.deptno;

-- FULL OUTER JOIN (양쪽 모두 표시)
SELECT e.empno, e.ename, d.dname
  FROM emp e
    FULL OUTER JOIN dept d
    ON e.deptno = d.deptno;
  • 포인트: Oracle은 FULL OUTER JOIN 지원, MySQL은 8.0부터 FULL JOIN 대신 UNION으로 대체 가능.

5. CROSS JOIN (카티션 곱)

  • 정의: 조인 조건 없이 두 테이블의 모든 조합 생성.
  • 예시
SELECT e.ename, d.dname
FROM emp e
CROSS JOIN dept d;
  • 포인트: 행 개수 = emp × dept. 보통 의도적 사용보다 실수로 나옴 → 시험 단골.

6. NATURAL JOIN

  • 정의: 두 테이블에 동일한 칼럼명이 이 있으면 자동으로 조인.
  • 예시
SELECT empno, ename, dname
FROM emp
NATURAL JOIN dept;
  • 포인트: SQL 표준 문법. 실무보다는 시험에 자주 등장. 칼럼명 같아야만 작동.

7. USING 절 JOIN

  • 정의: ON 대신 USING(공통칼럼)을 명시. 동일 칼럼만 조인 조건에 사용.
  • 예시
SELECT empno, ename, dname
FROM emp
JOIN dept USING (deptno);
  • 포인트: USING을 쓰면 조인 칼럼은 한 번만 표시됨.

8. ANSI JOIN vs ORACLE 전용 JOIN

  • ANSI: JOIN... ON, LEFT OUTER JOIN
  • Oracle 전용: (+) 연산자 사용
-- Oracle OUTER JOIN 방식
SELECT e.empno, e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno(+);
  • 포인트: 시험에서 ANSI JOIN과 Oracle JOIN 구문 비교 문제 자주 출제.

'SQL Professional' 카테고리의 다른 글

[독학! SQLP] 서브쿼리  (3) 2025.08.20
[독학! SQLP] 트랜잭션  (1) 2025.08.20
[독학! SQLP] 그룹핑 쿼리  (0) 2025.08.20
[독학! SQLP] 함수 정리!  (0) 2025.08.20
[독학! SQLP] NULL에 관하여!  (0) 2025.08.19