inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

INNER JOIN 과 LEFT JOIN의 ON 조건 차이점 질문

2537

허우기

작성한 질문수 1

1

안녕하세요. 1년차 주니어 웹개발자 입니다.

실무하면서 SQL이 부족한듯해서 중급, 고급 강의 듣고 있습니다.

중급 강의 중 JOIN 듣고 구글링 하면서 궁금한 점이 생겨서 질문 드립니다..

 

INNER JOIN의 경우 ON으로 조건을 거는 것과, WHERE 절로 조건을 거는 것과 결과는 차이가 없다고 이해됩니다. 그 이유는.. ON 절에 AND로 여러 조건을 걸어도 교집합 형태로 조건이 걸렸기 때문입니다.

 

그런데 LEFT JOIN의 경우 ON절에 조건을 거는 것과 WHERE 절에 조건 거는 것에 차이가 있었습니다.

그래서 구글링 해보니 LEFT조인의 ON절에서 AND로 조건을 여러개 걸면 합집합 조건 처럼 AND로 연결된 조건이 모두 나온다고 이해했습니다.

 

왜 INNER JOIN과 LEFT JOIN의 각 ON절에서 이런 차이가 발생하는지 궁금합니다 ㅠㅠ

 

( INNER JOIN의 경우 LeetCode 181번 문제에서 'Employee.salary > Manager.salary' 조건을 on절과 where 절에 넣었을 때 같은 결과가 나왔고,

LEFT JOIN의 경우 LeetCode 183번 문제에서 'o.id IS NULL' 이란 조건을 where절, on절에 각각 넣어봤을 때 다른 값이 나왔었습니다.

제가 참고한 문제들이 설명하실 때 도움이 되실까해서 참조로 남깁니다.)

 

감사합니다.

 

sql

답변 1

1

지식공유자 J

JOIN의 ON 절은 조인 전의 각 테이블에 있는 데이터에 조건을 거는 것이고,
WHERE 절은 조인 후의 데이터에 조건을 거는 것이라고 생각하시면 이해하기 쉬울 것 같아요.

INNER JOIN은 양 테이블에서 조건을 만족해 교집합에 들어가는 경우만 조인이 되므로, 필터링을 먼저 하든 조인 후에 하든 같은 값이 나옵니다.

예시로 주신 Employee.salary > Manager.salary 조건을 만족하려면 Employee 테이블의 salary 컬럼과 Manager의 salary 컬럼 값이 서로 비교가 가능한 값, 즉 null이 아닌 데이터여야 하고요. 그 중에서도 서로 붙였을 때 Employee 쪽이 큰 경우만 추출이 됩니다. INNER JOIN이기 때문에요.

Leetcode 183번 문제에서 아래와 같은 LEFT JOIN 쿼리를 실행하면 output은 이렇게 나옵니다.

SELECT c.id, c.name, o.id, o.customerid 
FROM customers c     
    LEFT JOIN orders o ON c.id = o.customerid AND o.id is null

image
Orders 테이블에 o.id is null인 데이터는 하나의 row도 존재하지 않는데, 왼쪽 테이블을 기준으로 하는 LEFT JOIN이기 때문에 왼쪽 데이터는 모두 보존하면서 오른쪽 컬럼 값은 null로 들어가는 방식으로 조인이 된 것입니다.
여기서 INNER JOIN으로만 바꾸면, 양 쪽에서 동시에 조건을 만족하는 값을 찾지 못해 그 어떤 데이터도 추출되지 않습니다.

o.id is null 이라는 조건만 빼고 LEFT JOIN을 하면 c.id와 o.customerid가 일치해 붙을 수 있는 것은 붙고, 오른쪽 테이블인 orders에 존재하지 않는 값만 null로 채워지면서 아래와 같은 테이블이 만들어지게 됩니다.

image
WHERE o.id is null 조건은 이렇게 이미 만들어진 테이블에다가 필터링을 하는 것이므로 o.id 컬럼 값이 null인 2번째, 4번째 행만 추출하도록 명령하는 것입니다. 

리트코드 1280. Students and Examinations

0

83

3

16강 LEFT JOIN 리트코드 (183. Customers Who Never Order) 관련 질문

0

98

2

African Cities 문제관련 질문

0

62

1

SQL 코딩테스트 질문

0

226

1

HACKER RANK에서 문제찾기

0

105

2

강의 자료 다운로드

0

96

2

Asian population 문제가 없어요

0

85

2

INNER JOIN 에서 A.키 쓸때 빨간 색 나오고 'dause'

0

73

2

별칭 관련해서 질문 있습니다.

0

86

2

rising temperature 문제 질문

0

100

2

해커랭크 TOP EARNERS 문제 질문

0

108

1

ON 뒤에 질문

0

103

2

INNER JOIN 질문. 강의와 결과값이 다릅니다.

0

206

3

END, 뒤에 * 붙이면 에러가 뜹니다

1

210

2

CustomerID가 중복되서 나타나요

0

239

3

별칭이 전체 테이블을 못 불러와요.

0

148

2

CASE WHEN 쿼리 오류 문의

1

331

3

CASE문제풀이 질문

0

129

1

Customers Who Never Order 풀다가 Alias관련 질문사항

0

140

1

Average Population 질문

0

139

1

Revising Aggregations - The Count Function 질문

0

108

1

Average Population of Each Continent 에대해서 질문

0

195

3

w3schools 에서 쿼리 작성 질문

0

161

1

INNER JOIN 할 때 NULL 값이 안보일 수도 있나요?

0

331

1