> ## 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 の ANY と ALL

> MySQL の ANY 演算子と ALL 演算子が、値をサブクエリの返すすべての行と比較する仕組み、それぞれの意味、およびサブクエリが空のときに両者が返すもの。

> [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 つの値と比較します。`ANY` と `ALL` は、比較をサブクエリの結果全体の
前に置きます。そのどれかより大きい、そのすべてより大きい、という具合です。
自分で書くより他人のクエリで出会うことのほうが多いので、このレッスンで身に
付けるべきは、それを読めるようになることです。

始める前に `mysql -u root -p sakila` でクライアントを開いてください。

## ANY と ALL の仕組み

```sql theme={null}
SELECT COLUMN_LIST
FROM TABLE_NAME
WHERE COLUMN_NAME > ALL (SELECT COLUMN_NAME FROM OTHER_TABLE);
```

`COLUMN_LIST` を必要な列に、`TABLE_NAME` をテーブルに、`COLUMN_NAME` をテスト
する列に、`OTHER_TABLE` をサブクエリが読むテーブルに置き換えます。`>` は任意の
比較演算子に置き換えられます。

`ANY` は、返された行の少なくとも 1 つに対して比較が成り立つとき真になります。
`ALL` は、すべての行に対して成り立つとき真になります。`SOME` は `ANY` の別の
書き方で、意味はまったく同じです。

サブクエリ内の NULL のせいで答えが決まらない場合、どちらも真や偽ではなく
NULL を返します。NULL に対する他の比較と同じで、`WHERE` はその行を除外します。

そのまま読んでください。`> ANY` は「少なくとも 1 つより大きい」で、最小値より
大きいのと同じです。`> ALL` は「すべてより大きい」で、最大値より大きいのと
同じです。

## 例

### 少なくとも 1 つより大きい

```sql theme={null}
SELECT title, length
FROM film
WHERE length > ANY (SELECT length FROM film WHERE rating = 'G')
ORDER BY length, title
LIMIT 3;
```

```text theme={null}
+---------------------+--------+
| title               | length |
+---------------------+--------+
| ACE GOLDFINGER      |     48 |
| HEAVEN FREEDOM      |     48 |
| MIDSUMMER GROUNDHOG |     48 |
+---------------------+--------+
3 rows in set (0.00 sec)
```

最も短い `G` の映画は 47 分なので、48 分以上のすべての映画が該当します。

### すべてより大きい

```sql theme={null}
SELECT title, length
FROM film
WHERE length > ALL (SELECT length FROM film WHERE rating = 'G')
ORDER BY title;
```

```text theme={null}
Empty set (0.01 sec)
```

行はなく、それが正しい答えです。最も長い `G` の映画は 185 分で、これは
カタログ全体でも最長なので、そのすべてより長いものはありません。

### = ANY は IN

```sql theme={null}
SELECT title FROM film WHERE rating = ANY (SELECT rating FROM film WHERE title = 'ACADEMY DINOSAUR') ORDER BY title LIMIT 3;
```

```text theme={null}
+------------------+
| title            |
+------------------+
| ACADEMY DINOSAUR |
| AGENT TRUMAN     |
| ALASKA PHANTOM   |
+------------------+
3 rows in set (0.00 sec)
```

`= ANY` と [IN](https://villagesql.com/docs/ja/tutorial/in.md) は同じ演算子を 2 通りに書いたもので、`IN` の
ほうが速く読めます。同様に `<> ALL` は `NOT IN` であり、そのレッスンで説明する
NULL の罠も同じです。

## 空のサブクエリは結果を反転させる

これは知っておく価値のある部分です。間違っているように見えるからです。

```sql theme={null}
SELECT title, length
FROM film
WHERE length > ALL (SELECT length FROM film WHERE rating = 'X')
ORDER BY title
LIMIT 3;
```

```text theme={null}
+------------------+--------+
| title            | length |
+------------------+--------+
| ACADEMY DINOSAUR |     86 |
| ACE GOLDFINGER   |     48 |
| ADAPTATION HOLES |     50 |
+------------------+--------+
3 rows in set (0.00 sec)
```

レーティング `X` の映画はないため、サブクエリは何も返さず、すべての映画が
返ります。空集合に対する `ALL` は真です。テストに失敗する行が 1 つもないから
です。空集合に対する `ANY` は、その裏返しの理由で偽なので、同じクエリを `ANY`
で書くと何も返りません。

したがって、サブクエリの入力ミスは、`ALL` ではテーブル全体を、`ANY` では空の
結果を返し、どちらの場合もエラーは出ません。

## まとめ

* `> ANY` は最小値より大きい、`> ALL` は最大値より大きい、と読んでください。
* `SOME` は `ANY` の別の書き方と読んでください。
* 速く読めるため、`= ANY` より `IN` を、`<> ALL` より `NOT IN` を使ってください。
* サブクエリが何も返さないとき、`ALL` は真、`ANY` は偽になると考えてください。
* サブクエリ内の NULL のせいで答えが決まらないとき、真や偽ではなく NULL になると考えてください。

## 関連項目

* [IN](https://villagesql.com/docs/ja/tutorial/in.md) — 同じテストを、ほとんどの人が書く形で書いたもの
* [サブクエリ](https://villagesql.com/docs/ja/tutorial/subqueries.md) — これらの演算子が比較対象とするクエリ
* [EXISTS](https://villagesql.com/docs/ja/tutorial/exists.md) — 値を比較するのではなく、行の有無をテストする


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