본문 바로가기

DB

[DB] SQL - 서브 쿼리를 이용한 동적 쿼리 활용 방법

728x90

동적 쿼리란?

데이터를 조회하다 보면, '이 조건일 땐 이 값', '다른 조건일 땐 다른 값'을 기준으로 조회하고 싶은 경우가 많다.

이럴 때 하드코딩된 WHERE 조건은 유연하지 못하다.

이럴때 바로 서브 쿼리를 활용하면 된다.

동적 쿼리는 행 시점에 조건이나 쿼리 구조가 유동적으로 바뀌는 SQL문을 갖기 때문에, 사용자의 입력, 조건, 상황에 따라 쿼리 자체가 달라진다.

정적 쿼리와 동적 쿼리의 차이점

정적 쿼리

  • 고정된 방식으로 작성되고 실행되는 SQL 문
  • 데이터나 다른 변수의 변화에 영향을 받지 않음
  • 쿼리 구조가 고정됨

동적 쿼리

  • 실행되는(런타임) 동안 생성되고 실행되는 SQL문
  • 조건에 따라 쿼리 구조가 바뀜

서브 쿼리를 활용한 동적 쿼리 사용 예시

  • 사원 정보를 저장하고 있는 emp 테이블
    emp_id name job sal dept_id
    1 Alice CLERK 2500 10
    2 Bob MANAGER 4000 10
    3 Charlie CLERK 2000 20
    4 Dave SALESMAN 3000 30
    5 Eva MANAGER 5000 20
    6 Frank ANALYST 2700 30
  • 부서 정보를 저장하고 있는 dept 테이블
    dept_id dept_name location
    10 HR SEOUL
    20 IT BUSAN
    30 SALES DAEGU
  1. 비교 대상 조건을 동적으로 지정할 경우

평균 급여보다 높은 사원을 찾으려는 경우

SELECT name, sal
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp);
  1. 다중 행 비교(IN, NOT IN)

IT 부서와 같은 급여를 받는 사원을 찾으려는 경우

SELECT name, sal
FROM emp
WHERE sal IN (
    SELECT sal FROM emp WHERE dept_id = 20
);
  1. ANY / ALL 비교

부서별 평균 급여가 전체 평균보다 높은 부서를 찾으려는 경우

SELECT name, sal
FROM emp
WHERE sal > ALL (
    SELECT sal FROM emp WHERE dept_id = 20
);
  1. EXISTS / NOT EXISTS

부서별 평균보다 더 많이 받는 사원을 찾으려는 경우

SELECT dept_id
FROM dept d
WHERE EXISTS (
    SELECT 1 FROM emp e WHERE e.dept_id = d.dept_id AND sal >= 3000
);
728x90