인프런 커뮤니티 질문&답변

정수민님의 프로필 이미지
정수민

작성한 질문수

[백문이불여일타] 데이터 분석을 위한 중급 SQL

INNER JOIN 해커랭크 문제풀이

왜 Inner join인지 모르겠습니다.

작성

·

1.2K

1

안녕하세요, 항상 수업 잘 듣고 있습니다!

Inner join과 left join 의 차이가 '데이터 비어있을 때 NaN이 뜨는데, 이걸 제외해서는 안되는 경우 left join 을 쓴다' 맞을까요?

맞다면, 일단 웬만한 경우에는 left join을 쓰고 NaN을 처리하는 것이 안전해보이는데 풀어주신 세 문제 전부 Inner join을 쓰신 이유가 있나요?

일단 Left join으로 문제 풀었을 때 오답이 나왔는데, 왜 오답인지 와닿지가 않습니다.

+

제가 짜본 코드가 강의에서 보여주신 코드와 딱 한 지점이 다르거든요. INNER JOIN 을 LEFT JOIN 으로 써서, 

NULL 266866

요 NULL 대륙이 추가되어 있는데, 이거는 필요가 없는 데이터인가요? T-T 

어떤 NULL은 유의미하고, 어떤 NULL은 일단 무시해도 되는지 그 기준을 잡기가 어려운데, 조언 받고 싶습니다!

답변 2

1

DaHab님의 프로필 이미지
DaHab
지식공유자

안녕하세요~ 수민님ㅎㅎ

join 관련해서 질문해주셨는데요~ 질문에 대한 답을 하기 전에  employee와 department 테이블을 예시로 들면서 알려드릴게요~

두 테이블의 공통 된 컬럼은 part 컬럼인 것을 보실 수 있어요~

employee

num name part
1 tony 영업
2 hun 홍보
3 jin 교육
4 young null
5 su null

department

part floor
영업 7
홍보 5
교육 9

이 두 테이블로 inner join을 한다면, 각 테이블에 공통으로 들어간 값을 가져옵니다.

보통 inner join을 교집합이라고 이해하시면 됩니다~

SELECT *
        FROM employee 
INNER JOIN depratment ON employee.prat = department.part;

inner join 결과는 공통 된 컬럼이 있는 테이블만 출력 됩니다.

num name part part floor
1 tony 영업 영업 7
2 hun 홍보 홍보 5
3 jin 교육 교육 9

out join은 inner join과 다르게 어떤 테이블을 기준으로 데이블을 출력하느냐에 따라 left join, right join, full outer join으로 분류 됩니다. 

left join왼쪽 테이블을 기준으로 join을 합니다. 조인 조건에 부합하는 데이터가 오른쪽에 있으면 select 하고, 없다면 null 값을 채워넣습니다.

SELECT *
        FROM employee
        LEFT JOIN department ON employee.part = department.part

결과 테이블을 보면 employee 테이블을 기준으로 join 한 것을 알 수 있습니다.  employee.name의 young과 su는 department.part 내용이 없기 때문에 null값이 처리 됐습니다. 

num name part part floor
1 tony 영업 영업 7
2 hun 홍보 홍보 5
3 jin 교육 교육 9
4 young null null null
5 su null null null

right join은 left join과 반대이기 때문에 오른쪽을 기준으로 합쳐집니다.

SELECT *
        FROM employee
        RIHGT JOIN department ON employee.part = department.part

결과 테이블이 department을 기준으로 합쳐진 것을 알 수 있습니다. 

num name part part floor
1 tony 영업 영업 7
2 hun 홍보 홍보 5
3 jin 교육 교육 9

많이 기다리셨을 거 같아요~ 수민님께서 질문해주신 질문에 답을 드리겠습니다~

수민님께서 질문 내용을 한번 정리해봤는데 질문에 대한 내용이 맞지 않을 경우 댓글 달아주세요~ 

<질문>

1. inner join과 left join의 데이터 결과 차이는 NaN인 것 같습니다. NaN이 필요한 때, left join을 사용해도 될까요??

2.  JOIN 문제 풀이 때, inner join을 사용한 이유는 무엇인가요? left join을 쓰면 왜 오답처리 되는지? 

3. 수민님 코드 중 inner join 대신 left join으로 작성해서 NULL 값이 추가되었는데 필요없는 데이터인지? NULL 값의 의미.

4. JOIN 할 때,  테이블의 기준.

1번. 네~  테이블 컬럼과 상황에 따라 다르겠지만, NaN값이 필요하시다면 left/right join을 사용하시면 됩니다~

하지만, inner join과 left join의 데이터 결과 값 차이가 NaN이라고 이해하시면 안돼요ㅠ

inner join에서는 공통 된 값이 나오고, left join은 left 테이블을 기준으로 join 하기 때문에 right 테이블이 NaN값이 나오게 됩니다.  NaN값 뿐 만 아니라 left에 있는 값들도 출력 되기 때문에 결과값은 달라집니다. 

2번. 문제를 잘 읽어보시면, 공통 된 컬럼 값만 가져오도록  제시했습니다. 공통된 값을 가져오기 위해서는 inner join (교집합)을 사용해야합니다. left join을 사용했을 경우, 공통 된 테이블이 나오지 않기 때문입니다. 

3번. null은  아직 정의 되지 않은 값, 미확인 된 값 입니다. 0과 문자 공백이랑 다른 의미이며 값 자체가 존재하지 않다라는 의미를 가지고 있습니다. 

4번. 테이블 예시로 테이블의 기준을 어떻게 잡는지 이해하셨을 것 같아요~ 

하지만 시각적인 자료가 있으면 더 도움이 될 거 같아 링크 첨부했으니 참고해주세요~

https://sql-joins.leopard.in.ua/

https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

정수민님의 프로필 이미지
정수민
질문자

당시 이해하기 급급해서 댓글을 안남겼나보네요. 요즘 다시 복습하고 있는데, 덕분에 아주 깊이 이해할 수 있었습니다. 감사합니다 :) 늦었지만 좋은 하루 보내셔요~

0

정수민님의 프로필 이미지
정수민
질문자

추가 질문입니다. 일단 가르쳐주신 대로 LEFT JOIN 만 쓰려고 하는데, 두 TABLE 중에 무엇이 왼쪽에 와야하는지(즉, 무엇이 기준이 되어야 하는지) 어떻게 판단하면 될까요? 두 테이블의 순서를 바꾸어봤는데 결과가 아예 다르더라구요 ㅠ0ㅠ

정수민님의 프로필 이미지
정수민

작성한 질문수

질문하기