
하나의 쿼리문 안에 -> 포함되는 또다른 쿼리문! == 중첩 쿼리 (쿼리 재사용)
즉, 메인 쿼리 > 서브 쿼리 포함하는 종속적 관계
✔️ 하나의 중첩된 쿼리문으로 간편히 결과 얻기 가능
✔️ 새로운 컬럼이 필요하지 않을 때 서브쿼리 사용! → (JOIN과의 차이점)
→ 완전 다른 테이블에서 데이터 값을 조회 → 그 결과를 메인쿼리 조건에 사용할 때 주로 사용함
서브쿼리 먼저 실행 후 → 메인 쿼리 실행!
SELECT *
FROM 테이블명
WHERE 컬럼명 IN (
SELECT 컬럼명
FROM 테이블명
);
( )로 묶어 사용
연산자 오른쪽에 위치
서브쿼리 내: ORDER BY ❌
괄호 뒤에 ; ❌
🔹 단일행 서브쿼리 vs 다중행 서브쿼리
✅ 서브 쿼리 결과 == 메인쿼리 조건
(1)
SELECT MIN(주문금액)
FROM 주문;
(2)
SELECT 고객명, 한도
FROM 고객
WHERE 한도 < (
SELECT MIN(주문금액)
FROM 주문
);
✅ 서브쿼리 결과 → 항상 1개 이하
✅ → 단일행 비교연산자 사용: =, !=, <, > 등
(3)
SELECT 주문번호
FROM 주문
WHERE 고객ID IN (
SELECT 고객ID
FROM 고객
WHERE 국가 = 'USA'
);
🧩 인라인 뷰 (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 고객ID,
SUM(구매금액) AS 총구매금액,
(SELECT AVG(구매금액) FROM 구매) AS 전체평균금액
FROM 구매
GROUP BY 고객ID;
✨ 집계 이후 조건 필터링할 때 사용
→ GROUP BY 결과에 대해 조건 비교를 위해 서브쿼리 활용 가능
SELECT 고객ID, SUM(구매금액) AS 총구매
FROM 구매
GROUP BY 고객ID
HAVING SUM(구매금액) > (
SELECT AVG(구매금액)
FROM 구매
);