«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Recent Posts
Today
Total
관리 메뉴

짜리몽땅 매거진

[SQL] solvesql 코딩테스트 연습1 본문

Data/SQL

[SQL] solvesql 코딩테스트 연습1

쿡국 2024. 3. 19. 15:13

문제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를 사용한다.