개발은 처음이라 개발새발
JOIN구문에 들어가는 BETWEEN [해커랭크] 본문
https://www.hackerrank.com/challenges/the-report/problem?h_r=internal-search
이번에는 join 구문에서 between절을 활용하는 퀴즈를 풀어보려고 합니다. 흔히 join 구문에서 두 테이블을 매칭 시킬 때 on을 적고 그안에 각각의 테이블에서 매칭 시킬 수 있는 컬럼을 "A.컬럼 = B.컬럼 " 이런식으로 적는게 기본인데요. 하지만 모든 상황과 테이블들이 이 같은 구문으로 해결될순 없겠죠. 그렇기에 하나의 구문에서 어떻게 여러 방법으로 쿼리를 적을 수 있는지 배워나가는 것도 중요합니다. 특히, join은 참 많이 사용하는 구문이기에 알아두면 유용할거라 생각합니다.
문제를 살펴보면 grades, sutdents라는 테이블이 있습니다. 그리고 두 테이블을 살펴보면 1차적으로 매칭 시킬 수 있는 컬럼이 존재하지 않습니다. 그리고 여러 조건이 있는데요. 조건은 아래와 같습니다.
**조건**
1. grade가 같으면 이름 알파벳 오름차순으로 정렬
2. grade가 8보다 낮으면 이름은 NULL처리
3. grader가 8보다 낮은 marks 들은 marks 오름차순으로 정렬
위 조건들 중 2번을 보면 grade가 8보다 낮을 경우라는 조건이 붙기 때문에 이름은 CASE...WHEN...THEN 구문을 활용해야 합니다. 그렇다면 위 조건들을 적용한 쿼리를 확인해보겠습니다.
SELECT
(CASE WHEN g.grade < 8 THEN NULL ELSE a.name END) AS name
, g.grade
, a.marks
FROM students AS a
JOIN grades AS g ON a.marks BETWEEN g.min_mark AND g.max_mark
ORDER BY g.grade DESC, name, a.marks
_____________________________________________________________________
output:
Britney 10 95
Heraldo 10 94
Julia 10 96
Kristeen 10 100
Stuart 10 99
Amina 9 89
Christene 9 88
Salma 9 81
Samantha 9 87
Scarlet 9 80
Vivek 9 84
Aamina 8 77
Belvet 8 78
Paige 8 74
Priya 8 76
Priyanka 8 77
NULL 7 64
NULL 7 66
NULL 6 55
NULL 4 34
NULL 3 24
쿼리를 보게 되면 students테이블에 있는 marks와 grade 테이블에 있는 min_mark, max_mark를 Between 구문을 가지고 매칭을 시켰습니다. 이름 조건 역시 case 구문을 활용해 grade가 8미만인 name은 null로 처리했습니다.
'mysql' 카테고리의 다른 글
MySQL 윈도우함수 간단 설명 (0) | 2023.06.26 |
---|---|
JOIN을 통해 연속된 숫자 뽑아보기 [LeetCode] (0) | 2023.06.25 |
MySQL WITH문 활용[해커랭크] (0) | 2023.06.11 |
JOIN 서브쿼리 퀴즈[LeetCode] (0) | 2023.06.07 |
Top Earners 서브쿼리 퀴즈 [해커랭크] (1) | 2023.06.06 |