티스토리 뷰

서브쿼리란?

서브쿼리는 SQL 내부에 포함된 또 다른 SQL문을 말한다.

서브쿼리 종류

서브쿼리는 위치에 따라 명칭과 역할이 달라진다.

1. WHERE 절 서브쿼리

SELECT *
FROM 테이블
WHERE 컬럼 IN (SELECT 컬럼 FROM 테이블);

가장 일반적 형태의 서브쿼리이다. 특별한 공식 명칭은 없다.

2. 인라인 뷰

FROM 절에 존재하는 서브쿼리를 인라인뷰라고 부르며 테이블 처럼 활용한다.

SELECT *
FROM (
    SELECT * FROM 테이블
) v;

3. 스칼라 서브쿼리

SELECT 절에 사용되는 서브쿼리를 스칼라 서브쿼리라고 한다. 스칼라는 단일을 의미한다. 스칼라 서브쿼리는 단일 행을 반환해야한다. 다중 행 반환 시 오류가 발생한다.

SELECT
    컬럼,
    (SELECT COUNT(*) FROM 테이블) AS cnt
FROM 테이블;

상관 쿼리 vs 비상관 쿼리

1. 상관 쿼리

상관 쿼리는 서브쿼리가 외부 쿼리의 컬럼을 참조하는 형태를 말하며, 외부 쿼리의 로우마다 서브쿼리가 실행되는 쿼리를 말한다.
예를 들어, 10만건의 데이터를 조회한다고 하는 경우 상관쿼리는 추가로 10만건의 쿼리를 실행하는것과 같다. 카티션 곱처럼 연산 횟수가 기하급수적으로 올라갈 수 있다.

SELECT
    e.employee_id,
    e.employee_name,
    (SELECT d.department_name
     FROM departments d
     WHERE d.department_id = e.department_id) AS dept_name
FROM
    employees e;

상관 쿼리는 성능상 위험한 쿼리이며 대부분 JOIN 연산을 통해 성능 개선이 가능하다.

SELECT
    e.employee_id,
    e.employee_name,
    d.department_name
FROM 
    employees e
LEFT JOIN
    departments d
ON e.department_id = d.department_id;    

2. 비상관 쿼리

비상관 쿼리는 외부 쿼리와 관계가 없는 쿼리로서 딱 한번만 수행되는 서브쿼리를 말한다.

SELECT
    emp_id,
    name
FROM
    employees
WHERE salary > (SELECT AVG(salary) FROM employees);

위 쿼리에서 SELECT AVG(salary)...은 딱 한 번만 수행된다.

한 줄 요약

서브쿼리는 SQL 작성 시 구조가 단순하고 읽기 쉬워서 자주 사용된다.
그러나, 상관 쿼리처럼 동작 원리를 이해하지 않고 작성하면 상상 이상으로 큰 연산량이 발생하여 심각한 성능 장애로 이어질 수 있다.
기본적인 서브쿼리 개념과 상관/비상관 차이만 이해해도 대부분의 문제를 예방할 수 있으므로, 서브쿼리는 항상 주의해서 사용해야 한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함