하나의 sql 문 안에 포함되어있는 또 다른 sql 문을 말한다.
하나의 sql ans = 메인 쿼리
포함되어있는 또다른 sql ans = 서브 쿼리
메인 쿼리는 서브 쿼리를 포함하는 종속적인 관계이다.
서브쿼리는 메인 쿼리의 칼럼 사용가능
메인쿼리는 서브쿼리의 칼럼 사용 불가
서브 쿼리는 괄호로 묶어서 사용
단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능
서브 쿼리에서 order by를 사용할 수 없음
스카라 서브쿼리 (scalar subquery) : select 절에 사용
인라인 뷰(inline view) : from 절에 사용
중첩 서브쿼리(nested subquery) : where절에 사용
select 절에서 사용하는 서브쿼리, 결과는 하나의 column 이어야만 한다.
select coulmn1,..., (select coulmn2 from table2 where condition)
from table1
where condition;
ex) 서울 은평경찰서의 강도 검거 건수와 서울시 경찰서 전체의 평균 강도 검거 건수를 조회
🌟스카라 서브쿼리 들어가는 절 : 서울시 경찰서 전체의 평균 강도 검거 건수
from 절에 사용하는 서브쿼리.
메인쿼리에서는 인라인 뷰에서 조회한 column만 사용가능
select a.colmn, b.column
from table1 a, (select column1, column2 from table 2) b
where condition;
ex) 경찰서 별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회
🌟인라인 뷰 들어가는 절 : 경찰서 별 경찰서 별로 가장 많이 발생한 범죄 건수
예시)
oil_price 테이블에서 상표별로 가장 비싼 가격과 상호를 Inline View를 사용하여 조회하세요
답안)
select o.상호, o.상표, m.max_price
from oil_price o, (select 상표, max(가격) as max_price from oil_price group by 상표) m
where o.상표 = m.상표 and o.가격 = m.max_price;
as를 썼어야함..
예시) refueling 테이블과 oil_price 테이블에서 10만원 이상 주유한 연예인 이름, 상호, 상표, 주유금액, 가격을 inline view를 사용하여 조회하세요
답안)
select r.이름, r.주유금액, o.상호, o.상표, o.가격
from oil_prcie o, (select 이름, 주유소, 주유금액 from refueling where 주유 금액 > 100000) r
where r.주유소 = o.상호 ;
where 절에서 사용하는 서브쿼리
select column_names
from tablename
where column name = (select column_name from tablename where condition)
order by column_name;
서브 쿼리가 비교연산자와 사용되는 경우
서브쿼리의 검색결과는 한개의 결과값을 가져야한다 (두개이상일 경우 에러)
예시)
평균 가격보다 높은 주유소 상호와 가격을 Nested subquery를 사용하여 조회하세요.
답안)
select 상호, 가격
from oil_price
where 가격 >(select avg(가격) from oil_price);
서브쿼리 결과 중에 포함될 때
select column_names
from table_name
where column_name in(select column_name from tablename where condition)
order by column_names;
예시)
single row에서 조회한 주유소에서 주유한 연예인의 이름과 주유소, 주유일을 nested subquery를 사용하여 조회하세요 (refueling 테이블)
답안)
select 이름, 주유소, 주유일
from refueling
where 주유소 in (select 상호 from oil_price where 가격 >(select avg(가격) from oil_price));
리스트 중에 서브쿼리 안에 있는 것만 반환
서브쿼리 결과에 값이 있으면 반환
select column_nmaes
from table_name
where exists(select column_name from tablename where condition)
order by column_names;
서브쿼리 결과 중에 최소한 하나라도 만족하면 반환 (비교 연산자 사용)
select column_names
from table_name
where column_name = any (felect column_name from tablename where condition)
order by column_names;
서브 쿼리 결과를 모두 만족하면 반환 (비교 연산자 사용)
select column_names
from table_name
where solumn_name = all (select coulmn_name from table_name where condition)
order by column_names;
서브 쿼리 내에 메인 쿼리 컬럼이 같이 사용되는 경우
select column_names
from tablename a
where (a.column1, a.column2,...) IN (select b.column1,b.column2,... from tablename b where a.column_name = b.column_name)
order by column_names;