가장 친한 친구들이 자신보다 더 많은 월급을 제안 받은 학생들의 이름을 출력하시오. (단, 이름은 친한 친구들의 월급 순서로 오름차순 정렬하고, 두 학생 중 어떤 학생도 같은 월급을 제안 받지 않음)
with my_salary as(
select s.id, s.name, p.salary
from students s, packages p
where s.id = p.id),
friends_salary as(
select f.id, f.friend_id, p.salary
from friends f, packages p
where f.friend_id = p.id
)
select name
from my_salary s, friends_salary f
where s.id = f.id and s.salary < f.salary
order by f.salary
CTE를 사용해 나의 정보 테이블을 하나 만들고, 친구의 정보 테이블을 하나 만들어 2개를 결합했다. 데이터가 적으면 이렇게 해결해도 되지만, 실무에서 데이터 많은 경우 이런 쿼리는 상당히 비효율적이다. 시간이 오래걸리고, 서버에 과부하를 주기 때문이다. 따라서 다른 사람들이 어떤 방법으로 문제를 풀었는지 찾아보고, 직접 실행해보았다.
select s.name
from students s, friends f, packages p
where s.id = f.id and s.id = p.id and
p.salary < (select p2.salary from packages p2 where p2.id = f.friend_id)
order by (select p2.salary from packages p2 where p2.id = f.friend_id)
이 방식은 CTE와 달리, 서브쿼리를 사용해 조건을 명시했다. 결과가 동일하더라도, 아래의 방식을 사용하면 훨씬 효율적으로 쿼리를 구성하고 보다 빨리 데이터를 추출할 수 있다.
서브쿼리(Subquery) : 서브쿼리는 쿼리 내부에 포함된 또 다른 쿼리이다. 메인 쿼리의 where이나 from 절에서 데이터를 필터링하거나 조작하는 데 사용할 수 있다. 2번째 예시의 경우도 where절과 order by에 subquery를 사용했다고 해석할 수 있다. 서브쿼리는 메인 쿼리가 실행되기 전에 먼저 실행되며, 그 결과는 메인 쿼리에 사용된다. 단일 행 또는 다중 행 결과를 반환하기 때문에, 상황에 맞게 활용하면된다.
CTE(Common Table Expressions) : 복잡한 쿼리를 단순하게 만들기 위한 임시 테이블로 서브쿼리를 사용하는 것과 비슷하지만, CTE는 쿼리 내에서 여러 번 재사용할 수 있다는 점에서 차이가 있다. 또한, CTE는 가독성을 높이고, 재귀 쿼리(Recursive)를 사용할 수도 있다.
'코딩 테스트 > SQL' 카테고리의 다른 글
| [MYSQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2024.11.04 |
|---|---|
| [MySQL] 프로그래머스 - 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 (0) | 2024.06.25 |
| [MySQL] HackerRank - Weather Observation Station 20 (2) | 2024.01.16 |
| [MySQL] HackerRank - The PADS (0) | 2024.01.16 |
| [MySQL] HackerRank - The Report (2) | 2024.01.14 |