DB/일반

[subquery] order by 절에서의 sub query

은서파 2023. 4. 13. 22:00

이번 포스트에서는 order by 절에 사용되는 subquery의 용법에 대해 살펴보자.

 

subquery

 

조회 문장을 사용할 때 subquery는 select, from, where, having, order by 절에 사용될 수 있다. 

일반적인 상황에서의 sub query들은 다 써봤는데 order by 절에서 사용되는 sub query라는게 딱히 잘 사용해보지 않았던 항목이라 정리하고자 한다.

order by 절에서의 subquery

order by 절에는 정렬하기 위한 컬럼이 오는 것이 일반적이다. 그런데 subquery는 값을 반환한다. 

뭔가 아귀가 안맞는것 같은데 subquery로 나온 값들을 기준으로 정렬 한다고 생각하면 되겠다. 이때 주의할 점은 order by 절에서 사용하는 subquery는 반드시 상관관계 subquery여야 한다는 점이다.

order by 절에 사용된 subquery의 예를 살펴보자.(mysql의 sakila database를 이용한다.)

먼저 첫 번째 예는 customer의 length(email)을 가상의 컬럼으로 두고 정렬하는 예이다.

select * 
from customer cm
order by (select length(email) 
          from customer cs 
          where cs.customer_id=cm.customer_id) ;

물론 위의 예는 subquery를 사용하지 않아도 전혀 문제가 없다. 괜히 복잡하게 한번 써본것 정도이다. 

다음 예를 살펴보자. 고객의 정보를 고객이 렌탈한 비디오의 개수를 기준으로 정렬하고자 한다.

select * , (select count(*) 
            from rental r 
            where r.customer_id=cm.customer_id) as rental_cnt 
from customer cm
order by rental_cnt ;

위의 쿼리는 rental_cnt를 select 항목에 두었기 때문에 별 문제 없이 order by 절에서 참조가 가능하다. 하지만 만약 이 컬럼을 조회하지 않는다면? 

참조할 컬럼이 없기 때문에 당연히 정렬이 불가하다. 이런 경우 order by 절에 바로 sub query를 작성할 수 있다.

select * 
from customer cm
order by (select count(*) from rental r where r.customer_id=cm.customer_id) ;

그리고 앞서 밝혔듯이 이때의 subquery는 상관 관계 subquery 여야 한다.