Join을 사용해야 할 때, Subquery를 사용해야할 때

Subquery란 SQL문 안에 포함돼있는 SQL문을 말한다,

Mainquery가  Subquery를 포함하는 관계이다.

 Subquery에서 Mainquery는  Subquery의 칼럼을 사용할 수 없다.


Join은 연산에 참여하는 두 집합간의 Product 관계이다.

모든 테이블이 대등한 관계에 있기 때문에

어느 위치에서든 연산에 참여하는 테이블의 칼럼들을 사용할 수 있다.


결과는 동일하게 가져올 수 있으나 

DB내에서 수행되는 로직은 다르다.


Subquery를 써야할 때 Join을 사용하거나

Join을 사용할 때 Subquery를 사용하는 경우


DB가 불필요한 연산과 블록 액세스 작업을 수행할 수 있다.


그렇다면 무엇을 기준으로

Join이 적합한 연산, Subquery가 적합한 연산임을 판단할까?



결과 집합의 레벨이 무엇인 따져본다.

Subquery의 결과 집합은 항상 Subquery를 감싸는 메인 쿼리의 레벨로 귀결된다.
Join의 결과 집합은 어떤 테이블 관계냐에 따라 다른데,
  • 1:1 -> 1 x 1 = 1 레벨 집합
  • 1:N -> 1 x N = N 레벨 집합
  • N:M -> N x M = N x M 레벨 집합
의 결과가 나온다.


결과의 집합 레벨을 기준으로 Join을 사용할지 Subquery를 사용할지 결정한다.


만든 예시)

A시의 투표소 목록을 출력

SELECT STATION_NAME AS 투표소명, LATITUE AS 위도, LONGITUDE AS 경도
FROM POLLING_STATION
WHERE CITY_ID= (SELECT CITY_ID
                             FROM CITY
                             WHERE CITY_NAME = 'A')
ORDER BY STATION_NAME;


A시와 동일한 이름의 시가 있다면

2건 이상의 결과가 반환돼 오류가 발생한다.

결과값이 단일행이기 때문에 단일행 비교연산자를 사용할 수 있다.


실제 테이블이라면 CITY테이블의 CITY_NAME에 UNIQUE 제약사항이 걸려있을 것이다.

그렇다면 위와 같은 subquery의 결과값이 단일행임을 보장할 수 있다.



댓글

이 블로그의 인기 게시물

실무진 면접 경험으로 정리하는 백엔드 (1) : 에듀 테크 기업 면접

노마드코더 개발자북클럽 Clean code 완주, 독후감

Blogger 커스터마이징 : CSS 수정 (sticky-header)