배경 : 일하는 프로젝트 내 MariaDB 쿼리 개발중, LEFT JOIN 인데도 불구하고 데이터가 조회되지 않는 현상이 발생했다. 왜그런걸까? 아래 내가 겪은 경험을 적어두고, 검색 및 chatGPT에게 문의 후 답변을 놓아서, 해당 삽질을 재발하지 않도록 노력해보자.
내용
CASE1)
SELECT *
FROM COMPANY A
LEFT JOIN HR_TEAM B
ON A.USER_ID = B.USER_ID
AND B.USE_YN = 'Y'
CASE2)
SELECT *
FROM COMPANY A
LEFT JOIN HR_TEAM B
ON A.USER_ID = B.USER_ID
WHERE B.USE_YN = 'Y'
위에서 나는 CASE2) 로 했더니.. 데이터가 나오지 않았다. 전체 데이터 조회시 B 테이블이 LEFT JOIN 이더라도, WHERE 절에 LEFT JOIN 테이블의 조건이 들어가면 데이터 조회시 영향을 주므로 기억하자
chatGPT에 물어본 답변 (잘나옴)
MariaDB에서 LEFT JOIN 절에 AND 조건을 추가하는 것과 WHERE 절에 AND 조건을 추가하는 것에는 중요한 차이가 있습니다. 이 차이는 주로 조인 결과에 영향을 주는 방식에 있습니다.
1. LEFT JOIN ... ON 절에 AND 조건을 추가하는 경우:
- 조인 시점에서 조건을 적용합니다.
- LEFT JOIN은 기본적으로 왼쪽 테이블의 모든 행을 유지하고, 오른쪽 테이블에서 조건을 만족하는 행을 연결합니다.
- ON 절에 조건을 추가하면, 해당 조건을 만족하는 오른쪽 테이블의 행만 매칭되지만, 매칭되지 않는 경우에도 왼쪽 테이블의 행은 유지되고 오른쪽 테이블의 값은 NULL로 표시됩니다.
예시:
SELECT A.*, B.*
FROM tableA A
LEFT JOIN tableB B
ON A.id = B.a_id AND B.status = 'active';
이 경우, tableA의 모든 행이 결과에 포함됩니다. 단, tableB의 status가 'active'인 경우에만 조인이 이루어집니다. 그렇지 않은 경우, tableB의 값은 NULL로 나타납니다.
2. WHERE 절에 AND 조건을 추가하는 경우:
- 조인 결과를 필터링합니다.
- WHERE 절은 조인 후 결과에서 조건을 적용합니다. LEFT JOIN에서 오른쪽 테이블에 조건을 적용하면, 조건을 만족하지 않는 경우 해당 행이 필터링되어 LEFT JOIN의 특성이 무의미해집니다.
- 즉, 오른쪽 테이블에서 조건을 만족하지 않으면, 해당 행이 결과에서 제외됩니다. 이로 인해 LEFT JOIN이 마치 INNER JOIN처럼 동작할 수 있습니다.
예시:
SELECT A.*, B.*
FROM tableA A
LEFT JOIN tableB B
ON A.id = B.a_id
WHERE B.status = 'active';
이 경우, LEFT JOIN을 했음에도 불구하고, B.status = 'active' 조건을 만족하지 않으면 해당 행이 결과에서 제외됩니다. 따라서 LEFT JOIN의 특성(왼쪽 테이블의 모든 행을 유지하는 것)이 사라지고, INNER JOIN과 유사한 결과가 나옵니다.
요약:
- ON 절에 AND 조건을 추가: 왼쪽 테이블의 모든 행을 유지하면서 조건을 만족하는 오른쪽 테이블의 행을 연결.
- WHERE 절에 AND 조건을 추가: 조인 후 필터링되므로, 오른쪽 테이블에서 조건을 만족하지 않으면 해당 행이 결과에서 제외.
LEFT JOIN의 목적이 왼쪽 테이블의 모든 행을 유지하는 것이라면, 오른쪽 테이블의 조건을 ON 절에 넣어야 합니다. WHERE 절에 넣으면 LEFT JOIN의 이점이 사라질 수 있습니다.
'개발 > 05.SQL' 카테고리의 다른 글
[MariaDB, MySQL] STRAIGHT_JOIN (4) | 2024.09.09 |
---|---|
[DBeaver] 엑셀 다운로드 라이브러리 수동설치 방법 (0) | 2024.07.25 |