📄 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) 을 소개합니다.
'database > oracle' 카테고리의 다른 글
📄 9편. Pivot / Unpivot으로 행열 변환하기 (0) | 2025.05.06 |
---|---|
📄 8편. 계층 쿼리 완전 정복 (CONNECT BY) (0) | 2025.05.06 |
📄 6편. 뷰(View), 시퀀스(Sequence), 동의어(Synonym) 활용법 (0) | 2025.05.06 |
📄 5편. 인덱스(Index) 구조와 실전 튜닝 전략 (0) | 2025.05.06 |
🌱 4편. 데이터 타입과 NULL 처리 특성 (0) | 2025.05.06 |
댓글