본문 바로가기
database/oracle

📄 7편. 조인(Join)과 서브쿼리(Subquery) 정복

by 죄니안죄니 2025. 5. 6.

📄 7편. 조인(Join)과 서브쿼리(Subquery) 정복

실무 SQL의 대부분은 두 개 이상의 테이블을 연결하거나, 서브쿼리를 통해 필요한 조건을 만족하는 데이터를 필터링하는 작업입니다.
이번 글에서는 조인의 종류와 서브쿼리 패턴을 예제 중심으로 정리하고, 성능 유의사항</strong도 함께 설명합니다.


🔗 1. 조인(JOIN)의 종류와 예제

✅ 1-1. 내부 조인 (INNER JOIN)

SELECT E.ENAME, D.DNAME
FROM EMP E
JOIN DEPT D ON E.DEPTNO = D.DEPTNO;

→ 공통 조건에 만족하는 행만 조회됩니다.

🔁 1-2. 외부 조인 (OUTER JOIN)

  • LEFT OUTER JOIN: 왼쪽 테이블은 모두 표시, 오른쪽은 조건 일치 시 표시
  • RIGHT OUTER JOIN: 오른쪽 테이블은 모두 표시
SELECT E.ENAME, D.DNAME
FROM EMP E
LEFT JOIN DEPT D ON E.DEPTNO = D.DEPTNO;

🧩 1-3. FULL OUTER JOIN

SELECT E.ENAME, D.DNAME
FROM EMP E
FULL OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;

♻️ 1-4. SELF JOIN

SELECT E.ENAME AS EMPLOYEE, M.ENAME AS MANAGER
FROM EMP E
LEFT JOIN EMP M ON E.MGR = M.EMPNO;

🔍 2. 서브쿼리(Subquery)의 구조

서브쿼리는 쿼리 내부에서 다시 SELECT를 수행하는 방식입니다. 조건절, SELECT절, FROM절 등 다양한 곳에 삽입 가능합니다.

🎯 2-1. WHERE절 서브쿼리

SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT AVG(SAL) FROM EMP);

🔁 2-2. IN / ANY / ALL을 사용하는 다중행 서브쿼리

SELECT ENAME
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC = 'DALLAS');

📥 2-3. FROM절 인라인 뷰

SELECT D.DEPTNO, D.AVG_SAL
FROM (
  SELECT DEPTNO, AVG(SAL) AS AVG_SAL
  FROM EMP
  GROUP BY DEPTNO
) D
WHERE D.AVG_SAL > 3000;

📌 2-4. SELECT절 스칼라 서브쿼리

SELECT E.ENAME,
       (SELECT D.DNAME FROM DEPT D WHERE D.DEPTNO = E.DEPTNO) AS DEPT_NAME
FROM EMP E;

⚠ 성능 팁: 조인 vs 서브쿼리

  • 💡 조인은 복수 테이블을 병렬로 묶기 적합. 인덱스 최적화 용이
  • 💡 서브쿼리는 조건 필터링, 단일 값 계산에 적합
  • 스칼라 서브쿼리는 결과 행 수만큼 반복 실행 → 성능 저하 주의
  • ✅ 대용량 데이터에서는 조인 + WITH절로 리팩토링 권장

📌 예: 서브쿼리 → 조인 리팩토링

-- BEFORE (성능 저하 가능)
SELECT ENAME,
       (SELECT DNAME FROM DEPT WHERE DEPTNO = E.DEPTNO)
FROM EMP E;

-- AFTER (조인으로 리팩토링)
SELECT E.ENAME, D.DNAME
FROM EMP E
JOIN DEPT D ON E.DEPTNO = D.DEPTNO;

📝 마무리

이번 글에서는 Oracle SQL에서 가장 중요한 개념 중 하나인 조인과 서브쿼리에 대해 정리했습니다.
다음 글에서는 계층 쿼리 완전 정복 (CONNECT BY) 을 소개합니다.

댓글