- 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문
- 메인쿼리가 서브쿼리를 포함하는 종속적인 관계
- 서브쿼리는 메인쿼리의 칼럼 사용 가능
- 메인쿼리는 서브쿼리의 칼럼 사용 불가
- 서브쿼리는 괄호로 묶어서 사용
- 단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능
- 서브쿼리에서는 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 crime_type like '강도' and status_type like '검거' and police_station like '은평';
- FROM 절에 사용
- 메인쿼리에서는 인라인 뷰에서 조회한 컬럼만 사용가능
- 테이블처럼 사용
✏️경찰서 별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회
select c.police_station, c.crime_type, c.case_number
from crime_status c
(select police_staion, 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 절에 사용
- 종류 3가지
Single Row - 하나의 열을 검색하는 서브쿼리
Multiple Row - 하나 이상의 열을 검색하는 서브쿼리
Multiple Column - 하나 이상의 행을 검색하는 서브쿼리
- 서브쿼리가 비교연산자( =, >, >=, <, <=, <>, !=)와 사용되는 경우,
서브쿼리의 검색 결과는 열이 한 개인 결과값을 가져야 한다.
✏️snl에 출연한 연예인의 이름
(에러)⚠️ - 서브쿼리 결과 값이 1개 이상의 열임
select name from celeb where name = (select host from snl_show);
(정답)✅
select name from celeb where name = (select host from snl_show where id=1);
IN : 서브쿼리 결과중에 포함될 때
✏️SNL 에 출연한 영화배우를 조회
select host from snl_show
where host in (select name from celeb where job_title like '%영화배우%'
or
select host from snl_show
inner join celeb
on host = name
where job_title like "%영화배우%"
EXISTS : 서브쿼리 결과에 값이 있으면 반환
✏️범죄 검거 혹은 발생 건수가 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 : 서브쿼리 결과 중에 최소한 하나라도 만족하면 (비교연산자 사용)
✏️SNL 에 출연한 적이 있는 연예인 이름 조회
select name from celeb
where name = any (select host from snl_show)
ALL : 서브쿼리 결과를 모두 만족하면 (비교 연산자 사용)
✏️SNL 에 출연한 적이 있는 연예인 이름 조회
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 = '강동원');
😖서브쿼리는 왜 사용하는 걸까 아리까리해서 찾아 본 글..
https://project-notwork.tistory.com/38