REST_INFO 테이블에서 음식종류(FOOD_TYPE)별로 즐겨찾기수(FAVORITES)가 가장 많은 식당의 데이터를 추출하고자 한다. 서브쿼리를 이용하여 데이터를 추출하는 방법은 아래와 같다.
SELECT A.FOOD_TYPE, A.REST_ID, A.REST_NAME, A.FAVORITES FROM REST_INFO A INNER JOIN (SELECT FOOD_TYPE, MAX(FAVORITES) FAVORITES FROM REST_INFO GROUP BY FOOD_TYPE) B ON A.FOOD_TYPE = B.FOOD_TYPE AND A.FAVORITES = B.FAVORITES ORDER BY FOOD_TYPE DESC;
위 방법은 JOIN문을 이용하기 때문에 alias를 사용하는 등 다소 구문이 복잡해지는 단점이 있다. 만약 조건을 더 많이 걸게 된다면 코드는 더욱 복잡해질 것이다.
이때, 아래와 같이 WHERE ~ IN절과 서브쿼리를 이용하면 코드를 줄이면서 동일한 결과를 도출할 수 있다.
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES FROM REST_INFO WHERE (FOOD_TYPE, FAVORITES) IN (SELECT FOOD_TYPE, MAX(FAVORITES) FROM REST_INFO GROUP BY FOOD_TYPE) ORDER BY FOOD_TYPE DESC;
위 코드와 아래 코드의 차이점은, 위 코드는 서브쿼리가 두 테이블을 JOIN하는 데 사용된 반면, 아래 코드는 서브쿼리가 원본 테이블에 직접 조건을 걸 때 사용되었다는 것이다.