1. 핵심 원리
이 섹션에서는 여러 테이블의 데이터를 조인하여 출력하는 방법에 대해 배우며, 특히 LEFT OUTER JOIN과 RIGHT OUTER JOIN에 대해 학습합니다. LEFT OUTER JOIN은 첫 번째 테이블의 모든 레코드와 두 번째 테이블의 일치하는 레코드를 반환하며, 두 번째 테이블에 없는 경우 NULL을 반환합니다. 반면, RIGHT OUTER JOIN은 두 번째 테이블의 모든 레코드와 첫 번째 테이블의 일치하는 레코드를 반환하며, 첫 번째 테이블에 없는 경우 NULL을 반환합니다.
2. 실무에서 쓰이는 이유
LEFT OUTER JOIN과 RIGHT OUTER JOIN은 다양한 데이터를 비교하고 결합할 때 매우 유용합니다. 예를 들어, 고객 정보와 주문 정보를 조인하여 모든 고객이 주문을 했는지 확인하거나, 특정 부서에 속한 직원들 중에서 일부 정보가 누락되었는지 파악할 때 사용됩니다. 이러한 조인은 데이터를 분석하고, 비즈니스 의사 결정을 지원하는 데 필수적입니다.
3. 실무에서 구체적으로 사용되는 상황 예측
- 모든 고객 목록을 가져오되, 주문하지 않은 고객도 포함시켜야 할 때 LEFT OUTER JOIN을 사용하여 고객과 주문 데이터를 결합합니다.
- 특정 기간 동안의 모든 판매 내역을 조회하면서, 누락된 주문 항목이 있는지 확인하기 위해 RIGHT OUTER JOIN을 사용합니다.
- 회사의 모든 직원 리스트를 조회하면서, 특정 프로젝트에 할당되지 않은 직원들도 함께 포함시켜야 할 때 LEFT OUTER JOIN을 사용합니다.
4. 자주 사용되는 윈도우 표시 및 설명
- ROW_NUMBER(): 지정된 파티션 내에서 행 번호를 반환합니다.
SELECT empno, ename, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) AS row_num
FROM emp;
- RANK(): 동일한 값에 대해 동일한 순위를 부여하며, 그 다음 순위는 건너뜁니다.
SELECT empno, ename, sal, RANK() OVER (ORDER BY sal DESC) AS rank
FROM emp;
- DENSE_RANK(): 동일한 값에 대해 동일한 순위를 부여하며, 그 다음 순위는 건너뛰지 않습니다.
SELECT empno, ename, sal, DENSE_RANK() OVER (ORDER BY sal DESC) AS dense_rank
FROM emp;
- NTILE(N): 결과 집합을 N개의 동일한 크기의 그룹으로 나누고 각 행에 그룹 번호를 부여합니다.
SELECT empno, ename, sal, NTILE(4) OVER (ORDER BY sal DESC) AS ntile_group
FROM emp;
5. 연습 문제
다음 SQL을 사용하여 모든 직원의 정보를 조회하되, 부서 정보가 없는 직원도 포함하도록 하세요.
SELECT e.ename, e.job, e.sal, d.loc
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno = d.deptno;
6. 연습 문제 해답 및 테이블 표시
이 SQL 쿼리는 직원 테이블(emp)과 부서 테이블(dept)을 LEFT OUTER JOIN하여 직원 이름, 직업, 급여, 부서 위치를 반환합니다. 부서 정보가 없는 직원의 경우, 부서 위치는 NULL로 표시됩니다.
7. 응용 문제
모든 부서의 정보를 포함하되, 부서에 속한 직원이 없는 경우에도 부서 정보를 출력하는 SQL을 작성하세요.
8. 응용 문제 해답 및 테이블 표시
이 SQL 쿼리는 부서 테이블(dept)과 직원 테이블(emp)을 RIGHT OUTER JOIN하여 모든 부서와 그에 속한 직원 정보를 반환합니다. 부서에 속한 직원이 없는 경우, 직원 정보는 NULL로 표시됩니다.
SELECT d.dname, e.ename, e.job
FROM dept d RIGHT OUTER JOIN emp e
ON d.deptno = e.deptno;
9. 전자상거래 업계에서 쓰일 수 있는 경우 예측
- 전자상거래 플랫폼에서 모든 제품 목록을 표시할 때, 특정 카테고리에 속하지 않은 제품도 포함해야 할 때 LEFT OUTER JOIN을 사용합니다.
- 특정 프로모션에 포함된 모든 제품과 포함되지 않은 제품의 리스트를 조회할 때 RIGHT OUTER JOIN을 사용합니다.
10. 전자상거래 업계에서 사용할 수 있는 경우 예상 상황 문제 2가지 및 그 경우에 대한 SQL 코드 작성
- 모든 고객이 포함된 리스트를 조회하되, 특정 제품을 구매하지 않은 고객도 포함되도록 하세요.
SELECT c.customer_name, o.order_id
FROM customers c LEFT OUTER JOIN orders o
ON c.customer_id = o.customer_id
WHERE o.product_id = 'P123';
- 모든 주문을 조회하되, 배송되지 않은 주문도 포함되도록 하세요.
SELECT o.order_id, s.shipping_id
FROM orders o RIGHT OUTER JOIN shipping s
ON o.order_id = s.order_id;
11. 10번에 대한 SQL 코드를 시각적으로 이해하기 쉽도록 테이블 예시 작성
- 고객과 주문 예시: customer_name order_id John Doe 001 Jane Smith NULL Adam Johnson 002
- 주문과 배송 예시: order_id shipping_id 001 S001 002 NULL 003 S002