> ## 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 WHERE

> MySQL WHERE 절이 원하는 행만 남기는 방식, 조건이 검사할 수 있는 열, 그리고 같은 쿼리의 열 별칭을 볼 수 없는 이유입니다.

> [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 →

`WHERE`는 조건을 만족하는 행을 남기고 나머지를 버립니다. 지금까지의 모든 레슨은 테이블 전체를 반환했습니다. 테이블을 답으로 바꾸는 절이 이것입니다.

시작하기 전에 `mysql -u root -p sakila`로 클라이언트를 여세요.

## WHERE의 동작 방식

```sql theme={null}
SELECT COLUMN_LIST
FROM TABLE_NAME
WHERE SEARCH_CONDITION;
```

`COLUMN_LIST`를 원하는 열로, `TABLE_NAME`을 테이블로, `SEARCH_CONDITION`을 서버가 한 번에 한 행에 적용할 수 있는 검사로 바꾸세요. 서버는 각 행을 읽고, 그 행의 값에 대해 조건을 평가하고, 결과가 참이면 행을 남깁니다. 거짓이나 NULL을 내는 행은 버려집니다.

`WHERE`는 `FROM` 뒤, `ORDER BY` 앞에 오고, 그것이 결과가 정의되는 순서입니다: 거르고, 살아남은 것을 정렬한 다음, `LIMIT`을 적용합니다. 따라서 `WHERE` 뒤의 `LIMIT 5`는 일치하는 행 중 5개를 주는 것이지, 일부만 일치하는 5개의 행을 주는 것이 아닙니다. 서버는 그 답에 어떤 방법으로든 도달할 수 있고, `EXPLAIN`이 어떤 방법을 골랐는지 보여줍니다.

## 예제

### 값 하나와 일치

Sakila는 모든 영화에 등급을 매깁니다. 이 쿼리는 `G` 등급 영화를 남깁니다.

```sql theme={null}
SELECT film_id, title, rating
FROM film
WHERE rating = 'G'
ORDER BY title
LIMIT 5;
```

```text theme={null}
+---------+-------------------+--------+
| film_id | title             | rating |
+---------+-------------------+--------+
|       2 | ACE GOLDFINGER    | G      |
|       4 | AFFAIR PREJUDICE  | G      |
|       5 | AFRICAN EGG       | G      |
|      11 | ALAMO VIDEOTAPE   | G      |
|      22 | AMISTAD MIDSUMMER | G      |
+---------+-------------------+--------+
5 rows in set (0.00 sec)
```

문자열은 작은따옴표 안에 넣습니다. 숫자는 그렇지 않습니다.

### 숫자 비교

```sql theme={null}
SELECT title, length
FROM film
WHERE length > 180
ORDER BY length DESC, title
LIMIT 5;
```

```text theme={null}
+----------------+--------+
| title          | length |
+----------------+--------+
| CHICAGO NORTH  |    185 |
| CONTROL ANTHEM |    185 |
| DARN FORRESTER |    185 |
| GANGS PRIDE    |    185 |
| HOME PITY      |    185 |
+----------------+--------+
5 rows in set (0.00 sec)
```

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

### 선택하지 않은 열로 거르기

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

```sql theme={null}
SELECT title
FROM film
WHERE rental_rate = 4.99
ORDER BY title
LIMIT 5;
```

```text theme={null}
+------------------+
| title            |
+------------------+
| ACE GOLDFINGER   |
| AIRPLANE SIERRA  |
| AIRPORT POLLOCK  |
| ALADDIN CALENDAR |
| ALI FOREVER      |
+------------------+
5 rows in set (0.00 sec)
```

### 값 하나를 제외한 모든 것

```sql theme={null}
SELECT title, rating
FROM film
WHERE rating <> 'G'
ORDER BY title
LIMIT 5;
```

```text theme={null}
+------------------+--------+
| title            | rating |
+------------------+--------+
| ACADEMY DINOSAUR | PG     |
| ADAPTATION HOLES | NC-17  |
| AGENT TRUMAN     | PG     |
| AIRPLANE SIERRA  | PG-13  |
| AIRPORT POLLOCK  | R      |
+------------------+--------+
5 rows in set (0.00 sec)
```

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

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

별칭은 결과의 열에 붙는 이름입니다. `WHERE`는 결과가 존재하기 전에 실행되므로, 거기서 별칭을 쓰면 실패합니다.

```sql theme={null}
SELECT title, rental_rate * 2 AS double_rate
FROM film
WHERE double_rate > 8
ORDER BY title;
```

```text theme={null}
ERROR 1054 (42S22): Unknown column 'double_rate' in 'where clause'
```

대신 조건에 식을 다시 쓰세요.

```sql theme={null}
SELECT title, rental_rate * 2 AS double_rate
FROM film
WHERE rental_rate * 2 > 8
ORDER BY title
LIMIT 5;
```

```text theme={null}
+------------------+-------------+
| title            | double_rate |
+------------------+-------------+
| ACE GOLDFINGER   |        9.98 |
| AIRPLANE SIERRA  |        9.98 |
| AIRPORT POLLOCK  |        9.98 |
| ALADDIN CALENDAR |        9.98 |
| ALI FOREVER      |        9.98 |
+------------------+-------------+
5 rows in set (0.00 sec)
```

`ORDER BY`는 별칭을 쓸 수 있는 절인데, 결과가 만들어진 뒤에 실행되기 때문입니다. [ORDER BY](https://villagesql.com/docs/ko/tutorial/order-by.md) 레슨이 그것을 보여줍니다.

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

```sql theme={null}
SELECT title FROM film WHERE rating = 'X';
```

```text theme={null}
Empty set (0.00 sec)
```

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

## 요약

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

## 함께 보기

* [SELECT](https://villagesql.com/docs/ko/tutorial/select.md) — WHERE가 붙는 문
* [연산자](https://villagesql.com/docs/ko/tutorial/operators.md) — 조건을 이루는 비교
* [AND, OR, NOT](https://villagesql.com/docs/ko/tutorial/and-or-not.md) — 여러 조건 결합하기
* [ORDER BY](https://villagesql.com/docs/ko/tutorial/order-by.md) — 필터에서 살아남은 것 정렬하기


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