sql - subquery

화이팅·2023년 1월 18일
0

sql

목록 보기
11/17

subquery

  • 하나의 sql문 안에 포함되어 있는 또 다른 sql문
  • 메인쿼리가 서브쿼리를 포함하는 종속적인 관계
  • 서브쿼리는 메인쿼리의 칼럼 사용가능
  • 메인쿼리는 서브쿼리 칼럼 사용 불가능
  • 서브쿼리 괄호로 묶어서 사용 가능
  • 단일행 혹은 복수행 비교 연산자와 함께 사용 가능
  • sub쿼리에서 order by 사용 x

1. 스칼라 서브쿼리 - select절에만 사용 / 결과 : 하나의 칼럼

ex1) 서울은평경찰서의 강도 검거 건수와 서울시 경찰서 전체의 평균 강도 검거 건수 조회

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 '검거';

2. 인라인 뷰-from 절에 사용 / 메인쿼리에서는 인라인 뷰에서 조회한 컬럼만 사용 가능

ex1) 경찰서 별로 가장 많이 발생한 범죄 건수와 범죄 유형 조회

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='발생'
    group by police_station) m
where c.police_station = m.police_station and c.case_number = m.count;    # m테이블과 c 조인

3. 중첩 서브쿼리-where절에 사용

1) single row : 하나의 열 검색(서브쿼리 비교연산자와 사용)

select name from celeb where name = (select host from snl_show); # 1개 아니므로 오류
 select name from celeb where nmae = (select host from snl_show where id=1);

2) multiple row : 하나 이상의 열 검색

# snl에 출연한 영화배우 조회(in)

select host
from snl_show
where host in(select name from celeb
			   where job_title like '영화배우');
               
# exists : 서브쿼리 결과에 값 있으면 반환

where 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);

3) multiple column : 하나 이상의 행 검색

# 강동원과 성별, 소속사가 같은 연예인 이름, 성별 , 소속사 조회

select name, sex, agency
from celeb
where (sex, agency) in (select sex, agency from celeb where name ='강동원');
profile
하하...하.

0개의 댓글