메인 콘텐츠로 건너뛰기

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

All examples on this page work on VillageSQL. Install Now →
WHERE는 조건을 만족하는 행을 남기고 나머지를 버립니다. 지금까지의 모든 레슨은 테이블 전체를 반환했습니다. 테이블을 답으로 바꾸는 절이 이것입니다. 시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.

WHERE의 동작 방식

COLUMN_LIST를 원하는 열로, TABLE_NAME을 테이블로, SEARCH_CONDITION을 서버가 한 번에 한 행에 적용할 수 있는 검사로 바꾸세요. 서버는 각 행을 읽고, 그 행의 값에 대해 조건을 평가하고, 결과가 참이면 행을 남깁니다. 거짓이나 NULL을 내는 행은 버려집니다. WHERE는 FROM 뒤, ORDER BY 앞에 오고, 그것이 결과가 정의되는 순서입니다: 거르고, 살아남은 것을 정렬한 다음, LIMIT을 적용합니다. 따라서 WHERE 뒤의 LIMIT 5는 일치하는 행 중 5개를 주는 것이지, 일부만 일치하는 5개의 행을 주는 것이 아닙니다. 서버는 그 답에 어떤 방법으로든 도달할 수 있고, EXPLAIN이 어떤 방법을 골랐는지 보여줍니다.

예제

  1. 값 하나와 일치

Sakila는 모든 영화에 등급을 매깁니다. 이 쿼리는 G 등급 영화를 남깁니다.
문자열은 작은따옴표 안에 넣습니다. 숫자는 그렇지 않습니다.

  1. 숫자 비교

185분은 카탈로그에서 가장 긴 영화이고 10편의 영화가 그 길이이므로, 처음 5개의 행은 모두 동점입니다. title로도 정렬하면 동점이 깨지고, 그래서 매번 같은 5개가 돌아옵니다.

  1. 선택하지 않은 열로 거르기

조건은 결과가 아니라 행을 검사합니다. 여기서 rental_rate는 출력에 전혀 나타나지 않지만, 필터는 여전히 동작합니다.

  1. 값 하나를 제외한 모든 것

<>는 같지 않음입니다. !=도 같은 뜻이고 어느 쪽이든 괜찮습니다.

WHERE는 열 별칭을 볼 수 없습니다

별칭은 결과의 열에 붙는 이름입니다. WHERE는 결과가 존재하기 전에 실행되므로, 거기서 별칭을 쓰면 실패합니다.
대신 조건에 식을 다시 쓰세요.
ORDER BY는 별칭을 쓸 수 있는 절인데, 결과가 만들어진 뒤에 실행되기 때문입니다. ORDER BY 레슨이 그것을 보여줍니다.

일치하는 것이 없어도 오류가 아닙니다

Empty set은 쿼리가 실행되었고 어떤 행도 조건을 만족하지 않았다는 뜻입니다. 서버는 테이블 대신 그것을 출력하므로 열 제목도 없습니다. 그것도 답입니다.

요약

  • 조건을 만족하는 행만 남기려면 WHERE를 쓰세요.
  • 문자열은 작은따옴표 안에 넣고 숫자는 그대로 두세요.
  • 서버가 먼저 거르고, 그다음 정렬하고, 그다음 LIMIT을 적용한다고 예상하세요.
  • 선택했든 아니든 테이블의 어떤 열이든 검사하세요.
  • 별칭을 쓰지 말고 WHERE에 식을 반복하세요. 별칭을 쓰면 ERROR 1054가 납니다.

함께 보기