하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말한다
메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다
- 서브쿼리는 메인쿼리의 칼럼 사용 가능
- 메인쿼리는 서브쿼리의 칼럼 사용 불가
- 서브쿼리는 괄호를 묶어서 사용
- 단일 행 혹은 복수 행 비교 연산자와 함께 사용가능
- 서브쿼리는 Order by 사용 불가
- scalar subquery는 SELECT절에서 사용
- Inline View는 From절에서 사용
- 중첩 서브쿼리( Nested Subquery) WHERE절에 사용
Scalar Subquery 예제1 )
서울 은평경찰서의 강도 검거 건수와 서울시 경찰서 전체의 평균 강도 검거 건수를 조회
SELECT case_number,
(SELECT AVG(case_number) from crime_status
WHERE crime_stype LIKE "강도" AND status_type LIKE "검거") avg
FROM crime_status
WHERE police_station LIKE "은평" AND crime_stype LIKE "강도" AND status_type LIKE "검거";
FROM절에서 서브쿼리한 결과를 하나의 테이블처럼 사용하는 것
인라인뷰 예제1 ) 경찰서 별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회
SELECT c.police_station, c.crime_type, c.case_number
FROM crime_status c,
(SELECT police_station, MAX(case_number) count from crime_status
where status_type LIKE "발생" GROUP BY police_station) m
WHERE c.police_station = m.police_station AND c.case_number = m.count;
Where절에서 사용하는 서브쿼리
SELECT column_name FROM table_name WHERE column_name = ( SELECT column_name FROM table_name WHERE condition)
- Single Row 쿼리할 때 괄호 빼면 에러남
WHERE column_name IN ( SELECT column_name
FROM table_name
WHERE condition)
EXISTS 서브쿼리 결과에 값이 있으면 반환함
예제1) 범죄검거 혹은 발생 건수가 2000보다 큰 경찰서 조회
SELECT name FROM police_station p
WHERE EXISTS ( SELECT police_station FROM crime_status c
WHERE p.name = c.reference AND case_number > 2000) ;
ANY : 서브쿼리 결과중 최소한 하나라도 만족하면 결과 반환
예제1) SNL에 출연한 적이 있는 연예인 이름조회
SELECT name FROM celeb
WHERE name = ANY ( SELECT host FROM snl_show);
ALL : 서브쿼리 결과를 모두 만족하면 결과 반환
예제1) 강동원과 성별, 소속사가 같은 연예인의 이름, 성별, 소속사, 조회
SELECT name, age, sex FROM celeb
WHERE (sex, agency) IN (SELECT sex, agency from celeb where name = "강동원");