지난 글에서는 서로 다른 테이블을 공통된 필드 값으로 합쳐서 조회할 수 있는 Join과 모든 필드가 동일한 테이블을 합치는 Union에 대해 알아봤습니다.

이번 글에서는 쿼리 내 또 다른 쿼리를 사용할 수 있는 Subquery와 Subquery 사용 시 보다 쿼리를 간단하게 표현할 수 있는 With에 대해 알아보겠습니다.

(지난 글은 여기에서 확인 가능합니다.)

 

SQL 기초 - Subquery, With

서브쿼리 Subquery

데이터를 조회할 때, 필요한 데이터가 모여 있는 테이블을 여러 개 조인해서 확인하는 것도 가능하지만 이렇게 진행하는 경우 필드명을 확인할 때, 오히려 쿼리가 더 복잡해질 수 있습니다.

따라서 subquery를 사용해 쿼리를 제작하는 경우 오히려 Join을 사용할 때보다 더욱 쿼리 이해가 쉬운 경우도 존재합니다.

 

서브쿼리는 쉽게 말해 쿼리 속 쿼리가 포함되는 것이라고 이해하면 됩니다.

예를 들어 아래 예시 쿼리는 where에 서브쿼리를 적용한 예시입니다.

select * from user
where user_id in (
	select user_id from payment where payment_method='cash'
    );

 

위 쿼리를 해석해보면 아래와 같습니다.

  • user 테이블에서 user_id가 괄호 쿼리를 만족하는 결과 값만 가져오겠다.
  • 괄호 쿼리는 payment 테이블에서 payment_method(결제수단)이 cash(현금)인 사람의 user_id 값을 가져오겠다는 의미입니다.

결국 종합하자면 payment 테이블의 결제 수단이 현금인 사람들의 user_id에 맞는 user 테이블의 정보를 가져와라. 라는 의미의 쿼리입니다.

 

동일하게 join을 사용해서 표현하면 아래와 같을 것입니다.

select u.name, u.user_id .... from user u
join payment p on u.user_id = p.user_id
where p.payment_method = 'cash';

쿼리를 구성하는 분에 따라서는 join이 더 편할 수 있지만 join 사용 시에는 select ~ from 사이에 필드명을 직접 작성해줘야 하는 불편함이 있을 수 있어 오히려 subquery를 사용하는 것이 더 편한 경우도 있을 것입니다.

 

서브쿼리는 결국 이처럼 쿼리 안에 쿼리를 사용할 수 있는 기능으로 예시에서는 where에 사용했지만 select, from에도 사용 가능합니다.

각 경우의 형식은 아래와 같습니다.

<select>

select 필드명, (subquery) as 필드명, 필드명 from 테이블명;

select에 사용하는 subquery는 필드명 (필드 값)을 사전에 조회한 쿼리의 값을 추가하는 방식입니다.

 

<from>

select 필드명 from (
	subquery
    ) as 별칭;

from에 사용하는 subquery는 서브쿼리 자체를 테이블로써 활용하는 방식입니다.

SQL 쿼리 조회시 나오는 결과 값을 테이블로 사용한다고 이해하면 됩니다.

 

<where>

select 필드명 from 테이블명
where 필드명 in (
		subquery
        );

추가로 subquery는 1개만 사용할 수 있는 것은 아니며, 서브쿼리 안에 추가 서브쿼리를 사용하는 것도 가능합니다.

쿼리를 보다 간단히 표현하는 With

쿼리 속에 쿼리를 추가로 사용하는 subquery는 매우 유용하지만 많이 사용할 경우 쿼리의 구조가 복잡해서 어떤 데이터를 조회하려했는지 헷갈리게 되는 경우가 있습니다.

이러한 경우를 대비하기 위해 With을 통해 실제 쿼리를 보다 단순하게 표현할 수 있습니다.

 

With은 쿼리 가장 상단에서 사용하며, subquery로 사용할 쿼리를 미리 작성하고 실제 데이터 조회에서는 with에서 사전에 정의한 쿼리를 불러와서 사용하는 방식입니다.
결국, with은 임시 테이블을 만드는 것이라고 이해하면 됩니다.

 

형식은 아래와 같습니다.

with 테이블1(별칭) as ( subquery ), 테이블2(별칭) as ( subquery )

select * from 테이블1
join 테이블2 on 테이블1.필드명 = 테이블2.필드명;

이렇게 서브쿼리로 임시 생성한 테이블1과 테이블2를 join해서 사용하는 등 다양하게 활용할 수 있고 가독성도 높아집니다.

with 사용 시 주의사항

with 사용 시에는 주의사항이 있습니다. 실제 쿼리에서 테이블1, 테이블2와 같은 임시 생성된 테이블도 조회할 수 있도록 with ~  ; 까지 전체 실행을 해줘야 정상적으로 동작합니다.

 

이번 글에서는 쿼리 내 또다른 쿼리를 사용할 수 있는 Subquery와 서브쿼리 사용 시 쿼리의 가독성을 높여줄 수 있는 With에 대해 알아봤습니다.

 

SQL에는 보다 더 다양한 문법이 있지만 select부터 with까지의 문법만 알고 있어도 대부분의 데이터 조회에는 큰 무리가 없을 것입니다.

 

문법을 외우는 것보다 실제로 쿼리를 작성하면서 연습하는 것이 실력향상에 도움이 되기 때문에 실제 데이터를 많이 다뤄보고 동일한 데이터도 다양한 쿼리 형태로 조회하는 것이 가능하기 때문에 가장 효율적인 쿼리는 어떻게 구성하면 좋은지 많이 고민하는 것을 권장합니다.

 

감사합니다.
손한량

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기