문제출처 : https://www.hackerrank.com/challenges/placements/problem?isFullScreen=true
You are given three tables: Students, Friends and Packages. Students contains two columns: ID and Name. Friends contains two columns: ID and Friend_ID (ID of the ONLY best friend). Packages contains two columns: ID and Salary (offered salary in $ thousands per month).
Write a query to output the names of those students whose best friends got offered a higher salary than them. Names must be ordered by the salary amount offered to the best friends. It is guaranteed that no two students got same salary offer.
세 테이블을 기준으로 Best friend 가 자신보다 더 높은 연봉을 받고 있는 학생의 이름을 출력하는 문제이다.
나는 그래서 두 개의 서브쿼리를 생성해서 문제를 해결해보고자 하였다.
다음 조건의 테이블 2개를 생성하였다.
그래서 두 테이블을 JOIN 하여, 자신(A.ID) 보다 제일 친한 친구(B.FRIEND_ID) 의 연봉이 높은 레코드만 조회하여 문제를 해결하였다.
내가 작성한 쿼리는 다음과 같다.
SELECT A.NAME
FROM
(
SELECT
S.ID,S.NAME,P.SALARY
FROM
STUDENTS S
JOIN
PACKAGES P
ON S.ID = P.ID
) A
JOIN
(
SELECT
F.ID,F.FRIEND_ID,P.SALARY
FROM
FRIENDS F
JOIN
PACKAGES P
ON F.FRIEND_ID = P.ID
) B
ON A.ID = B.ID
WHERE A.SALARY < B.SALARY
ORDER BY B.SALARY ;
이전문제 보다 쉽게 해결해서 그런지.. 다른 답안은 어떤지 궁금하여 찾아보았다.
Discussions 탭을 보니 대부분의 경우 CTE 를 이용해 테이블을 생성해놓고 그 테이블의 결과를 SELECT 를 통한 조회를 해오는 방법으로 내가 풀이한 결과랑 유사하게 해결했다고 느꼈다.
그렇다면 CTE 를 이용한 방법과 나처럼 서브쿼리 여러개를 두고 풀이하는 경우 어떠한 점이 다를까 생각이 들어 간단하게 이에 대해 알아보았다.
우선 CTE 의 경우 이전에도 다뤘던 적이 있지만, 간략하게 정의해보면..
CTE 의 경우 일시적으로 결과 세트를 정의하고, 이를 나중에 쿼리에서 참조할 수 있게 하는 방법으로 주로 가독성을 높이고, 복잡한 쿼리를 단순화 하는데 사용한다.
서브쿼리의 경우 하나의 쿼리 안에 포함된 또 다른 쿼리를 의미한다. 주로 외부 쿼리의 필터링 조건을 걸 때 주로 사용한다
그렇다면 둘의 차이점은 어떤 점이 있을까 ?
가독성
CTE의 경우 복잡한 쿼리를 여러 부분으로 나눠 가독성이 높다 반면 서브쿼리의 경우 쿼리 안에 쿼리의 구조로 중첩되어 작성할수록 가독성이 떨어질 수 있다.
재사용성
CTE의 경우 동일한 쿼리 내에서, 동일한 세션 내에서 여러번 재사용 될 수 있지만, 서브쿼리는 매번 실행해서 사용하여야 한다는 단점이 있다.
성능
CTE와 서브쿼리는 데이터베이스 시스템과 쿼리의 복잡도에 따라 다르다. 하지만 일반적으로 CTE는 재귀적인 쿼리를 작성할 때 유용하다.
하루에 한문제씩 쿼리 문제를 풀고 있는데 오늘은 비교적 쉬운 문제였지만, CTE와 서브쿼리에 대하여 다시 한번 생각해볼 수 있는 좋은 기회였다고 생각이 들었다.