메인 콘텐츠로 건너뛰기

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

All examples on this page work on VillageSQL. Install Now →
IN은 열 하나를 여러 값과 한 번에 비교합니다. OR을 이어 쓴 것과 같은 뜻을 절 하나로 말하며, 필터의 값이 2개를 넘어가면 대부분의 사람이 손을 뻗는 절입니다. 시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.

IN의 동작 방식

COLUMN_NAME을 검사할 열로, FIRST_VALUE와 SECOND_VALUE를 받아들일 값으로 바꾸세요. 조건은 열이 괄호 안의 어느 값과든 같을 때 참입니다. 값은 쉼표로 구분하고, 필요한 만큼 많이 쓰세요. x IN (a, b)는 x = a OR x = b와 같은 뜻입니다. 더 읽기 좋은 쪽으로 쓰되, 값이 2개를 넘으면 IN이 더 읽기 좋습니다.

예제

  1. 여러 값 중 하나와 일치

  1. 어느 것과도 일치하지 않음

  1. 숫자 목록

숫자에는 따옴표를 쓰지 않습니다. 행이 actor_id 순서로 돌아온 것은 ORDER BY가 그렇게 요청했기 때문이지, 목록이 그 순서라서가 아닙니다.

  1. 서버가 스스로 계산하는 목록

괄호 안에는 목록 대신 쿼리가 들어갈 수 있습니다. film_actor는 각 영화를 그 영화에 나오는 각 배우와 짝지은 테이블이므로, 여러분이 영화 id를 하나도 몰라도 이 쿼리는 배우 1이 출연한 영화를 요청합니다.
다른 쿼리 안에 쓴 쿼리가 서브쿼리입니다. 뒤의 섹션이 서브쿼리를 제대로 다룹니다. 여기서 하나를 미리 만나 둘 만한데, 대부분의 사람이 처음 서브쿼리를 쓰는 곳이 IN 목록이기 때문입니다.

목록의 NULL은 NOT IN을 망가뜨립니다

IN과 NOT IN은 목록의 NULL을 같은 방식으로 다루지 않고, 어느 쪽도 경고하지 않습니다. IN에서는 목록의 NULL이 무해합니다. 실제 값과 일치하는 행은 그대로 남습니다.
NOT IN에서는 같은 목록이 아무것도 반환하지 않습니다.
모든 영화에 등급이 있고 그중 822개는 G 등급이 아니므로, 빈 결과는 뜻밖입니다. 이유는 NOT IN이 열이 목록의 모든 값과 다른지 묻는데, 어떤 것도 NULL과 다르다고 보일 수 없기 때문입니다. 무엇이든 NULL과 비교하면 참이나 거짓이 아니라 NULL이 나오므로, 조건 전체가 결코 참이 되지 않고 어떤 행도 살아남지 못합니다. 이것은 목록이 서브쿼리일 때 가장 중요한데, 직접 손으로 쓰지 않은 서브쿼리는 예상하지 못한 NULL을 반환할 수 있기 때문입니다. 가능하다면 서브쿼리 안에 WHERE COLUMN_NAME IS NOT NULL을 추가하세요. IS NULL 수업이 NULL이 어떻게 비교되는지 다룹니다.

요약

  • 열 하나를 값 목록과 절 하나로 비교하려면 IN을 사용하세요.
  • x IN (a, b)는 x = a OR x = b로 읽으세요.
  • 목록의 문자열은 따옴표로 감싸고 숫자는 그대로 두세요.
  • 목록 자체가 하나의 답일 때는 괄호 안에 서브쿼리를 넣으세요.
  • NOT IN 목록에는 NULL을 넣지 마세요. 어떤 행도 반환하지 않게 됩니다.

함께 보기

  • AND, OR, NOT — IN이 대체하는 OR 연결
  • IS NULL — NULL과의 비교가 참도 거짓도 아닌 이유
  • BETWEEN — 목록이 아니라 범위 검사
  • 서브쿼리 — 예제 4에서 쓴 쿼리 형태