본문 바로가기

코딩공부

[HackerRank] 문제풀이 - MySQL JOIN

2020-04-17

주말을 맞이해 SQL 문제를 풀고 있다.

HackerRank 문제를 풀던 중 헷갈리던 문제가 있어 기록한다.

 

 


문제

HackerRank - SQL - Basic Join - The Report

 

 

HackerRank

 

 

해결

출력하려는 열은 Name, Grade, Marks 3개이다.

이 정보들은 Students, Grades 2개의 테이블에 나뉘어 있어, JOIN을 통해 두 테이블을 합쳐야 한다.

여기서 조금 헷갈렸는데 지금까지 배웠던 JOIN과 형태가 달라서였다.

 

 

1) INNER JOIN, OUTER JOIN (LEFT, RIGHT), FULL JOIN이었다.

   그런데 여기서는 아무것도 붙지 않고 JOIN만 한다.

 

 

2)  JOIN을 할 때 ON을 통해 공통 열을 기재해야 한다고 배웠다.

    그러나 Students, Grades 테이블들은 공통 열이 있지 않다.

    대신 Grades는 Students Marks의 범위를 지정해준다.

    (Ex. Grade 1 = 0 < Student's Marks < 9)

 

 

이런 관계일 경우, 어떻게 JOIN을 해야 할까?

아래는 정답이라 할 수 있는 코드이다.

 

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

 

 

1. JOIN

FROM STUDENTS JOIN GRADES

아무것도 없이 JOIN만 할 경우, INNER JOIN 뜻한다.

(INNER JOIN은 'INNER' 생략 가능)

 

2. WHERE

INNER JOIN은 두 테이블의 교집합을 출력하기 때문에

ON이 생략되어도 WHERE로 범위를 지정해주면 코드가 돌아가는 것 같다. (추측...)

 

WHERE MARKS BETWEEN MIN_MARK AND MAX_MARK

WHERE 절을 통해 Student's Marks의 범위를 지정해준다. 

이를 통해 SELECT절에서 범위별 Grade가 매칭 되어 출력된다.

SELECT NAME, GRADE, MARKS

 

3. IF

GRADE 점수에 따라 NAME, ORDER를 바꿔야 하는 조건이 있었다.

조건절은 CASE WHEN, IF 등 여러 개가 있으나, 여기서는 IF절 사용이 깔끔하다.

 

1) NAME : IF( GRADE < 8, NULL, NAME)

2) ORDER : IF( GRADE < 8, MARKS, NAME)

 

 


 

 

이번 문제는 정답을 보고 나니 생각보다 어렵지 않았다.

다만, JOIN을 특정 열이 아니라, 범위로 지정하는 것이 처음이라

JOIN 시 조건을 어떻게 처리해야 할지 난감했다. 

이번에 배웠으니 다음번 문제에서는 이를 기반으로 해결할 수 있겠지.