SQL ZOO[MySQL] The JOIN operation

2022. 3. 11. 22:51Site/SQL ZOO

드디어 대망의 join입니다

sql zoo의 남은 마지막 문제들도 모두 join관련 문제들이니 중요한거겠죠...

 

game, goal, eteam 테이블
goal테이블에서 teamid='GER'인 matchid, player 조회
game테이블에서 id='1012'인 id, staudim, team1, team2 조회
game테이블과 goal테이블을 공통된 키값[id, matchid]을 통해 join하여 독일 정보 조회

join 연산방법

-> SELECT <list> FROM <table1> JOIN <table2> ON (table1.key=table2.key)

game테이블과 goal테이블을  공통된키값[id, match]를 통해 team1과 team2에서 Mario로 시작하는 선수 조회
gtime이 10보다 작거나 같은 player, teamid, coach, gtime 조회 [goal테이블과 eteam테이블의 공통된키값(teamid, id)를 통해 조인]
coach가 Fernado Santos인 mdate와 teamname 조회 [goal테이블과 eteam테이블의 공통된키값(teamid, id)를 통해 조인]
stadium이 National Stadium, Warsaw인 선수 조회 [game테이블과 goal테이블의 공통된키값(id, matchid)를 통해 조인]
독일을 상대로 골을 넣은 모든 선수 조회

hint를 보면 중복값을 허용하지않는 DISTINCT와 !=연산자를 사용하라고 나옵니다

팀정보가 있는 game.team1/team2와  goal.teamid에 접근하기 위해 game테이블과 goal테이블의 공통된 키값인 id, matchid을 이용하여 조인을하고  WHERE조건문을 걸어 team1이나 team2에 GER을 입력하여 독일과 상대한 팀을 조회하고 AND 연산자를 추가하여 독일팀이 독일팀과 상대하는 것을 방지하기 위해 !=연산자를 통해 독일팀을 제외시켰습니다

teamname별로 gtime의 총 횟수 조회

teamname 정보가 있는 eteam테이블과 gtime 정보가 있는 goal테이블을 공통된 키값[id, teamid]로 조인시켜 

COUNT함수를 이용하여 gtime의 카운트 조회합니다 (GROUP BY가 없으면 집계함수 조회 불가능)

stadium별로 gtime 총 횟수 조회

stadium 정보가 있는 game테이블과 gtime 정보가 있는 goal테이블을 공통된 키값[id, matchid]로 조인시켜

COUNT함수를 이용하여 gtime의 카운트 조회합니다

POL과 관련된 matchid, mdate, gtime 총 횟수 조회

matchid가 속한 goal테이블과 mdate, gtime이 속한 goal테이블을 공통된 키 값[matchid, id]로 조인시켜준다음

COUNT함수로 gtime의 총 횟수를 나타내고 POL과 관련된 조건을 WHERE절에 OR과 함께 team1/2='POL' 작성한다음

matchid, mdate로 그룹화시켜주었습니다 [2개로 그룹화시켜주지어야지 중복값(x)]

teamid가 독일인 matchid, mdate, gtime 총 횟수 조회

matchid가 속한 goal테이블과 mdate, gtime이 속한 goal테이블을 공통된 키 값[matchid, id]로 조인시켜준다음

독일팀과 관련된 정보만 추출하면 되므로 WHERE절에 teamid='GER'을 통해 조회시켜주었습니다

모든 경기의 team1과 team2의 점수 조회

위 문제는 모든 경기마다의 team1과 team2의 점수를 조회해야 합니다

문제에서는 case 문을 활용하라 나왔는데 막혀가지고 구글링이 필요했습니다

먼저 team1/2의 점수를 알아야 되므르 CASE문을 활용하여 각각의 팀마다 승리하면 1 지면 0을 SUM함수를 통해

총합을 누적하여 작성하는 방법이 있었고

score가 0인경우에는 null값으로 goal테이블에 조인이 안되기 때문에 LEFT OUTER 조인을 사용하였습니다

 

cf)

- CASE 작성 방법

CASE WHEN condition1 THEN value1 
       WHEN condition2 THEN value2  
       ELSE def_value 
  END 

 

JOIN의 종류

- LEFT JOIN [조인기준 왼쪽에 있는거 모두(null값포함)] -> null값만출력 [테이블1번것만]  WHERE절에 IS NULL 작성  

SELECT A FROM <테이블명1> LEFT JOINT<테이블명2> ON <JOIN조건식>

- RIGHT JOIN [조인기준 오른쪽에 있는거 모두(null값포함)] -> null값만출력 [테이블1번것만]  WHERE절에 IS NULL 작성

SELECT A FROM <테이블명1> RIGHT JOINT<테이블명2> ON <JOIN조건식>

- INNER JOIN [교집합]

SELECT A FROM <테이블명1> INNER JOINT<테이블명2> ON <join조건식>

- OUTTER JOIN [합집합]

SELECT A FROM <테이블명1> INNER JOINT<테이블명2> ON <join조건식>

 

여기링크에 자세하게 잘 나와있으니 보시면 좋을 것 같습니다

https://pearlluck.tistory.com/46

 

reference check : https://hs5555.tistory.com/129

'Site > SQL ZOO' 카테고리의 다른 글

SQL ZOO[MySQL]More JOIN operations  (0) 2022.03.15
SQL ZOO[MySQL] JOIN Quiz  (0) 2022.03.11
SQL ZOO[MySQL] SUM and COUNT Quiz  (0) 2022.03.06
SQL ZOO[MySQL] SUM and COUNT  (0) 2022.03.06
SQL ZOO[MySQL] Nested SELECT Quiz  (0) 2022.03.04