[LeetCode]Placements

SQL-쿼리테스트

목록 보기
18/21

문제출처 : https://www.hackerrank.com/challenges/placements/problem?isFullScreen=true


Q)

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.

A)

세 테이블을 기준으로 Best friend 가 자신보다 더 높은 연봉을 받고 있는 학생의 이름을 출력하는 문제이다.

나는 그래서 두 개의 서브쿼리를 생성해서 문제를 해결해보고자 하였다.

다음 조건의 테이블 2개를 생성하였다.

  • 학생 별 연봉 테이블
  • BestFriend 별 연봉 테이블

그래서 두 테이블을 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 의 경우 일시적으로 결과 세트를 정의하고, 이를 나중에 쿼리에서 참조할 수 있게 하는 방법으로 주로 가독성을 높이고, 복잡한 쿼리를 단순화 하는데 사용한다.

서브쿼리의 경우 하나의 쿼리 안에 포함된 또 다른 쿼리를 의미한다. 주로 외부 쿼리의 필터링 조건을 걸 때 주로 사용한다

그렇다면 둘의 차이점은 어떤 점이 있을까 ?

  1. 가독성
    CTE의 경우 복잡한 쿼리를 여러 부분으로 나눠 가독성이 높다 반면 서브쿼리의 경우 쿼리 안에 쿼리의 구조로 중첩되어 작성할수록 가독성이 떨어질 수 있다.

  2. 재사용성
    CTE의 경우 동일한 쿼리 내에서, 동일한 세션 내에서 여러번 재사용 될 수 있지만, 서브쿼리는 매번 실행해서 사용하여야 한다는 단점이 있다.

  3. 성능
    CTE와 서브쿼리는 데이터베이스 시스템과 쿼리의 복잡도에 따라 다르다. 하지만 일반적으로 CTE는 재귀적인 쿼리를 작성할 때 유용하다.

  • 재귀적 쿼리의 경우 자기 자신을 참조하여 반복적으로 데이터를 처리하는 쿼리를 의미한다 재귀적 쿼리의 경우 트리 구조, 계층적 데이터를 처리할 때 유용한 방법이다.
    ( 나중에 재귀적 쿼리의 경우도 한번 알아보는 것이 좋을 것 같다. )

하루에 한문제씩 쿼리 문제를 풀고 있는데 오늘은 비교적 쉬운 문제였지만, CTE와 서브쿼리에 대하여 다시 한번 생각해볼 수 있는 좋은 기회였다고 생각이 들었다.

profile
살아남기 위해 끄적이는 블로그 : 생존법

0개의 댓글