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이 어떤 방법을 골랐는지 보여줍니다.
예제
- 값 하나와 일치
Sakila는 모든 영화에 등급을 매깁니다. 이 쿼리는 G 등급 영화를 남깁니다.
- 숫자 비교
title로도 정렬하면 동점이 깨지고, 그래서 매번 같은 5개가 돌아옵니다.
- 선택하지 않은 열로 거르기
조건은 결과가 아니라 행을 검사합니다. 여기서 rental_rate는 출력에 전혀 나타나지 않지만, 필터는 여전히 동작합니다.
- 값 하나를 제외한 모든 것
<>는 같지 않음입니다. !=도 같은 뜻이고 어느 쪽이든 괜찮습니다.
WHERE는 열 별칭을 볼 수 없습니다
별칭은 결과의 열에 붙는 이름입니다.WHERE는 결과가 존재하기 전에 실행되므로, 거기서 별칭을 쓰면 실패합니다.
ORDER BY는 별칭을 쓸 수 있는 절인데, 결과가 만들어진 뒤에 실행되기 때문입니다. ORDER BY 레슨이 그것을 보여줍니다.
일치하는 것이 없어도 오류가 아닙니다
Empty set은 쿼리가 실행되었고 어떤 행도 조건을 만족하지 않았다는 뜻입니다. 서버는 테이블 대신 그것을 출력하므로 열 제목도 없습니다. 그것도 답입니다.
요약
- 조건을 만족하는 행만 남기려면
WHERE를 쓰세요. - 문자열은 작은따옴표 안에 넣고 숫자는 그대로 두세요.
- 서버가 먼저 거르고, 그다음 정렬하고, 그다음
LIMIT을 적용한다고 예상하세요. - 선택했든 아니든 테이블의 어떤 열이든 검사하세요.
- 별칭을 쓰지 말고
WHERE에 식을 반복하세요. 별칭을 쓰면ERROR 1054가 납니다.
함께 보기
- SELECT — WHERE가 붙는 문
- 연산자 — 조건을 이루는 비교
- AND, OR, NOT — 여러 조건 결합하기
- ORDER BY — 필터에서 살아남은 것 정렬하기