SQL, Subquery

sky.dev·2025년 5월 3일

Data&AI-Uni.

목록 보기
26/77
post-thumbnail

Subquery

Subquery

하나의 쿼리문 안에 -> 포함되는 또다른 쿼리문! == 중첩 쿼리 (쿼리 재사용)

즉, 메인 쿼리 > 서브 쿼리 포함하는 종속적 관계

✔️ 하나의 중첩된 쿼리문으로 간편히 결과 얻기 가능
✔️ 새로운 컬럼이 필요하지 않을 때 서브쿼리 사용! → (JOIN과의 차이점)

→ 완전 다른 테이블에서 데이터 값을 조회 → 그 결과를 메인쿼리 조건에 사용할 때 주로 사용함

실행순서

서브쿼리 먼저 실행 후 → 메인 쿼리 실행!

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

서브쿼리 특징

( )로 묶어 사용
연산자 오른쪽에 위치
서브쿼리 내: ORDER BY ❌
괄호 뒤에 ; ❌


WHERE절 서브쿼리

🔹 단일행 서브쿼리 vs 다중행 서브쿼리

✅ 서브 쿼리 결과 == 메인쿼리 조건

(1)

SELECT MIN(주문금액)
FROM 주문;

(2)

SELECT 고객명, 한도
FROM 고객
WHERE 한도 < (
    SELECT MIN(주문금액)
    FROM 주문
);

✅ 서브쿼리 결과 → 항상 1개 이하
✅ → 단일행 비교연산자 사용: =, !=, <, > 등

(3)

SELECT 주문번호
FROM 주문
WHERE 고객ID IN (
    SELECT 고객ID
    FROM 고객
    WHERE 국가 = 'USA'
);

FROM절 서브쿼리

🧩 인라인 뷰 (inline view)

뷰처럼 작동해서 붙여진 단어

💬 View(뷰)?
: 가상 테이블 (논리적 테이블, 물리적 테이블이 아님)

✅ 데이터 추출 결과를 1개의 테이블처럼 사용하기 위해!
→ 특정 조건을 만족하는 데이터 추출 결과를 → 테이블처럼 사용 가능

SELECT 고객ID, MAX(구매일자) AS 마지막구매일자
FROM 구매
GROUP BY 고객ID;

SELECT 고객ID,
       마지막구매일자,
       julianday('now') - julianday(마지막구매일자) AS 일수_차이
FROM (
    SELECT 고객ID, MAX(구매일자) AS 마지막구매일자
    FROM 구매
    GROUP BY 고객ID
) AS 최근구매;

SELECT절 서브쿼리

✨ 서브쿼리 결과를 새로운 컬럼 값으로 활용!

→ 하나의 값(스칼라값)을 반환하는 서브쿼리만 사용 가능!
→ SELECT절에서 추가 계산, 비교용 값 등으로 많이 사용됨

SELECT 고객ID,
       SUM(구매금액) AS 총구매금액,
       (SELECT AVG(구매금액) FROM 구매) AS 전체평균금액
FROM 구매
GROUP BY 고객ID;

HAVING절 서브쿼리

✨ 집계 이후 조건 필터링할 때 사용
→ GROUP BY 결과에 대해 조건 비교를 위해 서브쿼리 활용 가능
SELECT 고객ID, SUM(구매금액) AS 총구매
FROM 구매
GROUP BY 고객ID
HAVING SUM(구매금액) > (
    SELECT AVG(구매금액)
    FROM 구매
);

0개의 댓글