코딩테스트/SQL 코드카타
MySQL 해커랭크 | Ollivander's Inventory (ON과 WHERE 조건절의 차이)
ANNASENA
2024. 8. 26. 08:00
728x90
문제
https://www.hackerrank.com/challenges/harry-potter-and-wands/problem?isFullScreen=true
Ollivander's Inventory | HackerRank
Help pick out Ron's new wand.
www.hackerrank.com
- Hermione decides the best way to choose is by determining
- the minimum number of gold galleons needed to buy
- each non-evil wand of high power and age.
- If the value of is_evil is 0, it means that the wand is not evil.
- Write a query to print the id, age, coins_needed, and power of the wands that Ron's interested in.
- sorted in order of descending power.
- If more than one wand has same power, sort the result in order of descending age.
- The mapping between code and age is one-one, meaning that if there are two pairs, (code1, age1) and (code2, age2), then code1 ≠ code2 and age1 ≠ age2
# 문제 조건 정리
- 돈은 최소로
- 악의는 없어야 함
- 높은 파워와 연식
- 파워 내림차순, 연식 내림차순
- 지팡이 코드와 연식은 1:1 페어 관계
- 연식이 같고, 파워가 같으면 돈이 최소인 행만 추출
테이블
Wands 테이블 | Wands_Property 테이블 |
![]() |
![]() |
풀이과정
# 악의가 없는 가장 싼 지팡이들
1 2 3 4 5 | SELECT wp.code, wp.age, w.power, MIN(w.coins_needed) coins_needed FROM Wands w JOIN Wands_Property wp ON w.code = wp.code WHERE wp.is_evil = 0 GROUP BY 1, 2, 3 | cs |
# 정답
- '악의가 없는 가장 싼 지팡이들' 테이블과 나머지 테이블들을 조인
- '악의가 없는 가장 싼 지팡이들' 테이블을 따로 만들어서 조인하는 이유는
가장 싼 지팡이를 찾겠다고 WHERE절에 바로 MIN 집계함수를 사용할 수 없었기 때문 - 조인할 때 사용한 ON조건절을 보면 코드, 파워, 가격이 같은 데이터만 조인을 해서 필요한 데이터만 필터링함
- 필터링된 데이터 안에서 파워 내림차순, 연식 내림차순 정렬
- '악의가 없는 가장 싼 지팡이들' 테이블을 따로 만들어서 조인하는 이유는
1 2 3 4 5 6 7 8 9 | SELECT w.id, mc.age, mc.coins_needed, w.power FROM (SELECT wp.code, wp.age, w.power, MIN(w.coins_needed) coins_needed FROM Wands w JOIN Wands_Property wp ON w.code = wp.code WHERE wp.is_evil = 0 GROUP BY 1, 2, 3) mc JOIN Wands w ON w.code=mc.code AND mc.power = w.power AND mc.coins_needed = w.coins_needed ORDER BY w.power DESC, mc.age DESC | cs |
# 더 알아두기 (ON절과 WHERE절의 차이)
- ON : 조인 전에 조건 필터링
- WHERE : 조인 후에 조건 필터링
- INNER JOIN 시에는 조건을 어디에 적어도 결과물에 차이 없음
- 하지만 그 외의 조인에서는 조건을 ON에 줬는지 WHERE에 줬는지에 따라 결과물에 차이 있음
- ON 조건의 경우 → 조인을 할 때 해당 조건 외 나머지 레코드는 null이 됨
- WHERE 조건의 경우 → 조인을 다 마친 결과물에 WHERE 조건에 해당되는 레코드만 필터링됨
- 위 문제에서는 INNER JOIN을 사용하고 있어서 조건을 ON절에 적든 WHERE절에 적든 결과물에 차이가 없음
- w.code=wp.code AND wp.is_evil = 0 이렇게 조건을 줄 수도 있음
- https://velog.io/@crosstar1228/SQL-join%ED%95%A0%EB%95%8C-on-%EA%B3%BC-where%EC%9D%98-%EC%B0%A8%EC%9D%B4
[SQL] join할때 on 과 where의 차이
on : join 전에 조건을 필터링 where : join 후에 조건을 필터링inner join 하면 둘다 차이 없음outer join 시 on으로 해야 원하는 결과를 얻을 수 있음(outer table에 null값 포함하여 행들이 다 살아있는 상태)on
velog.io
728x90