-
MySQL) Top CompetitorsSQL 2020. 6. 3. 09:52반응형
Top Competitors
최근 여러 시험을 보면서, SQL이 잘 기억나지 않아 연습문제를 풀고 있다.
원래는 프로그래머스 고득점Kit만 풀고 끝내려고 했으나, 시험 난이도가 프로그래머스에 있는 문제보다 높은 수준의 문제들이 나왔어서 새롭게 sql 사이트를 찾았다.
sqlzoo라는 곳도 있었고, 지금 풀고있는 곳은 HackerRank라는 곳이다.
아무튼 이 문제는 4개의 테이블에 대해 조인문과 Group by, Having, Order by, Count를 사용하는 종합 문제다.
특정 hacker가 참여한 대회에서 만점받은 이력이 2번 이상일 경우 테이블에 표시하고, 내림차 순으로 나타내주어야 한다. 그리고, 이런 참여자가 2명 이상이면, hacker id에 따라 오름차순으로 정렬해줘야 한다.
join을 직접 명시한 sql query를 작성하는게 어색해서 시간이 조금 걸렸다.
여러 프로젝트를 진행하면서 sql query를 익혔었는데, 그 때는 다중 Join을 최대한 피해서 DB를 설계하고 최대 이중 Join까지만 되게끔 했어서, Where ~ in ~ 쿼리를 선호했었다.. (직관적으로 이해하기 편해서)
아무튼 문제를 다시 풀면서 join , left join, right join에 대해서 사용법을 익혀나가고 있다.
join은 inner join의 함축 표현, left, right join은 outer join의 함축 표현이다.
inner join은 공통 부분을 기준 테이블에 붙인다.
left join은 기준 테이블에 기준 키를 기준으로 조인 테이블을 붙인다. (왼쪽을 기준으로 붙인다는 표현으로 씀)
right join은 조인 테이블에 기준 키를 기준으로 기준 테이블을 붙인다. (오른쪽을 기준으로 붙인다고 씀)
위의 세 가지가 문제를 풀면서 느낀 join문이다.
HAVING은 GROUP BY의 WHERE절 이라고 생각하면 편할 것 같다. (물론 엄밀히 다름)
GROUP BY는 JOIN으로 붙이는 경우에, SELECT에 표현되는 column을 다 묶어줘야 하는 것 같았다.
SELECT H.* FROM HACKERS AS H LEFT JOIN SUBMISSIONS AS S ON H.hacker_id = S.hacker_id JOIN CHALLENGES AS C ON S.challenge_id = C.challenge_id WHERE S.SCORE = (SELECT D.SCORE FROM DIFFICULTY AS D WHERE C.difficulty_level = D.difficulty_level) GROUP BY H.hacker_id, H.name HAVING COUNT(*) >1 ORDER BY COUNT(*) DESC, H.hacker_id ASC
반응형'SQL' 카테고리의 다른 글
MySQL 권한 설정 (0) 2021.04.29 프로그래머스) [SQL 고득점 KIT, JOIN] 없어진 기록 찾기, 있었는데요 없었습니다, 오랜 기간 보호한 동물(1), 보호소에서 중성화한 동물 (0) 2020.06.04 프로그래머스) [SQL 고득점 KIT] 입양 시각 구하기, 중성화여부, 오랜기간 보호한 동물(2), DATETIME에서 DATE로 변환, NULL 처리하기 (0) 2020.06.04 MySQL) Challenges (0) 2020.06.04 MySQL) Ollivander's Inventory (0) 2020.06.03