본문 바로가기

DB

[MySQL]JOIN 축구로 이해하기

준비

축구선수 Table / 골 Table

-- 축구선수명단
INSERT INTO players(playerName, playerTeam, playerPosition, playerNation, playerAge)
VALUES
('리오넬메시','바르셀로나','공격수','아르헨티나',34),
('후뱅디아스','맨체스터시티','수비수','포르투갈',24),
('호날두','맨유','공격수','포르투갈',37),
('손흥민','토트넘','공격수','대한민국',29),
('토니크로스','레알마드리드','미드필더','독일',32),
('네이마르','파리생제르망','공격수','브라질',30)

-- Goal 데이터
INSERT INTO scores (playerId, playerName, playerTeam, leagueId, gameDay, scoreHalf,scoreTime)
VALUES
(1,'리오넬메시','바르셀로나', 2, '20220101', '전반전', 43),
(3,'호날두','맨유', 1, '20220104', '후반전', 23),
(3,'호날두','맨유', 1, '20220105', '전반전', 1),
(4,'손흥민','토트넘', 1, '20220112', '후반전', 19),
(4,'손흥민','토트넘', 1, '20220118', '전반전', 17),
(1,'리오넬메시','바르셀로나', 2, '20220201', '후반전', 17),
(1,'리오넬메시','바르셀로나', 2, '20220207','전반전', 33),
(1,'리오넬메시','바르셀로나', 2, '20220210', '후반전', 45),
(3,'호날두','맨유', 1, '20220218','후반전', 23),
(7,'수아레즈','아틀레티고마드리드', 2, '20220220', '후반전',35),
(7,'수아레즈','아틀레티고마드리드', 2,'20220223', '전반전',15),
(9,'살라','리버풀',1,'20220228', '후반전',19),
(6,'네이마르','파리생제르망',4,'20220301', '전반전',14),
(6,'네이마르','파리생제르망',4,'20220301', '전반전',42),
(8,'홀란드','도르트문트',3, '20220302', '전반전',18),
(8,'홀란드','도르트문트',3, '20220303', '전반전',9)

 

INNER JOIN (JOIN)

SELECT P.playerId, P.playerName, P.playerPosition, S.gameDay, S.scoreHalf, S.scoreTime 
FROM players P INNER JOIN scores S on P.playerId = S.playerId

scores 테이블에 수아레즈, 살라, 네이마르가 넣은 데이터도 있지만 players테이블에는 그 선수가 없다.

INNER JOIN의 특성이 ON의 조건인 playerId가 두 테이블에 모두 존재하는 것만 가져오는 것이다,

players 테이블에는 수아레즈,살라, 홀란드 선수가 없기때문에  score테이블에는 수아레즈,살라,홀란드의 골이 있음에도 불구하고 데이터 조회가 되지 않는다. 

또한 역으로 player테이블에도 후뱅디아스와 토니크로스 선수가 있음에도 불구하고 score테이블에는 두 선수가 기록한 골이 없기때문에 후뱅디아스와 토니크로스의 데이터 역시 조회되지 않는다.

집합

 

LEFT OUTER JOIN ( LEFT JOIN )

LEFT JOIN은 왼쪽 테이블을 기준으로 오른쪽테이블의 데이터를 결합시키는 것이다.

SELECT P.playerId, P.playerName, P.playerPosition, S.gameDay, S.scoreHalf, S.scoreTime 
FROM players P LEFT JOIN scores S 
ON P.playerId = S.playerId

선수명단(players)을 기준으로 해서 JOIN을 걸었을 때(LEFT JOIN), 즉 선수명단에 해당하는 골의 기록을 모두 가져오고, 해당 선수의 골데이터가 없더라도 선수데이터는 가져오기 때문에 위 후뱅디아스와 토니크로스의 데이터도 조회가 된다.

골이 없다면 선수의 골 데이터는 NULL로 되는 것이다.