SQL 서브쿼리 가이드

유방현·2024년 10월 29일

SQL 서브쿼리 가이드

1. 서브쿼리 기본 개념

  • 하나의 SQL 문 안에 포함된 또 다른 SQL 문
  • 메인 쿼리에 중첩된 형태로 사용
  • 괄호 () 안에 작성

2. 서브쿼리 유형

2.1 단일행 서브쿼리 (Single-Row Subquery)

-- 기본 구문
SELECT column_name
FROM table_name
WHERE column_name operator (SELECT column_name FROM table_name WHERE condition);

-- 예: SCOTT의 급여보다 많이 받는 사원
SELECT empno, ename, sal
FROM emp
WHERE sal > (SELECT sal FROM emp WHERE ename = 'SCOTT');

-- 최고 급여 받는 사원
SELECT empno, ename, sal 
FROM emp 
WHERE sal = (SELECT MAX(sal) FROM emp);

2.2 복수행 서브쿼리 (Multi-Row Subquery)

-- 부서별 최고 급여 받는 사원
SELECT empno, ename, deptno, sal
FROM emp
WHERE (deptno, sal) IN (
    SELECT deptno, MAX(sal) 
    FROM emp 
    GROUP BY deptno
);

3. 복수행 연산자

3.1 ANY 연산자

-- column < ANY (subquery): 최대값보다 작은 값
-- column > ANY (subquery): 최소값보다 큰 값

-- 예: 어떤 부서의 최저 급여보다 높은 급여
SELECT empno, ename, sal
FROM emp
WHERE sal > ANY (
    SELECT MIN(sal) 
    FROM emp 
    GROUP BY deptno
);

3.2 ALL 연산자

-- column < ALL (subquery): 최소값보다 작은 값
-- column > ALL (subquery): 최대값보다 큰 값

-- 예: 모든 부서의 최고 급여보다 작은 급여
SELECT empno, ename, sal
FROM emp
WHERE sal < ALL (
    SELECT MAX(sal) 
    FROM emp 
    GROUP BY deptno
);

4. 실무 활용 예제

4.1 날짜 비교

-- MILLER보다 늦게 입사한 사원
SELECT employee_id, name, hire_date
FROM employees
WHERE hire_date > (
    SELECT hire_date 
    FROM employees 
    WHERE name = 'MILLER'
);

4.2 평균 비교

-- 매니저 평균 급여보다 적은 급여
SELECT *
FROM employees
WHERE salary < (
    SELECT AVG(salary) 
    FROM employees 
    WHERE job_id = 'MANAGER'
);

5. 서브쿼리 사용 팁

5.1 성능 최적화

  1. WHERE 절에서 서브쿼리 사용 시

    • 가능한 한 조인으로 대체 고려
    • 인덱스 활용 가능한 구조 선호
  2. 실행 계획 고려

    • 서브쿼리가 먼저 실행되는 점 감안
    • 서브쿼리 결과 크기 고려

5.2 가독성 향상

  1. 들여쓰기 사용
  2. 의미 있는 별칭 부여
  3. 복잡한 서브쿼리는 분리 고려

5.3 주의사항

  1. 단일행 서브쿼리에서 복수행 반환 주의
  2. NULL 값 처리 고려
  3. 성능 영향 고려

0개의 댓글