서브쿼리는 하나의 SQL문에 포함되어있는 또 다른 SQL문이다.
서브쿼리는 여러 방법으로 사용될 수 있는데 사용하기는 쉽고 간편하지만 속도가 느리며 SQL문이 좀 복잡해질 수 있다.
서브쿼리를 사용할 수 있는 경우는 거의 조인으로 대체 가능하기 때문에 서브쿼리만 이용할 수 있는 경우가 아니라면 조인을 사용하는 것이 빠르고 좋다.
알고리즘 문제를 풀다가 서브쿼리를 사용할 수 있는 문제를 보게 되었다.
PLACES 테이블은 공간 임대 서비스에 등록된 공간의 정보를 담은 테이블입니다. PLACES 테이블의 구조는 다음과 같으며 ID, NAME, HOST_ID는 각각 공간의 아이디, 이름, 공간을 소유한 유저의 아이디를 나타냅니다. ID는 기본키입니다.
이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요.
SELECT * // 공간의 모든 정보가 나와야 함.
FROM PLACES
WHERE HOST_ID IN
(SELECT HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(*) >= 2)
ORDER BY ID;
위의 문제에서 서브쿼리를 사용하지 않고 그냥 group by로 HOST_ID를 묶어버리면 헤비 유저가 등록한 모든 공간을 조회할 수 없고 여러개의 공간 중 하나의 공간밖에 볼 수 없다.
그래서 두 개 이상 등록한 헤비 유저의 HOST_ID를 조회하는 서브쿼리를 만들어 주고 조회한 HOST_ID와 같은 유저의 모든 정보를 조회할 수 있게 메인 쿼리를 작성해주면 문제를 해결할 수 있다.