> ## 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`는 "그중 적어도 하나보다 크다"이고, 이것은 가장 작은 것보다 크다는 뜻과 같습니다. `> ALL`은 "그 모두보다 크다"이고, 가장 큰 것보다 크다는 뜻과 같습니다.

## 예제

### 적어도 하나보다 큰

```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/ko/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`은 참입니다: 검사에 실패하는 행이 없기 때문입니다. 빈 집합에 대한 `ANY`는 정반대의 이유로 거짓이므로, 같은 쿼리를 `ANY`로 쓰면 아무것도 반환하지 않습니다.

따라서 서브쿼리의 오타는 `ALL`에서는 테이블 전체를, `ANY`에서는 빈 결과를 주며, 두 경우 모두 오류가 없습니다.

## 요약

* `> ANY`는 가장 작은 것보다 큰 것으로, `> ALL`은 가장 큰 것보다 큰 것으로 읽으세요.
* `SOME`은 `ANY`의 다른 표기로 읽으세요.
* 더 빨리 읽히므로 `= ANY`보다 `IN`을, `<> ALL`보다 `NOT IN`을 쓰세요.
* 서브쿼리가 아무것도 반환하지 않으면 `ALL`은 참, `ANY`는 거짓이라고 예상하세요.
* 서브쿼리 안의 NULL 때문에 답이 정해지지 않으면 참이나 거짓이 아니라 NULL을 준다고 예상하세요.

## 함께 보기

* [IN](https://villagesql.com/docs/ko/tutorial/in.md) — 같은 검사를, 대부분의 사람이 쓰는 방식으로 쓴 것
* [서브쿼리](https://villagesql.com/docs/ko/tutorial/subqueries.md) — 이 연산자들이 비교 대상으로 삼는 쿼리
* [EXISTS](https://villagesql.com/docs/ko/tutorial/exists.md) — 값을 비교하는 대신 행이 있는지 검사하기


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