작성
·
2K
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절에 각각 넣어봤을 때 다른 값이 나왔었습니다.
제가 참고한 문제들이 설명하실 때 도움이 되실까해서 참조로 남깁니다.)
감사합니다.
답변 1
1
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
Orders 테이블에 o.id is null인 데이터는 하나의 row도 존재하지 않는데, 왼쪽 테이블을 기준으로 하는 LEFT JOIN이기 때문에 왼쪽 데이터는 모두 보존하면서 오른쪽 컬럼 값은 null로 들어가는 방식으로 조인이 된 것입니다.
여기서 INNER JOIN으로만 바꾸면, 양 쪽에서 동시에 조건을 만족하는 값을 찾지 못해 그 어떤 데이터도 추출되지 않습니다.
o.id is null 이라는 조건만 빼고 LEFT JOIN을 하면 c.id와 o.customerid가 일치해 붙을 수 있는 것은 붙고, 오른쪽 테이블인 orders에 존재하지 않는 값만 null로 채워지면서 아래와 같은 테이블이 만들어지게 됩니다.
WHERE o.id is null 조건은 이렇게 이미 만들어진 테이블에다가 필터링을 하는 것이므로 o.id 컬럼 값이 null인 2번째, 4번째 행만 추출하도록 명령하는 것입니다.