> ## 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 が選択リストで使う比較演算子と算術演算子、比較が返すもの、どの演算子がより強く結合するか、そして 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 →

演算子は値を組み合わせて新しい値を作ります。1 つは既に使いました。
`rental_rate * 1.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 行を返すので、演算子を試す最も
手早い方法になります。

## 例

### 比較は 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)
```

等価は `=` 1 つであり、多くのプログラミング言語が使う `==` の 2 つ重ねでは
ありません。`<>` と `!=` はどちらも「等しくない」を意味し、まったく同じに
振る舞います。このチュートリアルでは `<>` と書きます。

### 算術と、どの演算子がより強く結合するか

```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` には、一度も記録されなかった値を示す印としてソートのレッスンで
出会いました。ここでは、どの実際の値とも違う振る舞いをします。

```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/ja/tutorial/is-null.md) がそのテストであり、
普通の比較と同じように 1 か 0 を返します。

## まとめ

* 比較からは true や false ではなく `1` か `0` が返ります。
* 等価には `=` を、不等には `<>` を使います。
* `*`、`/`、`DIV`、`%` は `+` と `-` より強く結合することを覚えておきます。
* 整数除算には `DIV` を、余りには `%` を使います。
* `NULL` を含む普通の比較からは `NULL` が返るので、代わりに `<=>` か `IS NULL` を使います。

## 関連項目

* [SELECT](https://villagesql.com/docs/ja/tutorial/select.md) — これらの式を置く場所
* [列のエイリアス](https://villagesql.com/docs/ja/tutorial/column-aliases.md) — 比較が生成する列に名前を付ける
* [MySQL における NULL](https://villagesql.com/docs/ja/guides/null-in-mysql.md) — 言語の他の部分での NULL の振る舞い


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