상세 컨텐츠

본문 제목

SUBQUERY 와 JOIN 의 차이 (下)

자료 번역 : SQL

by kimsyoung 2021. 1. 25. 22:44

본문

이전 편 SUBQUERY 와 JOIN 의 차이 (上) 에서는 서브 쿼리를 조인으로 대체하여 작성할 수 있는 경우를 살펴보았습니다. 서브 쿼리를 조인으로 굳이 재작성하는 가장 큰 이유는 쿼리의 수행력 때문입니다. 서브 쿼리로 작성하면 최종 결과 테이블을 얻을 때까지 매번 쿼리가 실행되어야 하기 때문에, 단순히 공통된 값을 중심으로 여러 개의 테이블을 연결한 후 필요한 값만 조회하는 조인에 비해 속도가 느릴 수밖에 없습니다. 이에 관해서는 이전 편에서 자세히 다루었으니, 해당 글을 참조해 주시면 됩니다. 이번 글에서는 반대로 서브 쿼리를 조인으로 대체할 수 없는 경우, 즉 서브 쿼리가 유일한 해결책인 경우에 대해 알아볼 것입니다.

 

서브 쿼리를 조인으로 대체할 수 없는 경우

조인은 쿼리의 효율성 측면에서 바라보면 서브 쿼리보다 유용한 것은 사실입니다. 하지만, 서브 쿼리가 조인으로 대체될 수 없는 경우도 있습니다. 지금부터 그 경우들을 살펴보고자 합니다.

 

1) GROUP BY 를 사용한 서브 쿼리가 FROM 절에 있을 때

가장 첫 번째 케이스는 집계된 값들을 구하고자 GROUP BY 를 사용한 서브 쿼리가 FROM 절에 들어 있을 때입니다.

실제 쿼리문을 통해 살펴보도록 하겠습니다.

SELECT
 city,
 sum_price
FROM
 ( SELECT
     city, 
     SUM(price) AS sum_price 
   FROM sale
   GROUP BY city ) AS s
WHERE sum_price < 2100;

결과는 다음과 같습니다.

citysum_price
Chicago2000.00
Detroit100.00
Cleveland1590.00

여기서 서브 쿼리는 도시의 이름과 각 도시별 총 판매액을 반환합니다. 여기서 각 도시별 총판매액은 SUM 집계 함수와 GROUP BY를 통해 구하였습니다. 서브 쿼리의 결과를 하나의 테이블로 간주한 외부 쿼리는 여기서 총판매액이 2,100 달러 미만인 도시만 조회합니다. 참고로, 서브 쿼리가 FROM 절에 사용될 경우 해당 서브 쿼리는 무조건 별칭이 있어야 합니다. 그래서 예시에서도 sale 테이블의 s 를 서브 쿼리의 별칭으로 사용하였습니다. 

 

2) 집계된 값을 반환하는 서브 쿼리가 WHERE 절에 있을 때

서브 쿼리를 조인으로 바꿔쓸 수 없는 또 다른 경우는 바로 1) 서브 쿼리가 집계된 하나의 값을 반환하고 2) 그 값을 WHERE 절에서 외부 쿼리의 값과 비교할 때입니다. 아래 예시를 보시죠.

SELECT name
FROM product
WHERE cost < ( SELECT AVG(price) FROM sale );

결과는 아래와 같습니다.

name
chair
armchair
desk
lamp

위 쿼리문은 전체 상품의 평균 판매가보다 가격이 낮은 상품명의 이름을 추출합니다. 첫째, 평균 판매가는 서브 쿼리 내에서 AVG 집계 함수를 사용하여 구했습니다. 둘째, 서브 쿼리에서 구한 평균 판매가를 외부 쿼리의 각 상품의 가격마다 매번 비교하며 부등호를 만족하는 결과만 남을 수 있도록 합니다.

 

3) 서브 쿼리가 ALL 연산자에 있을 때

마지막은 서브 쿼리가 ALL 연산자 안에 들어 있는 경우입니다.

SELECT name
FROM product
WHERE cost > ALL( SELECT price FROM sale )

이 서브 쿼리는 sale 테이블의 모든 판매가를 반환합니다. 외부 쿼리는 서브 쿼리의 결과를 가지고 상품의 가격이 판매가보다 높은 값만 조회합니다. 결과는 다음과 같습니다.

name
stool

 

글을 마무리하며

지금까지 서브 쿼리와 조인을 비교해 보았습니다. 서브 쿼리를 조인으로 대체하여 작성할 수 있는 경우와 그렇지 못한 경우를 나눠 살펴봄으로써 분석의 효용성을 높이는 방법에 관해 알아보았습니다. 대부분의 경우, 조인이 훨씬 효율적인 것은 사실입니다. 하지만, 서브 쿼리만이 해결할 수 있는 분석의 구조도 있다는 사실을 기억해 주세요. 서브 쿼리는 SQL 초심자가 쿼리를 직관적으로 읽어내기 용이하므로 선호되는 반면, 조인은 쿼리문이 복잡할수록 쿼리문을 논리적으로 구성하기에 편하므로 SQL에 익숙한 숙련자들이 선호하곤 합니다. 여러 개의 서브 쿼리를 작성하는 것은 쿼리를 읽기에도 불편하고, 쿼리의 실행 속도에도 영향을 끼칩니다. 따라서, 조인으로 작성할 수 있는 쿼리문이라면 서브 쿼리 대신 조인을 사용하는 것을 추천드립니다. 

 

원문: Subquery vs. JOIN

관련글 더보기