메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
=는 값을 1개의 값과 비교합니다. ANY와 ALL은 서브쿼리 결과 전체 앞에 비교를 놓습니다: 그중 어느 하나보다 큰지, 그 모두보다 큰지. 직접 쓰기보다는 다른 사람의 쿼리에서 더 자주 만나게 되므로, 이 레슨에서 얻어 갈 것은 그것을 읽을 수 있게 되는 것입니다. 시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.

ANY와 ALL의 동작 방식

COLUMN_LIST를 원하는 열로, TABLE_NAME을 테이블로, COLUMN_NAME을 검사할 열로, OTHER_TABLE을 서브쿼리가 읽는 테이블로 바꾸세요. >는 어떤 비교 연산자로든 바꿀 수 있습니다. ANY는 반환된 행 중 적어도 1개에 대해 비교가 성립할 때 참입니다. ALL은 모든 행에 대해 성립할 때 참입니다. SOME은 ANY의 다른 표기이고 정확히 같은 뜻입니다. 서브쿼리 안의 NULL 때문에 답이 정해지지 않으면, 둘 다 참이나 거짓이 아니라 NULL을 주는데, NULL과의 다른 모든 비교와 같은 방식이며, 그러면 WHERE가 그 행을 버립니다. 평범한 말로 읽으세요: > ANY는 “그중 적어도 하나보다 크다”이고, 이것은 가장 작은 것보다 크다는 뜻과 같습니다. > ALL은 “그 모두보다 크다”이고, 가장 큰 것보다 크다는 뜻과 같습니다.

예제

  1. 적어도 하나보다 큰

가장 짧은 G 영화가 47분이므로, 48분 이상인 모든 영화가 해당합니다.

  1. 모두보다 큰

행이 없고, 그것이 올바른 답입니다. 가장 긴 G 영화는 185분인데, 이것은 카탈로그에서 가장 긴 영화이기도 하므로, 그 모두보다 긴 것은 없습니다.

  1. = ANY는 IN입니다

= ANY와 IN은 같은 연산자를 2가지로 쓴 것이고, 사람들이 더 빨리 읽는 쪽은 IN입니다. 마찬가지로 <> ALL은 NOT IN이며, 그 레슨이 설명하는 NULL 함정도 같습니다.

빈 서브쿼리는 둘을 뒤집습니다

이것이 알아 둘 만한 부분인데, 잘못된 것처럼 보이기 때문입니다.
X 등급 영화는 없으므로 서브쿼리는 아무것도 반환하지 않고, 모든 영화가 돌아옵니다. 빈 집합에 대한 ALL은 참입니다: 검사에 실패하는 행이 없기 때문입니다. 빈 집합에 대한 ANY는 정반대의 이유로 거짓이므로, 같은 쿼리를 ANY로 쓰면 아무것도 반환하지 않습니다. 따라서 서브쿼리의 오타는 ALL에서는 테이블 전체를, ANY에서는 빈 결과를 주며, 두 경우 모두 오류가 없습니다.

요약

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

함께 보기

  • IN — 같은 검사를, 대부분의 사람이 쓰는 방식으로 쓴 것
  • 서브쿼리 — 이 연산자들이 비교 대상으로 삼는 쿼리
  • EXISTS — 값을 비교하는 대신 행이 있는지 검사하기