Part 05. SQL_Chapter 17. SQL Subquery

수야·2023년 8월 1일
0

Subquery

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

  • 서브쿼리는 메인 쿼리의 칼럼 사용가능

  • 메인쿼리는 서브쿼리의 칼럼 사용 불가

  • 서브 쿼리는 괄호로 묶어서 사용

  • 단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능

  • 서브 쿼리에서 order by를 사용할 수 없음

서브쿼리 종류

스카라 서브쿼리 (scalar subquery) : select 절에 사용
인라인 뷰(inline view) : from 절에 사용
중첩 서브쿼리(nested subquery) : where절에 사용

스카라 서브쿼리 (scalar subquery)

select 절에서 사용하는 서브쿼리, 결과는 하나의 column 이어야만 한다.

select coulmn1,..., (select coulmn2 from table2 where condition)
from table1
where condition;

ex) 서울 은평경찰서의 강도 검거 건수와 서울시 경찰서 전체의 평균 강도 검거 건수를 조회
🌟스카라 서브쿼리 들어가는 절 : 서울시 경찰서 전체의 평균 강도 검거 건수

인라인 뷰(inline view)

from 절에 사용하는 서브쿼리.
메인쿼리에서는 인라인 뷰에서 조회한 column만 사용가능

select a.colmn, b.column
from table1 a, (select column1, column2 from table 2) b
where condition;

ex) 경찰서 별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회
🌟인라인 뷰 들어가는 절 : 경찰서 별 경찰서 별로 가장 많이 발생한 범죄 건수

예시)
oil_price 테이블에서 상표별로 가장 비싼 가격과 상호를 Inline View를 사용하여 조회하세요
답안)

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

as를 썼어야함..

예시) refueling 테이블과 oil_price 테이블에서 10만원 이상 주유한 연예인 이름, 상호, 상표, 주유금액, 가격을 inline view를 사용하여 조회하세요
답안)

select r.이름, r.주유금액, o.상호, o.상표, o.가격
from oil_prcie o, (select 이름, 주유소, 주유금액 from refueling where 주유 금액 > 100000) r
where r.주유소 = o.상호 ;

중첩 서브쿼리(nested subquery)

where 절에서 사용하는 서브쿼리

  • single row : 하나의 열을 검색하는 서브쿼리
  • multiple row : 하나 이상의 열을 검색하는 서브쿼리
  • multiple column : 하나 이상의 행을 검색하는 서브쿼리

single row

select column_names
from tablename
where column name = (select column_name from tablename where condition)
order by column_name;

서브 쿼리가 비교연산자와 사용되는 경우
서브쿼리의 검색결과는 한개의 결과값을 가져야한다 (두개이상일 경우 에러)

예시)
평균 가격보다 높은 주유소 상호와 가격을 Nested subquery를 사용하여 조회하세요.
답안)

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

multiple row & IN

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

select column_names
from table_name
where column_name in(select column_name from tablename where condition)
order by column_names;

예시)
single row에서 조회한 주유소에서 주유한 연예인의 이름과 주유소, 주유일을 nested subquery를 사용하여 조회하세요 (refueling 테이블)
답안)

select 이름, 주유소, 주유일
from refueling 
where 주유소 in (select 상호 from oil_price where 가격 >(select avg(가격) from oil_price));

리스트 중에 서브쿼리 안에 있는 것만 반환

multiple row & Exists

서브쿼리 결과에 값이 있으면 반환

select column_nmaes
from table_name
where exists(select column_name from tablename where condition)
order by column_names;

multiple row & Any

서브쿼리 결과 중에 최소한 하나라도 만족하면 반환 (비교 연산자 사용)

select column_names
from table_name
where column_name = any (felect column_name from tablename where condition)
order by column_names;

multiple row & All

서브 쿼리 결과를 모두 만족하면 반환 (비교 연산자 사용)

select column_names
from table_name
where solumn_name = all (select coulmn_name from table_name where condition)
order by column_names;

multiple column

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

select column_names
from tablename a
where (a.column1, a.column2,...) IN (select b.column1,b.column2,... from tablename b where a.column_name = b.column_name)
order by column_names;
profile
수야는 코린이에서 더 나아갈거야

0개의 댓글