하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 말한다.
메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.
• 서브쿼리는 메인쿼리의 칼럼 사용 가능
• 메인쿼리는 서브쿼리의 칼럼 사용 불가
• Subquery 는 괄호로 묶어서 사용
• 단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능
• subquery 에서는 order by 를 사용X
SELECT 절에서 사용하고 결과는 하나의 COLUMN 이어야 한다.
# 서울은평경찰서의 강도 검거 건수와, 서울시 경찰서 전체의 강도 검거 건수률 조회
SELECT case_number,
(SELECT avg(case_number) FROM crime_status WHERE crime_type LIKE '강도' AND status_type LIKE '검거') avg
FROM crime_status
WHERE police_station LIKE '은평' AND crime_type LIKE '강도' AND status_type LIKE '검거';
FROM 절에 사용하는 서브쿼리, 메인쿼리에서는 인라인 뷰에서 조회한 column만 사용이 가능하다. (테이블 형태로 나와야한다.)
# 경찰서 별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회
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 name
FROM celeb
WHERE name = (SELECT host FROM snl_show WHERE id=1);
하나 이상의 행을 검색하는 서브쿼리
서브쿼리 결과 중에 포함 될때
# IN 두개 이상의 행
SELECT host
FROM snl_show
WHERE host IN (SELECT name FROM celeb WHERE job_title LIKE '%영화배우%');
# EXISTS
SELECT name
FROM police_station p
WHRER EXISTS (SELECT police_station FROM crime_status c WHERE p.name = c.reference AND case_number > 2000);
# ANY
SELECT name
FROM celeb
WHERE name = any (SELECT host FROM snl_show);
# ALL : 서브쿼리 결과를 모두 만족하면 비교연산자 사용
SELECT name
FROM celeb
WHERE name = all (SELECT host FROM snl_show WHERE id=1);
하나 이상의 열을 검색하는 서브쿼리
서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우.
SELECT name, sex, agency
FROM celeb
WHERE (sex, agency) in (SELECT sex, agency FROM celeb WHERE name='강동원');
이글은 제로베이스 데이터 취업스쿨의 강의자료 일부를 발췌하여 작성되었습니다.