STUDY/SQL_HACKERRANK

[hackerrank][SQL][Intermediate]#2

BOTTLE6 2021. 10. 18. 21:28

↑https://www.hackerrank.com/domains/sql?filters%5Bskills%5D%5B%5D=SQL%20%28Intermediate%29 

 

Solve SQL Code Challenges

A special-purpose language designed for managing data held in a relational database.

www.hackerrank.com

☆The Report

select if(g.Grade >=8, s.Name, NULL), g.Grade, s.Marks 

from Students s
    left join Grades g 
        on s.Marks between g.Min_Mark and g.Max_Mark

order by g.Grade desc, s.Name

▶ join의 on조건은 등호가 아니더라도 사용이 가능 > on s.Marks between g.Min_Mark and g.Max_Mark

 

/* another solution */
SELECT IF(GRADE < 8, NULL, NAME), GRADE, MARKS
FROM STUDENTS JOIN GRADES
WHERE MARKS BETWEEN MIN_MARK AND MAX_MARK
ORDER BY GRADE DESC, NAME

▶ ON 조건 없이 JOIN (=CROSS JOIN)으로 연결시켜 놓은 데이터 들 중 WHERE 조건으로 조건 설정해서 조회도 가능

 

☆Top Competitors

select H.hacker_id, H.name

/* C.hacker_id isn't same with H.hacker_id */
from Submissions S
    inner join Hackers H on H.hacker_id = S.hacker_id
    inner join Challenges C on C.Challenge_id = S.challenge_id
    inner join DIfficulty D on C.difficulty_level = D.difficulty_level

where D.score = S.score 

group by H.hacker_id, H.name
having count(H.hacker_id) >1

order by count(H.hacker_id) desc, H.hacker_id asc

▶ 연속 join , where와 having 동시 사용

 

☆Ollivander's Inventory

SELECT W.id, WP.age, W.coins_needed, W.power 
FROM Wands W LEFT JOIN Wands_property WP 
    ON W.code = WP.code    
where WP.is_evil=0
AND W.coins_needed = (SELECT min(W2.coins_needed)
                      FROM Wands W2 
                       LEFT JOIN Wands_property WP2
                         ON W2.code = WP2.code
                       WHERE WP2.is_evil=0
                         AND WP.age = WP2.age
                         AND W.power = W2.power)
order by power desc, age desc

▶ 서브쿼리에서 메인쿼리 변수와 조건을 설정 > WP.age = WP2.age

 

☆☆Challenges

SELECT H.hacker_id, H.name, count(C.challenge_id) challenges_created

FROM Hackers H 
    LEFT JOIN Challenges C 
    ON H.hacker_id = C.hacker_id

GROUP BY H.hacker_id, H.name
HAVING 
/* condition 1 : max */
        challenges_created =
        (
        select max(sub1.CNT) 
        from (select count(*) CNT
              from Challenges C
              group by C.hacker_id) sub1
        )
     or 
/* condition 2 : counts=1 */
        challenges_created in 
        (
        select sub2.CNT
        from (select C.hacker_id, count(*) CNT 
              from Challenges C
              group by C.hacker_id) sub2    
        group by sub2.CNT
        having count(*) = 1
        )
ORDER BY challenges_created DESC, H.hacker_id

▶ 서브쿼리의 alias를 잘 설정해주기 ex ) sub1.CNT, sub2.CNT

▶ 조건에 맞는 절 잘 찾기