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 중에 하나만 있어도 대조될텐데.
물론 결과값을 보면 괜찮은 코드인것같구 리스트 형태로 대조하는것같다.
'개발일지 > 임시카테고리' 카테고리의 다른 글
제로베이스 오일 크롤링 중 (0) | 2022.07.05 |
---|---|
selenium 루틴 (오일 정보 크롤링) (0) | 2022.07.05 |
SQL Scalar Functions (0) | 2022.07.02 |
SQL group by 결과값 이상하다... 이건 아닌데 (0) | 2022.07.02 |
selenium, Beautifulsoup 루틴 첫번째 (0) | 2022.07.02 |