본문 바로가기

DB

[DB] SQL - 서브쿼리 개념 정리

728x90

서브쿼리란?

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
728x90