프로그래밍/MySQL

[MySQL] SQL ZOO JOIN Quiz 답 해설

모영이 2021. 3. 12. 15:38

 

JOIN Quiz - SQLZOO

1002 8 June 2012 Stadion Miejski (Wroclaw) RUS CZE

sqlzoo.net

1. JOIN의 사용

JOIN 합칠 테이블 ON (합치는 조건) 이렇게 사용하면 된다.

game 테이블과 goal 테이블을 연결 시킬 수 있다. 

game에는 id 값이 하나씩 들어 있다. 하지만 goal에는 matchid 값이 똑같은게 여러개 들어 있다.

한 게임당 골은 여러개씩 나올 수 있고, 골이 없을 수도 있다. 

JOIN에는 INNER JOIN과 OUTTER JOIN이 있는데 이렇게 그냥 JOIN을 쓰면 INNER JOIN이다.

차이점은 INNER은 교집합, OUTTER은 합집합이다. 골의 데이터 중 matchid값이 없는 것도 있을 것이다.

앞에서 말했듯이 게임에서는 0 VS 0으로 끝나는 게임도 있으니깐.

만약 id 값이 1005인 경기에서 골이 나오지 않았다면, 

INNER JOIN은 그 골 데이터(NULL 값)는 제외한다. 

OUTTER JOIN은 그 골 데이터(NULL 값)를 합친다.

보통은 LEFT JOIN을 사용하는데 이게 OUTER JOIN이다.

 

2. 합친 데이터의 칼럼

JOIN으로 합쳤다면, SELECT문에서 사용할 수 있는건 두 테이블 칼럼의 모든 값이다.

 

3. JOIN의 WHERE절 사용, GROUP BY후 COUNT 사용

그리스를 상대로 골 넣은 데이터를 탐색해야 한다.

홈, 원정이 그리스인 팀을 찾는다. 이건 게임 데이터에 있다.

그리스가 넣은 골이 아니다. 이건 골 데이터에 있다.

이 두개의 조건을 합치면, 그리스를 상대로 넣은 골 데이터와 그 게임 데이터가 된다.

각 팀의 선수마다 카운트를 해주기 위해 GROUP BY를 사용한다.

 

4. JOIN의 사용, DISTINCT 사용 

teamid, mdate 표시인데 1개만 표시한 답 제외시키고

DISTINCT인데 중복 값 표시한거 제외시키면 답이 나온다.

 

5. 3번 문제 + DISTINCT 사용, WHERE절 조건 추가

중복제거와, stadium 비교를 추가했다.

 

6. JOIN의 사용, 복잡한 조건식

천천히 생각해보면 금방 알 수 있다. 이탈리아를 상대로 넣은 골을 제외시켜야 한다. 

팀이 홈팀일때, 원정팀은 이탈리아가 아니다.

팀이 원정팀일때, 홈팀은 이탈리아가 아니다. 

두 조건중 하나만 만족하면 이탈리아를 상대로 넣은 골이 제외된다. 

 

7. JOIN의 사용, HAVING의 사용

HAVING절에서 집계함수를 사용한다.

그룹화를 시킬 조건을 거는 것인데, WHERE절과는 다른 느낌이다. 

WHERE절에서는 집계함수를 서브쿼리로 사용해야 한다.

내가 생각한 팁(아닐 수 있음). 

HAVING절에서는 그룹화된 데이터에 선 접근하는 느낌이다.

그룹화를 하기 전에 미리 그룹화를 시킨 상태에서 조건을 거는 느낌이라고 생각하면 편하다.