짜리몽땅 매거진
[SQL] solvesql 코딩테스트 연습1 본문
문제1. 모든 데이터 조회하기
출처 : solvesql 데이터리안 sql캠프 입문반
문제 정보 : 난이도 1 / 정답률 98.61%
https://solvesql.com/problems/select-all/
정답 쿼리
select *
from points
문제 해설
아주아주 기초 of 기초 문제
문제2. 복수 국적 메달 수상한 선수 찾기
출처 : solvesql 연습문제
문제 정보 : 난이도 3 / 정답률 29%
https://solvesql.com/problems/multiple-medalist/
정답 쿼리
select name
from athletes a
join records r on a.id = r.athlete_id
join games g on r.game_id = g.id
where g.year >= 2000 and medal is not null
group by a.id
having count(DISTINCT r.team_id) >= 2
order by name
문제 해설
1. 주요 포인트 1 - inner join 잘해주기
from athletes a
join records r on a.id = r.athlete_id
join games g on r.game_id = g.id
선수 id와 메달 정보, 국가 정보들이 필요하므로 해당 칼럼이 포함된 테이블을 조인해준다.
2. 주요 포인트 2 - where 절
where g.year >= 2000 and medal is not null
2000년도 이후의 정보만 원하고 있고, 메달을 1개 이상 수상한 선수여야 하므로 위와 같은 쿼리를 작성해준다.
여기서 주의할 점은
where count(medal) >= 1
또는
having count(medal) >= 1
처럼 작성하면 안된다. 위와 같은 경우 count 집계 함수를 where절에서 쓸 수 없기 때문에 구문 오류가 발생하고, 아래와 같은 경우 정답 결과와 다른 결과가 나오게 된다.
3. 주요 포인트 3 - group by , having 절
group by a.id
having count(DISTINCT r.team_id) >= 2
선수id로 묶어서 출력해야 하므로 group by를 작성해준다. 여기서 a.name이 아닌 a.id로 작성한 이유는 자칫 선수의 이름이 동일할 수 있기 때문이다.
having count(DISTINCT r.team_id) >= 2 절은 선수의 국적이 2개 이상임을 판별하기 위한 절이다. 수상한 시점이 다른 국가일 때여야 하기 때문에 distinct를 사용한다.
'Data > SQL' 카테고리의 다른 글
[SQL] solvesql 코딩테스트 연습3 (0) | 2024.04.02 |
---|---|
[SQL] solvesql 코딩테스트 연습2 (0) | 2024.03.26 |
[SQL] Leetcode/HackerRank 코딩테스트 연습 1 (0) | 2024.03.04 |
[SQL] 프로그래머스 코딩테스트 연습3 (1) | 2024.02.27 |
[SQL] 프로그래머스 코딩테스트 연습2 (0) | 2024.02.19 |