서브쿼리란?
SQL에서는 데이터를 조회하거나 조작하기 위해 쿼리를 사용한다.
이때, 하나의 쿼리 안에 또 다른 쿼리를 중첩해서 사용하는 것을 서브쿼리(Subquery)라고 한다.
서브쿼리는 보통 외부 쿼리(Main Query)의 조건, 컬럼, 또는 테이블로 활용되며, 외부 쿼리의 실행에 영향을 주거나, 실행 결과를 보조하는 역할을 한다.
보통 큰 쿼리 안에서 중첩되며, 내부쿼리나 하위 쿼리라고도 부른다.
서브쿼리의 작성 위치에 따라 SELECT
, FROM
, WHERE
, HAVING
4가지로 나뉜다.
참고로 서브쿼리는 결과 형태에 따라 ‘단일 행’, ‘다중 행’, ‘다중 열’ 등으로 나뉘며, 각각의 경우에 맞는 연산자나 문법을 사용해야 한다.
해당 내용은 아래 블로그에 정리해뒀다.
https://lold2424.tistory.com/210
[DB] SQL - 단일 행, 다중 행, 다중 열 서브쿼리 개념 정리
사용한 데이터 테이블 구조개념 정리에 들어갈 코드 예시에 테이블 구조는 아래와 같다.사원 정보를 저장하고 있는 EMP 테이블emp_idnamejobsaldept_id1AliceCLERK2500102BobMANAGER4000103CharlieCLERK2000204DaveSALESMAN
lold2424.tistory.com
서브쿼리 작성 예시
설명으로만 들으면 어떻게 써야하는지 감이 안잡히기 때문에 아래 테이블 2개를 가지고 예시를 들어보겠다.
- 사원 정보를 담고 있는
EMP
테이블
emp_id | name | dept_id | sal |
1 | Alice | 10 | 3000 |
2 | Bob | 20 | 2500 |
3 | Carol | 10 | 4000 |
4 | Dave | 30 | 1800 |
5 | Erin | 20 | 2500 |
- 부서 정보를 담고 있는
DEPT
테이블
dept_id | dept_name |
10 | HR |
20 | IT |
30 | Sales |
SELECT절 서브쿼리
서브쿼리 결과를 컬럼(열)처럼 사용한다.
각 사원의 급여와 전체 사원 평균 급여를 함께 조회하려면 아래와 같이 작성하면 된다.
SELECT name, sal,
(SELECT AVG(sal) FROM emp) AS avg_sal
FROM emp;
- 결과
name | sal | avg_sal |
Alice | 3000 | 2760 |
Bob | 2500 | 2760 |
Carol | 4000 | 2760 |
Dave | 1800 | 2760 |
Erin | 2500 | 2760 |
FROM절 서브쿼리
서브쿼리를 가상의 테이블처럼 사용한다.
부서별 평균 급여를 먼저 구하고, 그 결과에서 평균 급여가 2800 이상인 부서만 출력하려면 아래와 같이 작성하면 된다.
SELECT dept_id, avg_sal
FROM (
SELECT dept_id, AVG(sal) AS avg_sal
FROM emp
GROUP BY dept_id
) AS dept_avg
WHERE avg_sal >= 2800;
- 결과
dept_id | avg_sal |
10 | 3500 |
WHERE절 서브쿼리
서브쿼리 겨리과를 조건 비교에 사용한다.
10번 부서의 평균 급여보다 더 많이 받는 사원을 찾으려면 아래와 같이 작성하면 된다.
SELECT name, sal
FROM emp
WHERE sal > (
SELECT AVG(sal)
FROM emp
WHERE dept_id = 10
);
- 결과
name | sal |
Carol | 4000 |
HAVING절 서브쿼리
GROUP BY
로 묶인 결과에 조건을 걸기 때문에, WHERE
에서는 불가능한 집계 조건을 필터링할 수 있다.
전체 평균 급여보다 높은 평균 급여를 가진 부서만 찾으려면 아래와 같이 작성하면 된다.
SELECT dept_id, AVG(sal) AS avg_sal
FROM emp
GROUP BY dept_id
HAVING AVG(sal) > (
SELECT AVG(sal) FROM emp
);
- 결과
dept_id | avg_sal |
10 | 3250.0000 |
20 | 3500.0000 |
'DB' 카테고리의 다른 글
[DB] SQL - 서브 쿼리를 이용한 동적 쿼리 활용 방법 (0) | 2025.04.02 |
---|---|
[DB] SQL - 단일 행, 다중 행, 다중 열 서브쿼리 개념 정리 (0) | 2025.04.01 |
[DB] SQL - JOIN에 사용되는 조건절(USING, ON)에 대해 알아보자. (0) | 2025.03.31 |
[DB] SQL - 조인(JOIN)이란? (0) | 2025.03.31 |
[DB] SQL - 문자, 숫자, 날짜 함수로 속성 변형하기 (0) | 2025.03.28 |