이제 OUTER JOIN에 대해 설명드리겠습니다.
1. 핵심 원리
OUTER JOIN은 두 테이블을 조인할 때, 어느 한쪽 테이블에만 존재하는 데이터도 포함하여 결과를 반환하는 조인 방식입니다. OUTER JOIN에는 크게 세 가지 유형이 있습니다:
- LEFT OUTER JOIN: 왼쪽 테이블의 모든 데이터를 반환하고, 오른쪽 테이블에 일치하는 데이터가 없으면 NULL 값을 반환합니다.
- RIGHT OUTER JOIN: 오른쪽 테이블의 모든 데이터를 반환하고, 왼쪽 테이블에 일치하는 데이터가 없으면 NULL 값을 반환합니다.
- FULL OUTER JOIN: 두 테이블의 모든 데이터를 반환하고, 어느 한쪽에만 존재하는 데이터에 대해서는 NULL 값을 반환합니다.
2. 실무에서 쓰이는 이유
실무에서 OUTER JOIN은 다음과 같은 이유로 사용됩니다:
- 비대칭 데이터 조인: 두 테이블의 데이터가 완전히 일치하지 않을 때, 한쪽 테이블에만 존재하는 데이터까지 모두 포함하여 분석할 수 있습니다.
- 결측값 분석: 한 테이블에만 존재하는 데이터를 쉽게 식별하여 결측값을 처리하거나 분석할 수 있습니다.
3. 실무에서 구체적으로 사용되는 상황
OUTER JOIN은 다음과 같은 상황에서 자주 사용됩니다:
- 제품 목록과 주문 목록: 제품이 주문되지 않았거나, 주문 내역에 없는 제품도 포함하여 전체 목록을 조회할 때.
- 고객과 서비스 내역: 모든 고객을 조회하면서 아직 서비스를 이용하지 않은 고객도 포함하여 분석할 때.
예상 상황 예측:
- 예시 1: 모든 고객의 목록을 조회하면서 서비스 이용 내역이 없는 고객도 함께 조회.
- 예시 2: 모든 제품을 조회하면서 현재 주문 내역이 없는 제품도 함께 조회.
4. 자주 사용되는 윈도우 방식 및 설명
OUTER JOIN에서는 LEFT JOIN
, RIGHT JOIN
, FULL JOIN
을 사용하여 각 조인 방식에 맞는 결과를 얻습니다.
- LEFT OUTER JOIN
- 설명: 왼쪽 테이블의 모든 행을 포함하고, 오른쪽 테이블에 일치하는 행이 없는 경우 NULL을 반환합니다.
- 사용 예시:
sql SELECT e.ename, d.loc FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno;
- RIGHT OUTER JOIN
- 설명: 오른쪽 테이블의 모든 행을 포함하고, 왼쪽 테이블에 일치하는 행이 없는 경우 NULL을 반환합니다.
- 사용 예시:
sql SELECT e.ename, d.loc FROM emp e RIGHT JOIN dept d ON e.deptno = d.deptno;
- FULL OUTER JOIN
- 설명: 두 테이블의 모든 행을 포함하고, 일치하지 않는 경우에는 NULL을 반환합니다.
- 사용 예시:
sql SELECT e.ename, d.loc FROM emp e FULL JOIN dept d ON e.deptno = d.deptno;
5. 연습 문제
문제 1:
students
테이블과 courses
테이블을 조인하여 모든 학생과 그들이 수강 중인 과목을 조회하는 SQL 쿼리를 작성하시오. 수강 중인 과목이 없는 학생도 포함합니다.
students
테이블 열:student_id
,student_name
courses
테이블 열:course_id
,student_id
,course_name
문제 2:
employees
테이블과 projects
테이블을 조인하여 모든 직원과 그들이 참여 중인 프로젝트를 조회하는 SQL 쿼리를 작성하시오. 프로젝트에 참여하지 않은 직원도 포함합니다.
employees
테이블 열:employee_id
,name
projects
테이블 열:project_id
,employee_id
,project_name
6. 연습 문제 해답
해답 1:
SELECT s.student_name, c.course_name
FROM students s LEFT JOIN courses c ON s.student_id = c.student_id;
해답 2:
SELECT e.name, p.project_name
FROM employees e LEFT JOIN projects p ON e.employee_id = p.employee_id;
7. 응용 문제
문제 1:
customers
테이블과 orders
테이블을 조인하여 모든 고객과 그들이 주문한 내역을 조회하는 SQL 쿼리를 작성하시오. 주문하지 않은 고객도 포함합니다.
customers
테이블 열:customer_id
,customer_name
orders
테이블 열:order_id
,customer_id
,order_date
문제 2:
teachers
테이블과 classes
테이블을 조인하여 모든 교사와 그들이 담당하는 수업을 조회하는 SQL 쿼리를 작성하시오. 담당 수업이 없는 교사도 포함합니다.
teachers
테이블 열:teacher_id
,teacher_name
classes
테이블 열:class_id
,teacher_id
,class_name
8. 응용 문제 해답
해답 1:
SELECT c.customer_name, o.order_date
FROM customers c LEFT JOIN orders o ON c.customer_id = o.customer_id;
해답 2:
SELECT t.teacher_name, cl.class_name
FROM teachers t LEFT JOIN classes cl ON t.teacher_id = cl.teacher_id;
9. 전자상거래 업계에서의 사용 예시
사용될 수 있는 경우 예측:
- 고객 목록과 주문 내역: 모든 고객을 조회하면서 주문 내역이 없는 고객도 포함하여 분석할 때.
- 제품 목록과 재고 상태: 모든 제품을 조회하면서 재고 상태가 없는 제품도 함께 조회할 때.
예상 상황 문제:
- 고객 테이블과 주문 테이블을 조인하여 모든 고객과 그들의 최근 주문 내역을 조회하는 SQL 쿼리를 작성하시오. 주문 내역이 없는 고객도 포함합니다.
- 제품 테이블과 재고 테이블을 조인하여 모든 제품과 그들의 재고 상태를 조회하는 SQL 쿼리를 작성하시오. 재고 상태가 없는 제품도 포함합니다.
SQL 코드 및 시각적 예시
문제 1 SQL 코드:
SELECT c.customer_name, o.order_date
FROM customers c LEFT JOIN orders o ON c.customer_id = o.customer_id;
예시 테이블:
customer_name | order_date |
---|---|
Alice | 2024-08-01 |
Bob | NULL |
Charlie | 2024-07-31 |
… | … |
문제 2 SQL 코드:
SELECT p.product_name, i.quantity
FROM products p LEFT JOIN inventory i ON p.product_id = i.product_id;
예시 테이블:
product_name | quantity |
---|---|
Product A | 100 |
Product B | NULL |
Product C | 50 |
… | … |