본문 바로가기
개발일지/임시카테고리

SQL Subquery 종류

by 다니엘의 개발 이야기 2022. 7. 2.
320x100

Subquery 종류

 

##1 스칼라 서브쿼리 (Scalar Subquery) - SELECT 절에 사용

 

select column1, (select column2 from table2 where condition)

from table1

where condition;

 

예제

 

select case_number,

(select avg(case_number)

from crime_status

# 여기 마지막에 쓰인 avg는 서브쿼리 전체를 alias로 해서 avg라고 해준다는것이다.

where crime_type like ‘강도’ and status_type like ‘검거’) avg

from crime_status

where police_station like ‘은평’ and crime_type like ‘강도’ and status_type like ‘검거’;

 

# 즉, 위의 예시는 쉽게 select에 case_number, avg

라고 해주는 것이다.

복수의 값은 select 문에서 가질 수 없으나, 이런식으로 만들어주면 가질 수 있는것같다

 

# 그래서 select 절에 사용할 수 있다. 고 해준것같다.

 

 

==========================================

 

##2 인라인 뷰 (Inline View) - FROM 절에 사용

 

select a.column, b.column

from table1 a, (select column1, column2 from table2) b

where condition;

 

예제

 

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

 

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;

 

# ~~ 별로. 라는 문장을 group by로 처리하는 거라고 한다.

# 이거는 뭔 말인지 모르겠다;

 

==========================================

 

##3 중첩 서브쿼리 (Nested SubQuery) - WHERE 절에 사용

 

 

==========

#1 single row subquery

 

select column_names

from table_name

where column_name = (select column_name

from table_name

where condition)

order by column_name;

 

예제

select name from celeb where name = (select host from snl_show where id = 1);

 

# where 절과 비교해줘야하는 것에 대해서 쓰는 행이 1개여야한다.

# 보아하니 핵심은 where 조건문에서 = 으로 해줬을때 결과값은 1개여야 하기 때문인것같다.

 

==========

 

# 2 multiple row - in

 

# 서브쿼리 결과 중에 포함 될때

select column_names

from table_name

where column_name in (select column_name

from table_name

where condition)

order by column_names;

 

 

예제

SNL에 출연한 영화배우를 조회

 

select host

from snl_show

where host in (select name

from celeb

where job_title like ‘%영화배우%’);

 

# 보아하니 핵심은 where 조건문에서 in 으로 해줬을때 결과값은 복수의 결과값이어도 된다.

 

==========

 

# 3 multiple row - exists

 

select coluimn_names

from table_name

where exists (select column_name

from table_name

where condition)

order by column_names;

 

예제

 

범죄 검거 혹은 발생 건수가 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);

 

 

==========

 

# 4 multiple row - ANY 예제

 

select name

from celeb

where name = any (select host

from snl_show);

 

==========

 

# 5 multiple row - ALL (where 절에서의 조건을 “모두”만족 해야한다.)

 

select column_names

from table_name

where column_name = all (select column_name

from table_name

where condition)

order by column_names;

 

==========================================

 

##4 multi column subquery - 연관 서브쿼리

 

# 서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우

 

select column_names

from table name a

where (a.column1, a.column2, …) in (select b.column1, b.column2, …)

from table name b

where a.column_name = b.column_name)

 

order by column_names;

 

예제

 

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

 

select name, sex, agency

from celeb

where (sex, agency) in (select sex, agency from celeb where name = ‘강동원’);

 

# 근데 이건 약간 의문이다.

where (sex, agency)가 리스트 형태로 1개의 데이터로 묶이는 거면 상관이 없는데,

그게 아니라면

sex중에서 1개만 있어도 대조 될테고, agency 중에 하나만 있어도 대조될텐데.

 

물론 결과값을 보면 괜찮은 코드인것같구 리스트 형태로 대조하는것같다.

300x250