SQL 통한 Database 관리

left outer join

JBS 12 2024. 8. 20. 19:04

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)
order by a.고객번호;

left join 과 in 을 잘 몰라
설명해줘

이 SQL 쿼리는 두 개의 `LEFT OUTER JOIN`을 사용하여 세 개의 테이블 (`a`, `b`, `c`)을 결합하고, 마지막에 `a.고객번호`를 기준으로 결과를 정렬합니다. `LEFT OUTER JOIN`과 `IN`에 대해 차례로 설명하겠습니다.

### 1. **`LEFT OUTER JOIN`**

`LEFT OUTER JOIN`은 두 테이블을 결합할 때, **왼쪽** 테이블의 모든 행을 반환하고, 오른쪽 테이블에서 일치하는 값이 없으면 `NULL`을 반환하는 조인입니다.

#### 동작 방식:

- **왼쪽 테이블 (`a`)**: 조인의 기준이 되는 테이블입니다. 이 테이블의 모든 행이 반환됩니다.
- **오른쪽 테이블 (`b`)**: 왼쪽 테이블과 일치하는 값을 가진 행만 반환됩니다. 일치하지 않는 경우 `NULL`이 반환됩니다.

### 예제

```sql
SELECT a.고객번호, a.단말기id, b.단말기id
FROM a
LEFT OUTER JOIN b
ON a.단말기id = b.단말기id;
```

- 이 쿼리는 `a` 테이블의 모든 행을 반환하며, `a.단말기id`와 `b.단말기id`가 일치하는 경우 `b` 테이블의 값도 함께 반환합니다.
- 만약 `b` 테이블에 일치하는 `단말기id`가 없다면, `b.단말기id`는 `NULL`로 표시됩니다.

### 2. **`IN` 연산자**

`IN` 연산자는 주어진 값들 중 하나와 일치하는 경우에 참(`TRUE`)이 되는 조건입니다. 주로 여러 개의 값을 비교할 때 사용됩니다.

#### 예제

```sql
SELECT * FROM a
WHERE a.고객번호 IN (11000, 12000);
```

- 이 쿼리는 `a` 테이블에서 `고객번호`가 `11000` 또는 `12000`인 행만 선택합니다.

### 3. **쿼리 분석**

이제, 원래 쿼리를 분석해 보겠습니다:

```sql
SELECT a.고객번호, b.단말기id, c.osid
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
ORDER BY a.고객번호;
```

#### 단계별 설명:

1. **첫 번째 `LEFT OUTER JOIN`**:
   - `a` 테이블과 `b` 테이블을 조인합니다.
   - 조인의 조건은 두 가지로 이루어집니다:
     - `a.고객번호`가 `11000` 또는 `12000` 중 하나여야 합니다 (`IN (11000, 12000)`).
     - `a.단말기id`와 `b.단말기id`가 같아야 합니다.
   - `a` 테이블의 모든 행이 반환되며, 일치하는 `b` 테이블의 행이 있으면 함께 반환됩니다. 일치하지 않는 경우 `b.단말기id`는 `NULL`로 반환됩니다.

2. **두 번째 `LEFT OUTER JOIN`**:
   - 첫 번째 조인의 결과와 `c` 테이블을 조인합니다.
   - 조인의 조건은 `b.osid`와 `c.osid`가 일치해야 합니다.
   - 첫 번째 조인 결과의 모든 행이 반환되며, 일치하는 `c` 테이블의 행이 있으면 함께 반환됩니다. 일치하지 않는 경우 `c.osid`는 `NULL`로 반환됩니다.

3. **정렬 (`ORDER BY`)**:
   - 최종 결과는 `a.고객번호`를 기준으로 정렬됩니다.

### 최종 결과

이 쿼리는 `a` 테이블의 모든 행을 반환하며, 그 중에서 `고객번호`가 `11000` 또는 `12000`인 경우에만 `b` 테이블과 `단말기id`를 기준으로 결합하고, 다시 그 결과를 `c` 테이블과 결합합니다. 결합된 결과는 `a.고객번호`를 기준으로 정렬됩니다.

### 요약

- **`LEFT OUTER JOIN`**: 왼쪽 테이블의 모든 데이터를 포함하고, 오른쪽 테이블과 일치하지 않는 경우 `NULL`을 반환합니다.
- **`IN` 연산자**: 주어진 목록 중 하나와 일치하는 경우에 참이 됩니다.

이 쿼리에서는 `LEFT OUTER JOIN`을 사용하여, `a` 테이블의 모든 데이터를 반환하며, 특정 조건에 맞는 경우 `b` 및 `c` 테이블과 데이터를 결합하는 방식을 사용하고 있습니다.

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

UNION ALL`과 `NOT EXISTS  (0) 2024.08.20
where not exists  (0) 2024.08.20
cube()  (0) 2024.08.20
start with, connect by prior c, order siblings by  (0) 2024.08.20
grouping sets () rollup()  (0) 2024.08.19