[SQL] 17. SQL subquery

JONGYOON JEON·2024년 2월 9일
0

SQL

목록 보기
11/13

정의

하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 말한다.
메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.

특징

서브쿼리는 메인쿼리의 칼럼 사용 가능
메인쿼리는 서브쿼리의 칼럼 사용 불가능
서브쿼리는 괄호로 묶어서 사용
서브쿼리에서는 order by 사용 불가

종류

Scalar subquery - select 절에 사용
inline view - from 절에 사용
nested subquery - where 절에 사용

scalar subquery 예시

mysql> 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 '%은평%';

inline view 예시

select c.police_station, c.crime_type, c.case_number
from crime_status c,
(select max(case_number) counts, police_station from crime_status group by police_station) m
where c.case_number = m.counts and c.police_station = m.police_station;

nested 예시

  • single row
    비교연산자를 사용했을 때 서브쿼리 결과값이 1개만 있어야함

multi row IN

where A in (select name from DB where condition)

multiple row exists

where A exists (select name from DB where condition) 존재하면~

select name from police_station p
-> where exists (select police_station, reference from crime_status c where p.name = c.reference and c.case_number >
2000);
문제가 약간 이상했다. 총 범죄 검거로 생각할 수도 있는데 .. 각 범죄에 대한 얘기였다.

multiple row any

select name from celeb where name any = (select host from snl_show);

any = <<<- "=" 잘넣자

multiple row all

select name from celeb where name all(select host from snl_show where id = 1); 여러개의 이름을 만족할 수 없으니 where로 한정함

select name from celeb where name = all(select host from snl_show where sex='w');

snl_show 에는 sex가 없는데 작동도 되고 이상한 답변이 나온다.ㅎㅎ;

multi column 예시

select name,sex,agency from celeb where (sex, agency) = (select sex, agency from celeb where name ='차승원')

실습

oil_price 데이터가 없어서 가상 실습했음

Scalar

select max(가격) maxp, (select avg(가격) avgp from oil_price where 셀프='y') from oil_price where 셀프 ='Y' and
상표='sk에너지';

Inline view

select o.상호, o.상표, o.가격, s.max_price from oil_price o, (select 상표, max(가격) maxp from oil_price group by
상표) p where o.상표 = p.상표 and p.maxp = o.가격;

single row

select 상호, 가격 from oil_price where 가격 > (select avg(가격) from oil_price)

profile
효율적인 걸 좋아해요

0개의 댓글