JOIN은 어떤 상황에 쓰여야 하는지 명확하게 정의하기 넘 힘들고
습관이 들었는지, 무의식적으로 그냥 JOIN ON(INNER JOIN)절을 더 자주 사용하게 된다.
(외부 조인이나 교차 조인을 제외하고 모든 조인 표현이 가능하기 때문에)
하지만 나는 이제 쿼리를 잘 작성해야 하기 때문에, 쿼리의 의도를 명확히 전달해야 한다.
가독성 : 쿼리의 의도를 명확하게 전달해야 하는데, 나의 쿼리는 딱 봐도 무지성 JOIN ON절을 남발한 듯 보인다.
결과 집합의 크기 : RIGHT JOIN이나 LEFT JOIN을 사용하면 두 테이블 간의 연결을 보존하면서 결과 집합을 제공한다.
누락된 데이터 처리 : RIGHT JOIN이나 LEFT JOIN을 사용하면 일치하는 레코드가 없을 경우 NULL값을 반환한다. INNER JOIN은 누락된 데이터를 처리하기 어렵기 때문에 파악이 힘들다.
유지보수 및 수정의 어려움 : INNER JOIN을 사용하면 논리적인 구조 파악이 어렵다. RIGHT JOIN이나 LEFT JOIN을 사용하면 방향서을 명확히 알려주므로 쿼리를 이해하고 수정하기 쉽다.
내가 자주 사용하는 절 INNER JOIN은 두 테이블 간의 공통 열(Column)에서 일치하는 값을 기준으로 행을 선택하고, 그 결과로 새로운 단일 결과 집합을 생성한다.
ON절에 비해 코드를 간결하게 작성할 수 있다.
1) 동일한 이름의 컬럼을 가진 테이블을 조인할 때 : 두 테이블의 조인에 사용되는 컬럼이 동일한 이름을 가진 경우 'USING'절을 사용하여 조인 조건을 지정할 수 있다.
2) 단일 컬럼으로 조인할 때 : USING절을 사용하여 해당 컬럼을 명시적으로 지정할 수 있다.
EX.
SELECT *
FROM employees
INNER JOIN departments USING (department_id);
문제풀이 빨리 하기 급급함 + 덜 생각하고 싶은 마음에 나같은 취준생은 LEFT/RIGHT JOIN을 왜 해야 하는지, 생각하지 않을때가 많다. 왜냐면 문제풀이용 쿼리는 엄~~청 간단하기 때문에 FROM절의 위치만 바꾸면 되는거 아니야? 라는 짱구같은 생각을 할 수 있다.
의도전달과, 쿼리 최적화에 치명적이다...
하지만 프랜차이즈와 같은 복잡한 비즈니스 환경은 쿼리도 엄청 많고, JOIN되어 있는 테이블의 수도 엄청날 것이다. 복잡한 관계를 적절하게 표현하기 위해 LEFT JOIN과 RIGHT JOIN을 적극적으로 활용하여 데이터를 효율적으로 처리하고 분석하는것이 좋다.
LEFT JOIN : 왼쪽 테이블의 모든 레코드를 반환하고, 오른쪽 테이블에서 일치하는 레코드가 없는 경우에는 NULL 값을 반환합니다. 왼쪽 테이블을 기준으로 한다.
RIGHT JOIN : 오른쪽 테이블의 모든 레코드를 반환하고, 왼쪽 테이블에서 일치하는 레코드가 없는 경우에는 NULL 값을 반환합니다. 오른쪽 테이블을 기준으로 한다.
WITH OFFLINE AS (
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
UNION ALL
select SALES_DATE,PRODUCT_ID,null USER_ID,SALES_AMOUNT
FROM OFFLINE_SALE )
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d')AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM OFFLINE
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
저번에 배웠던 WITH절을 이용하여 테이블을 생성하는 것이 의도를 명확하게 표현할 수 있을 것 같았다. UNION ALL절이라 굳이 테이블을 생성하지 않아도 괜찮을 듯 싶다.