> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL 연산자

> MySQL이 select 목록에서 사용하는 비교 연산자와 산술 연산자, 비교가 무엇을 반환하는지, 어느 것이 더 세게 결합하는지, 그리고 NULL이 그 연산자들에 어떻게 동작하는지 설명합니다.

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

연산자는 값들을 결합해 새 값을 만듭니다. 이미 하나를 썼습니다: `rental_rate * 1.1`의 `*`입니다. 이 수업은 일상적으로 쓰는 연산자들과, 모두를 걸려 넘어지게 하는 한 가지 동작, 즉 `NULL`이 나타날 때 일어나는 일을 다룹니다.

시작하기 전에 `mysql -u root -p sakila`로 클라이언트를 여세요.

## 연산자의 동작 방식

```sql theme={null}
SELECT LEFT_VALUE OPERATOR RIGHT_VALUE;
```

`LEFT_VALUE`와 `RIGHT_VALUE`를 값으로, `OPERATOR`를 아래의 기호 중 하나로 바꾸세요. 값은 열일 수도 있고 리터럴일 수도 있는데, 리터럴은 문장에 직접 쓴 숫자나 텍스트 조각을 뜻합니다.

`FROM`이 없는 `SELECT`는 표현식을 평가해 단일 행을 반환하므로, 연산자를 시험해 보는 가장 빠른 방법입니다.

## 예제

### 비교는 1 또는 0을 반환합니다

MySQL에는 별도의 불리언 타입이 없습니다. 성립하는 비교는 정수 `1`을 반환하고, 성립하지 않는 비교는 `0`을 반환합니다. `TRUE`와 `FALSE`라는 단어는 그 2개의 정수를 다르게 쓴 것입니다.

```sql theme={null}
SELECT 1 = 1, 1 <> 2, 1 != 2, 2 > 3, 3 >= 3, 2 <= 2;
```

```text theme={null}
+-------+--------+--------+-------+--------+--------+
| 1 = 1 | 1 <> 2 | 1 != 2 | 2 > 3 | 3 >= 3 | 2 <= 2 |
+-------+--------+--------+-------+--------+--------+
|     1 |      1 |      1 |     0 |      1 |      1 |
+-------+--------+--------+-------+--------+--------+
1 row in set (0.00 sec)
```

동등 비교는 대부분의 프로그래밍 언어가 쓰는 이중 `==`가 아니라 단일 `=`입니다. `<>`와 `!=`는 둘 다 같지 않음을 뜻하고 똑같이 동작합니다. 이 튜토리얼은 `<>`로 씁니다.

### 산술, 그리고 어느 연산자가 더 세게 결합하는가

```sql theme={null}
SELECT 2 + 3 * 4, (2 + 3) * 4, 7 / 2, 7 DIV 2, 7 % 2;
```

```text theme={null}
+-----------+-------------+--------+---------+-------+
| 2 + 3 * 4 | (2 + 3) * 4 | 7 / 2  | 7 DIV 2 | 7 % 2 |
+-----------+-------------+--------+---------+-------+
|        14 |          20 | 3.5000 |       3 |     1 |
+-----------+-------------+--------+---------+-------+
1 row in set (0.00 sec)
```

`2 + 3 * 4`는 14이므로, 곱셈이 먼저 일어났습니다. 괄호는 그것을 뒤집어 20으로 만듭니다. `/`는 2개의 정수 사이에서도 소수 결과를 주고, `DIV`는 소수 부분을 버리며, `%`는 나머지를 줍니다.

### DIV와 %는 나눗셈만큼 세게 결합합니다

```sql theme={null}
SELECT 10 - 4 / 2, 10 - 4 DIV 2, 1 + 7 % 3;
```

```text theme={null}
+------------+--------------+-----------+
| 10 - 4 / 2 | 10 - 4 DIV 2 | 1 + 7 % 3 |
+------------+--------------+-----------+
|     8.0000 |            8 |         2 |
+------------+--------------+-----------+
1 row in set (0.00 sec)
```

3개 모두 나눗셈이나 나머지를 먼저 계산했을 때 얻는 답을 줍니다. `-`가 `/`보다 세게 결합했다면 첫 번째 열은 8이 아니라 3이었을 것입니다.

### 연산자는 열에도 동작합니다

리터럴에 할 수 있는 것은 무엇이든 열에도 할 수 있습니다.

```sql theme={null}
SELECT title, length, length > 100 AS is_long FROM film ORDER BY title;
```

```text theme={null}
+-----------------------------+--------+---------+
| title                       | length | is_long |
+-----------------------------+--------+---------+
| ACADEMY DINOSAUR            |     86 |       0 |
| ACE GOLDFINGER              |     48 |       0 |
| ADAPTATION HOLES            |     50 |       0 |
| AFFAIR PREJUDICE            |    117 |       1 |
| AFRICAN EGG                 |    130 |       1 |
...
+-----------------------------+--------+---------+
1000 rows in set (0.00 sec)
```

비교가 1과 0으로 이루어진 열이 되고, 별칭이 그 열에 이름을 붙입니다.

## NULL은 NULL을 포함해 아무것과도 같지 않습니다

정렬 수업에서 `NULL`을 한 번도 기록되지 않은 값의 표시로 만났습니다. 여기서 NULL은 어떤 실제 값과도 다르게 동작합니다.

```sql theme={null}
SELECT NULL = NULL, NULL <> NULL, NULL <=> NULL, 1 <=> NULL;
```

```text theme={null}
+-------------+--------------+---------------+------------+
| NULL = NULL | NULL <> NULL | NULL <=> NULL | 1 <=> NULL |
+-------------+--------------+---------------+------------+
|        NULL |         NULL |             1 |          0 |
+-------------+--------------+---------------+------------+
1 row in set (0.00 sec)
```

기록되지 않은 값 하나가 다른 하나와 같은지 묻는 질문에는 답할 수 없으므로, `NULL = NULL`은 1이나 0이 아니라 `NULL`을 반환합니다. `NULL <> NULL`도 마찬가지입니다. 예제 1의 모든 연산자가 `NULL`에 대해 그렇게 동작합니다.

`<=>`가 예외입니다. 2개의 값을 비교해 언제나 1 또는 0을 반환하고 결코 `NULL`을 반환하지 않으며, `NULL`을 자기 자신과 같은 것으로 다룹니다.

그 결과 `= NULL`은 결코 아무것과도 일치하지 않습니다. 값이 없는 행을 찾아야 할 때는 [IS NULL](https://villagesql.com/docs/ko/tutorial/is-null.md)이 그 검사이고, 보통의 비교처럼 1 또는 0을 반환합니다.

## 요약

* 비교에서는 참이나 거짓이 아니라 `1` 또는 `0`이 돌아옵니다.
* 같음에는 `=`를, 같지 않음에는 `<>`를 사용하세요.
* `*`, `/`, `DIV`, `%`는 `+`와 `-`보다 세게 결합한다는 것을 기억하세요.
* 정수 나눗셈에는 `DIV`를, 나머지에는 `%`를 사용하세요.
* `NULL`이 관련된 모든 보통의 비교는 `NULL`을 내므로, 대신 `<=>`나 `IS NULL`을 사용하세요.

## 함께 보기

* [SELECT](https://villagesql.com/docs/ko/tutorial/select.md) — 이 표현식들이 들어가는 곳
* [열 별칭](https://villagesql.com/docs/ko/tutorial/column-aliases.md) — 비교가 만드는 열에 이름 붙이기
* [MySQL의 NULL](https://villagesql.com/docs/ko/guides/null-in-mysql.md) — 언어의 나머지 부분에서 NULL이 동작하는 방식


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.