# 07강. 조건 조합하기

**`AND, OR, NOT`**
```
조건식1 AND 조건식2
조건식1 OR 조건식2
NOT 조건식
```

- 조건식을 조합해 사용할 경우 복수의 조건은 `WHERE` 구로 지정한다.
- 조합할 때는 `AND`, `OR`, `NOT`의 3가지 방법을 사용할 수 있다.

---

## 1. AND로 조합하기
- 복수의 조건을 조합할 경우 `AND`를 가장 많이 사용한다.
- `AND`는 논리 연산자의 하나로 좌우에 항목이 필요한 이항 연산자가 된다.
- 좌우의 식 모두 참일 경우 `AND` 연산자는 참을 반환한다.
- `모든 조건을 만족하는 경우 조건식은 참이 된다`고 할 때 `AND` 연산자로 조건식을 조합한다.
- 쉽게 말하면 `및`에 해당한다.

**`AND`**
```
조건식1 AND 조건식2
```

- 0이 아니라는 조건은 `a<>0`과 같이 표현한다.
- `AND` 연산은 조건을 만족하는 행을 집합으로 표현했을 때 이들 집합이 겹치는 부분, 즉 `교집합`으로 계산할 수 있다.
- `AND` 연산자는 논리곱을 계산하는 논리 연산자이다.

##### AND로 조건식을 연결하면 모든 조건을 만족하는 행을 검색할 수 있다!

---

## 2. OR로 조합하기
- `어느 쪽이든 하나만 참이 되면 조건식은 참이 된다`라고 할 경우에는 `OR`로 조건식을 연결한다.
- `OR` 또한 논리 연산자의 하나로 좌우 항목이 모두 필요한 이항 연산자이다.
- `AND`와 달리 어느 쪽이든 조건을 만족하면 결과는 참이 된다.
- 모든 조건이 거짓인 경우 결과는 거짓이 된다.
- 즉, `OR`는 `또는`에 해당한다.

**`OR`**
```
조건식1 OR 조건식2
```

- `OR` 연산은 조건을 만족하는 행을 집합으로 표현했을 때, 이 집합들을 합한 부분, 즉 `합집합`으로 계산할 수 있다.
- `OR` 연산자는 논리합을 계산하는 논리 연산자이다.

##### OR로 조건식을 연결하면 어느 쪽이든 조건을 만족하는 행을 모두 검색할 수 있다!

---

## 3. AND와 OR를 사용할 경우 주의할 점
- `AND` 연산자나 `OR` 연산자의 좌우로 참과 거짓을 반환하는 조건식을 지정하는 경우가 많다.
- 열이나 상수만을 지정해도 에러가 발생하지는 않지만 기대한 결괏값을 얻을 수 없다.
- 예를 들어 다음과 같은 조건식을 사용하면 올바른 결과를 얻을 수 없다.

```
SELECT * FROM sample24 WHERE no = 1 OR 2;
```

- 상수 `2`는 논리 연산으로 항상 참이 되기 때문에 결과적으로 모든 행을 반환하게 된다.

올바른 조건식은 다음과 같다.

```
SELECT * FROM sample24 WHERE no = 1 OR no = 2;
```

### AND와 OR를 조합해 사용하기
- `a<>0 AND b<>0`이라는 조건식을 `a=1 OR a=2 AND b=1 OR b=2`로 변경해보면, `a<>0 AND b<>0`의 조건식 결과와는 다른 것을 알 수 있다.

### 연산자의 우선 순위
- 결과가 다른 이유는 `AND`와 `OR`의 계산 우선 순위가 다르기 때문이다.
- `OR` 보다 `AND` 쪽이 우선 순위가 높기 때문에 `a = 2 AND b = 1`이 먼저 계산된다.
- 즉, `WHERE a=1 OR (a=2 AND b=1) OR b=2`와 같다.
- 따라서 조건식은 `a=1`, `a=2 AND b=1`, `b=2`의 3개로 나뉜다.
- 그러므로 처음 원한 대로 조건을 지정하기 위해서는 괄호로 우선 순위를 변경하면 된다.
- `SELECT * FROM sample24 WHERE (a=1 OR a=2) AND (b=1 OR b=2);`
- 일반적으로 `OR` 조건식은 괄호로 묶어 지정하는 경우가 많다.

##### AND는 OR에 비해 우선 순위가 높다!

---

## 4. NOT으로 조합

**`NOT`**
```
NOT 조건식
```

- `NOT` 연산자는 오른쪽에만 항목을 지정하는 `단항 연산자`이다.
- 오른쪽에 지정한 조건식의 반대 값을 반환한다.
- 만약 조건식이 참을 반환하면 `NOT`은 이에 반하는 거짓을 반환한다.
- 주로 복수의 조건식에 대해 `~아닌`, `~외에`, `~를 제외한 나머지` 등의 조건을 지정할 경우 사용한다.

---