SQL 통한 Database 관리

LEFT OUTER JOIN`

JBS 12 2024. 8. 20. 19:05

select a, b, c from a left outer join b on (a.고객번호 in (11000, 12000) AND a.단말기id = b.단말기id) left outer join c ON (b.osid= c.osid)

이 쿼리는 SQL에서 세 개의 테이블 (`a`, `b`, `c`)을 `LEFT OUTER JOIN`을 사용하여 조인하는 예제입니다. 각 조인 조건을 해석하고, 쿼리의 결과를 이해하기 위해 설명하겠습니다.

### 쿼리 구조

```sql
SELECT a.a, a.b, a.c
FROM a
LEFT OUTER JOIN b ON (a.고객번호 IN (11000, 12000) AND a.단말기id = b.단말기id)
LEFT OUTER JOIN c ON (b.osid = c.osid);
```

### 쿼리 분석

#### 1. **`LEFT OUTER JOIN`의 역할**

- **`LEFT OUTER JOIN`**은 조인 조건에 맞는 데이터는 물론이고, 조건에 맞지 않는 경우에도 왼쪽 테이블 (`a`, `b`)의 모든 행을 포함합니다.
- 만약 오른쪽 테이블 (`b`, `c`)에서 조인 조건을 만족하는 행이 없다면, 해당하는 오른쪽 테이블의 열 값은 `NULL`로 반환됩니다.

#### 2. **첫 번째 `LEFT OUTER JOIN`**

```sql
LEFT OUTER JOIN b ON (a.고객번호 IN (11000, 12000) AND a.단말기id = b.단말기id)
```

- `a` 테이블과 `b` 테이블을 `LEFT OUTER JOIN`합니다.
- 조건은 다음과 같습니다:
  - `a.고객번호`가 `11000` 또는 `12000`에 포함되어야 합니다.
  - `a.단말기id`와 `b.단말기id`가 일치해야 합니다.
- 이 조인에서는 `a` 테이블의 모든 행이 유지되며, 조건에 맞는 `b` 테이블의 데이터가 포함됩니다.
- 만약 조건에 맞는 `b` 테이블의 데이터가 없다면, `b` 테이블의 열들은 `NULL`로 채워집니다.

#### 3. **두 번째 `LEFT OUTER JOIN`**

```sql
LEFT OUTER JOIN c ON (b.osid = c.osid)
```

- 이제 `b` 테이블과 `c` 테이블을 `LEFT OUTER JOIN`합니다.
- 조건은 `b.osid`와 `c.osid`가 일치해야 합니다.
- 이 조인에서도 `b` 테이블의 모든 행이 유지되며, 조건에 맞는 `c` 테이블의 데이터가 포함됩니다.
- 만약 조건에 맞는 `c` 테이블의 데이터가 없다면, `c` 테이블의 열들은 `NULL`로 채워집니다.

### 결과

- 쿼리의 최종 결과는 `a` 테이블의 모든 행이 포함되며, `b` 테이블과 `c` 테이블에서 조건에 맞는 행이 있다면 그 데이터가 함께 포함됩니다.
- 조건에 맞지 않는 `b` 또는 `c` 테이블의 데이터는 `NULL`로 표시됩니다.

### 예시를 통해 이해하기

#### 가정된 데이터
- **a 테이블**:

| 고객번호 | 단말기id | a |
|----------|----------|---|
| 11000    | 001      | A1|
| 13000    | 002      | A2|
| 12000    | 003      | A3|

- **b 테이블**:

| 단말기id | osid | b |
|----------|------|---|
| 001      | 10   | B1|
| 002      | 20   | B2|
| 003      | 10   | B3|

- **c 테이블**:

| osid | c |
|------|---|
| 10   | C1|
| 20   | C2|
| 30   | C3|

#### 실행 결과
- 첫 번째 조인에서 고객번호가 `11000` 또는 `12000`이고, `단말기id`가 일치하는 경우만 조인됩니다.
- 그 결과 `A1`과 `A3`의 행이 조인되며, `B1`과 `B3`의 데이터가 포함됩니다.
- 두 번째 조인에서 `b.osid`와 `c.osid`가 일치하는 경우 `c` 테이블의 데이터가 포함됩니다.

| a  | b  | c  |
|----|----|----|
| A1 | B1 | C1 |
| A3 | B3 | C1 |

### 요약

- **`LEFT OUTER JOIN`**은 왼쪽 테이블의 모든 행을 유지하며, 오른쪽 테이블에서 조건에 맞는 데이터를 가져옵니다.
- 이 쿼리에서는 특정 고객번호와 단말기 ID에 따라 `a`와 `b` 테이블이 조인되고, 이어서 `osid`에 따라 `b`와 `c` 테이블이 조인됩니다.
- 조인 조건을 만족하지 않는 오른쪽 테이블의 값들은 `NULL`로 반환됩니다.

'SQL 통한 Database 관리' 카테고리의 다른 글

select count(*) CNT from EMP_TBL A, RULE_TBL B where A.Ename like B.Rule  (0) 2024.08.20
inner join  (0) 2024.08.20
레코드 와 칼럼 차이  (0) 2024.08.20
UNION ALL`과 `NOT EXISTS  (0) 2024.08.20
where not exists  (0) 2024.08.20