메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
편집 요약 없음
편집 요약 없음
1번째 줄: 1번째 줄:
물론입니다! 이번에는 요청하신 대로 **모든 표를 미디어위키 위키테이블 형식**으로 작성하고, 추가로 \*\*카테시안 조인(CARTESIAN JOIN)\*\*과 \*\*안티 조인(ANTI JOIN)\*\*도 포함하여 **Oracle의 조인 종류를 초보자도 쉽게 이해**할 수 있도록 정리해드리겠습니다.
---
# 🔗 Oracle 테이블 조인 (Table Join) 설명
## 📌 조인이란?
> 여러 테이블에서 관련된 데이터를 **하나의 결과로 결합**해서 보여주는 SQL 기능입니다.
예: 직원 정보는 `EMPLOYEES`, 부서 정보는 `DEPARTMENTS`에 있을 때
👉 직원 이름 + 부서 이름을 함께 보여주고 싶을 때 조인을 사용합니다.
---
## 📌 예제 테이블
```sql
-- EMPLOYEES 테이블
| EMP_ID | NAME    | DEPT_ID |
|--------|---------|---------|
| 101    | Alice  | 10      |
| 102    | Bob    | 20      |
| 103    | Charlie | 10      |
-- DEPARTMENTS 테이블
| DEPT_ID | DEPT_NAME  |
|---------|------------|
| 10      | HR        |
| 20      | IT        |
| 30      | Marketing  |
```
---
## 📌 조인 종류 요약
{| class="wikitable"
| ! 조인 종류 !! 설명        |  |                                                |
| -------------------- | - | ----------------------------------------------- |
| INNER JOIN          |  | 두 테이블에서 **일치하는 값이 있는 행만** 보여줌                  |
| -                    |  |                                                |
| LEFT OUTER JOIN      |  | 왼쪽 테이블은 **무조건 모두 출력**, 오른쪽에 일치하는 값이 없으면 NULL    |
| -                    |  |                                                |
| RIGHT OUTER JOIN    |  | 오른쪽 테이블은 **무조건 모두 출력**, 왼쪽에 일치하는 값이 없으면 NULL    |
| -                    |  |                                                |
| FULL OUTER JOIN      |  | 양쪽 테이블을 **모두 포함**, 일치하지 않으면 NULL                |
| -                    |  |                                                |
| CROSS JOIN (카테시안 조인) |  | 두 테이블의 **모든 행 조합**을 출력 (곱집합)                    |
| -                    |  |                                                |
| ANTI JOIN            |  | **조건에 맞지 않는** 행만 보여줌 (EXISTS가 아닌 NOT EXISTS 조건) |
| }                    |  |                                                |
---
## 📘 INNER JOIN
```sql
SELECT E.EMP_ID, E.NAME, D.DEPT_NAME
FROM EMPLOYEES E
INNER JOIN DEPARTMENTS D
ON E.DEPT_ID = D.DEPT_ID;
```
{| class="wikitable"
| ! EMP\_ID !! NAME !! DEPT\_NAME |  |        |  |    |
| ------------------------------- | - | ------- | - | -- |
| 101                            |  | Alice  |  | HR |
| -                              |  |        |  |    |
| 102                            |  | Bob    |  | IT |
| -                              |  |        |  |    |
| 103                            |  | Charlie |  | HR |
| }                              |  |        |  |    |
---
## 📘 LEFT OUTER JOIN
```sql
SELECT E.EMP_ID, E.NAME, D.DEPT_NAME
FROM EMPLOYEES E
LEFT OUTER JOIN DEPARTMENTS D
ON E.DEPT_ID = D.DEPT_ID;
```
* `EMPLOYEES`의 모든 직원은 다 나오고,
* 일치하지 않는 부서가 있으면 `DEPT_NAME`은 NULL
---
## 📘 RIGHT OUTER JOIN
```sql
SELECT E.EMP_ID, E.NAME, D.DEPT_NAME
FROM EMPLOYEES E
RIGHT OUTER JOIN DEPARTMENTS D
ON E.DEPT_ID = D.DEPT_ID;
```
* `DEPARTMENTS`의 모든 부서는 다 나오고,
* 직원이 없는 부서는 `EMP_ID`, `NAME`이 NULL
---
## 📘 FULL OUTER JOIN
```sql
SELECT E.EMP_ID, E.NAME, D.DEPT_NAME
FROM EMPLOYEES E
FULL OUTER JOIN DEPARTMENTS D
ON E.DEPT_ID = D.DEPT_ID;
```
* `EMPLOYEES`, `DEPARTMENTS` 둘 다 포함
* 한쪽에만 데이터가 있으면 다른 쪽은 NULL
---
## 📘 CARTESIAN JOIN (CROSS JOIN)
```sql
SELECT E.EMP_ID, E.NAME, D.DEPT_NAME
FROM EMPLOYEES E
CROSS JOIN DEPARTMENTS D;
```
* 조인 조건 없이 **모든 행을 조합**
* EMPLOYEES가 3행, DEPARTMENTS가 3행이면 → 결과는 9행
{| class="wikitable"
| ! EMP\_ID !! NAME !! DEPT\_NAME |  |      |  |          |
| ------------------------------- | - | ----- | - | --------- |
| 101                            |  | Alice |  | HR        |
| -                              |  |      |  |          |
| 101                            |  | Alice |  | IT        |
| -                              |  |      |  |          |
| 101                            |  | Alice |  | Marketing |
| -                              |  |      |  |          |
| 102                            |  | Bob  |  | HR        |
| -                              |  |      |  |          |
| ...                            |  | ...  |  | ...      |
| }                              |  |      |  |          |
> ❗ 주의: **WHERE 조건 없이 CROSS JOIN을 쓰면 큰 결과가 나올 수 있어 조심해야 합니다.**
---
## 📘 ANTI JOIN (조건에 부합하지 않는 데이터만)
```sql
SELECT *
FROM DEPARTMENTS D
WHERE NOT EXISTS (
  SELECT 1 FROM EMPLOYEES E WHERE E.DEPT_ID = D.DEPT_ID
);
```
* **직원이 없는 부서만 조회**하는 예제입니다.
{| class="wikitable"
| ! DEPT\_ID !! DEPT\_NAME |  |          |
| ------------------------ | - | --------- |
| 30                      |  | Marketing |
| }                        |  |          |
> ✅ 실무에서 **특정 값이 존재하지 않는 경우**를 찾을 때 많이 사용합니다.
---
## 📌 마무리 요약 표
{| class="wikitable"
| ! 조인 종류 !! 대표 SQL 구문 !! 출력 대상 |  |                              |  |                    |
| ----------------------------- | - | ---------------------------- | - | ------------------- |
| INNER JOIN                    |  | `A INNER JOIN B ON 조건`      |  | A와 B 모두 조건에 맞는 데이터만 |
| -                            |  |                              |  |                    |
| LEFT OUTER JOIN              |  | `A LEFT OUTER JOIN B ON 조건`  |  | A는 모두, B는 맞는 것만    |
| -                            |  |                              |  |                    |
| RIGHT OUTER JOIN              |  | `A RIGHT OUTER JOIN B ON 조건` |  | B는 모두, A는 맞는 것만    |
| -                            |  |                              |  |                    |
| FULL OUTER JOIN              |  | `A FULL OUTER JOIN B ON 조건`  |  | A와 B 모두 포함          |
| -                            |  |                              |  |                    |
| CROSS JOIN                    |  | `A CROSS JOIN B`            |  | 모든 조합 (곱집합)        |
| -                            |  |                              |  |                    |
| ANTI JOIN                    |  | `WHERE NOT EXISTS (서브쿼리)`    |  | 조건에 부합하지 않는 데이터    |
| }                            |  |                              |  |                    |
---
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Joins.html#GUID-39081984-8D38-4D64-A847-AA43F515D460
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Joins.html#GUID-39081984-8D38-4D64-A847-AA43F515D460




== [[카테시안 조인]] ==
== [[카테시안 조인]] ==

2025년 5월 14일 (수) 01:06 판

물론입니다! 이번에는 요청하신 대로 **모든 표를 미디어위키 위키테이블 형식**으로 작성하고, 추가로 \*\*카테시안 조인(CARTESIAN JOIN)\*\*과 \*\*안티 조인(ANTI JOIN)\*\*도 포함하여 **Oracle의 조인 종류를 초보자도 쉽게 이해**할 수 있도록 정리해드리겠습니다.

---

  1. 🔗 Oracle 테이블 조인 (Table Join) 설명
    1. 📌 조인이란?

> 여러 테이블에서 관련된 데이터를 **하나의 결과로 결합**해서 보여주는 SQL 기능입니다.

예: 직원 정보는 `EMPLOYEES`, 부서 정보는 `DEPARTMENTS`에 있을 때 👉 직원 이름 + 부서 이름을 함께 보여주고 싶을 때 조인을 사용합니다.

---

    1. 📌 예제 테이블

```sql -- EMPLOYEES 테이블 | EMP_ID | NAME | DEPT_ID | |--------|---------|---------| | 101 | Alice | 10 | | 102 | Bob | 20 | | 103 | Charlie | 10 |

-- DEPARTMENTS 테이블 | DEPT_ID | DEPT_NAME | |---------|------------| | 10 | HR | | 20 | IT | | 30 | Marketing | ```

---

    1. 📌 조인 종류 요약
| | - | ----------------------------------------------- | | 두 테이블에서 **일치하는 값이 있는 행만** 보여줌 | | | | 왼쪽 테이블은 **무조건 모두 출력**, 오른쪽에 일치하는 값이 없으면 NULL | | | | 오른쪽 테이블은 **무조건 모두 출력**, 왼쪽에 일치하는 값이 없으면 NULL | | | | 양쪽 테이블을 **모두 포함**, 일치하지 않으면 NULL | | | | 두 테이블의 **모든 행 조합**을 출력 (곱집합) | | | | **조건에 맞지 않는** 행만 보여줌 (EXISTS가 아닌 NOT EXISTS 조건) | | |

---

    1. 📘 INNER JOIN

```sql SELECT E.EMP_ID, E.NAME, D.DEPT_NAME FROM EMPLOYEES E INNER JOIN DEPARTMENTS D ON E.DEPT_ID = D.DEPT_ID; ```

| | | | - | ------- | - | -- | | Alice | | HR | | | | | | Bob | | IT | | | | | | Charlie | | HR | | | | |

---

    1. 📘 LEFT OUTER JOIN

```sql SELECT E.EMP_ID, E.NAME, D.DEPT_NAME FROM EMPLOYEES E LEFT OUTER JOIN DEPARTMENTS D ON E.DEPT_ID = D.DEPT_ID; ```

  • `EMPLOYEES`의 모든 직원은 다 나오고,
  • 일치하지 않는 부서가 있으면 `DEPT_NAME`은 NULL

---

    1. 📘 RIGHT OUTER JOIN

```sql SELECT E.EMP_ID, E.NAME, D.DEPT_NAME FROM EMPLOYEES E RIGHT OUTER JOIN DEPARTMENTS D ON E.DEPT_ID = D.DEPT_ID; ```

  • `DEPARTMENTS`의 모든 부서는 다 나오고,
  • 직원이 없는 부서는 `EMP_ID`, `NAME`이 NULL

---

    1. 📘 FULL OUTER JOIN

```sql SELECT E.EMP_ID, E.NAME, D.DEPT_NAME FROM EMPLOYEES E FULL OUTER JOIN DEPARTMENTS D ON E.DEPT_ID = D.DEPT_ID; ```

  • `EMPLOYEES`, `DEPARTMENTS` 둘 다 포함
  • 한쪽에만 데이터가 있으면 다른 쪽은 NULL

---

    1. 📘 CARTESIAN JOIN (CROSS JOIN)

```sql SELECT E.EMP_ID, E.NAME, D.DEPT_NAME FROM EMPLOYEES E CROSS JOIN DEPARTMENTS D; ```

  • 조인 조건 없이 **모든 행을 조합**
  • EMPLOYEES가 3행, DEPARTMENTS가 3행이면 → 결과는 9행
| | | | - | ----- | - | --------- | | Alice | | HR | | | | | | Alice | | IT | | | | | | Alice | | Marketing | | | | | | Bob | | HR | | | | | | ... | | ... | | | | |

> ❗ 주의: **WHERE 조건 없이 CROSS JOIN을 쓰면 큰 결과가 나올 수 있어 조심해야 합니다.**

---

    1. 📘 ANTI JOIN (조건에 부합하지 않는 데이터만)

```sql SELECT * FROM DEPARTMENTS D WHERE NOT EXISTS (

 SELECT 1 FROM EMPLOYEES E WHERE E.DEPT_ID = D.DEPT_ID

); ```

  • **직원이 없는 부서만 조회**하는 예제입니다.
| | - | --------- | | Marketing | | |

> ✅ 실무에서 **특정 값이 존재하지 않는 경우**를 찾을 때 많이 사용합니다.

---

    1. 📌 마무리 요약 표
| | | | - | ---------------------------- | - | ------------------- | | `A INNER JOIN B ON 조건` | | A와 B 모두 조건에 맞는 데이터만 | | | | | | `A LEFT OUTER JOIN B ON 조건` | | A는 모두, B는 맞는 것만 | | | | | | `A RIGHT OUTER JOIN B ON 조건` | | B는 모두, A는 맞는 것만 | | | | | | `A FULL OUTER JOIN B ON 조건` | | A와 B 모두 포함 | | | | | | `A CROSS JOIN B` | | 모든 조합 (곱집합) | | | | | | `WHERE NOT EXISTS (서브쿼리)` | | 조건에 부합하지 않는 데이터 | | | | |

---



https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Joins.html#GUID-39081984-8D38-4D64-A847-AA43F515D460



카테시안 조인