하나의 SQL 문에 포함되어 있는 또 다른 SQL 문
장점
서브쿼리는 쿼리를 구조화시키므로, 쿼리의 각 부분을 명확히 구분할 수 있게 해준다.
서브쿼리는 복잡한 JOIN이나 UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공
서브쿼리는 복잡한 JOIN이나 UNION 보다 좀 더 읽기 편함 (가독성이 좋음)
where 절에서 쓰는 서브쿼리가 가장 일반적인 형태이다.
비교 연산자(=, <, <=, >, >=, <>)와 함께 사용할 때, 반드시 결과건수가 1건이어야 함.
서브쿼리의 결과가 2건 이상인 경우 에러 발생
그룹함수를 사용하는 경우 결과가 1건이라서 사용가능
SELECT C1, C2, C3
FROM T1
WHERE C1 = (SELECT C1
FROM T2
WHERE C2 = '3')
SELECT C1, C2, C3
FROM T1
WHERE C1 <= (SELECT AVG(C1)
FROM T2
WHERE C2 = '3')
서브쿼리의 결과가 2건 이상 반환하면, 반드시 다중 행 비교 연산자(IN, ALL, ANY, SOME)와 함께 사용해야 함.
SELECT C1, C2, C3
FROM T1
WHERE C1 IN (SELECT C1
FROM T2
WHERE C2 = '3')
여러 개의 컬럼을 반환해 메인쿼리의 조건과 동시에 비교함.
SELECT C1, C2, C3
FROM T1
WHERE (C1, C2) IN (SELECT C1, C2
FROM T2
WHERE C2 = '3')
메인쿼리의 컬럼을 서브쿼리에서 사용.
SELECT T1.C1, T1.C2, T1.C3
FROM T1 T1
WHERE (T1.C1, T1.C2) IN (SELECT T2.C1, T2.C2
FROM T2 T2
WHERE T2.C2 = T1.C2)
SELECT T1.C1, (SELECT AVG(T2.C1) FROM T2 T2)
FROM T1 T1;
SELECT T1.C1, T2.C1, T2.C2
FROM T1 T1,
(SELECT C1, C2 FROM T2) T2
WHERE T1.C1 = T2.C1;
SELECT T1.C1, T2.C1, T2.C2
FROM T1 T1, T2 T2
WHERE T1.C1 = T2.C1
GROUP BY T1.C1, T2.C1, T2.C2
HAVING AVG(T1.C1) < (SELECT AVG(C1)
FROM T2 );
union :
쿼리의 결과를 합친다. (distinct)
union all :
쿼리의 결과를 합친다. (중복 O)
중복을 제거하지 않아서 더 빠르다.