본문 바로가기
SQL Professional

[독학! SQLP] 서브쿼리

by 개발자의 2025. 8. 20.

 

서브쿼리?

  • 정의: 하나의 SQL문 안에 포함된 또 다른 SQL문. SELECT, INSERT, UPDATE, DELETE 등에서 사용 가능.
  • 형태: 보통 괄호 ( ) 안에 작성됨.
  • 용도: 비교 값 제공, 조건절로 사용, 집계된 값 반환 등.

서브쿼리의 종류

단일행 서브쿼리

  • 결과가 1행 1열
  • WHERE 절에서 사용
  • 연산자 : =, <, >, <=, >=
  • 예시
-- 평균 급여보다 큰 사원
SELECT ename
     , sal  
  FROM emp  
 WHERE sal > (SELECT AVG(sal) FROM emp);

다중행 서브쿼리

  • 결과가 여러행
  • WHERE 절에서 사용
  • 연산자 : IN, ANY, ALL, EXISTS
  • 예시
-- 댈러스 부서 직원
SELECT ename
     , deptno  
  FROM emp  
 WHERE deptno IN (SELECT deptno FROM dept WHERE loc = 'DALLAS');

다중열 서브쿼리

  • 결과가 여러 열
  • WHERE 절에서 사용
  • 연산자 : (col1, col2) IN ...
  • 칼럼 수와 자료형 일치 해아한다.
  • 예시
-- SCOTT과 같은 부서+직무 가진 사원
SELECT ename
     , deptno
     , job  
  FROM emp  
 WHERE (deptno, job) IN (SELECT deptno, job FROM emp WHERE ename = 'SCOTT');

상관 서브쿼리

  • 외부 쿼리의 값을 내부 쿼리가 참조
  • WHERE/HAVING 절 조건에서 행을 필터링 하는 역할
  • 연산자 : =, IN 등
  • 외부 쿼리의 컬럼을 내부(서브쿼리)에서 참조하는 방식으로 외부 쿼리의 각 행마다 서브쿼리가 반복실행됨(참/거짓 판별).
  • 일반 서브쿼리와 달리 독립적으로 실행이 불가하다.
  • 성능상 비용 ↑ (조인으로 대체 가능할 때가 많음).
  • 예시
-- 각 부서 평균보다 급여가 높은 사원
SELECT e.ename
     , e.sal  
  FROM emp e  
 WHERE e.sal > (SELECT AVG(sal) FROM emp WHERE deptno = e.deptno);

스칼라 서브쿼리

  • 단일 값 반환 (결과가 1행 1열)
  • SELECT 절에서 값 처럼 사용
  • 열을 확장할때 씀.
  • 상관 서브쿼리처럼 외부 컬럼을 참조하기도 하지만, 용도가 출력의 확장이므로 스칼라 서브쿼리로 분류함.
  • 예시
-- 사원과 부서명 같이 출력
SELECT ename
     , sal
     , (SELECT dname FROM dept d WHERE d.deptno = e.deptno) AS dept_name 
  FROM emp e;

인라인 뷰

  • 여러행(뷰처럼 취급)
  • FROM 절에 사용
  • Top-N, 중간집계시 사용
  • 예시
SELECT * 
  FROM (
    SELECT ename
         , sal 
      FROM emp 
     ORDER BY sal DESC
  )  
 WHERE ROWNUM <= 3; → 급여 Top 3

WITH 절(공통 테이블 식, CTE)

  • 여러행
  • FROM (뷰처럼)/SELECT(스칼라 서브쿼리 처럼)절 에서 사용
  • 쿼리 재사용, 가독성↑
  • 예시
-- 각 부서 평균보다 높은 급여 사원
WITH dept_avg AS ( 
	SELECT deptno
         , AVG(sal) avg_sal 
      FROM emp 
     GROUP BY deptno 
)
SELECT e.ename
     , e.sal 
  FROM emp e 
  	JOIN dept_avg d 
    ON e.deptno = d.deptno 
 WHERE e.sal > d.avg_sal;

 

'SQL Professional' 카테고리의 다른 글

[독학! SQLP] 데이터베이스 구조  (4) 2025.08.21
[독학! SQLP] 계층 쿼리  (0) 2025.08.20
[독학! SQLP] 트랜잭션  (1) 2025.08.20
[독학! SQLP] SQL 조인!  (6) 2025.08.20
[독학! SQLP] 그룹핑 쿼리  (0) 2025.08.20