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

> MySQL DELETE 문이 행을 제거하는 방법, WHERE를 먼저 SELECT로 실행해야 하는 이유, 그리고 DELETE와 TRUNCATE TABLE의 차이입니다.

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

`DELETE`는 행 전체를 제거합니다. [트랜잭션](https://villagesql.com/docs/ko/tutorial/transactions.md) 밖에서는 되돌리기가 없으므로, 들일 만한 습관은 `WHERE`를 먼저 쓰고 그것이 무엇을 선택하는지 보는 것입니다.

이 예제들은 [INSERT](https://villagesql.com/docs/ko/tutorial/insert.md)의 `sakila_practice` 데이터베이스를 사용합니다. 시작하기 전에 그곳의 설정 블록을 다시 실행한 다음, `mysql -u root -p sakila_practice`로 클라이언트를 여세요.

## DELETE의 동작 방식

```sql theme={null}
DELETE FROM TABLE_NAME
WHERE CONDITION;
```

`TABLE_NAME`을 테이블로, `CONDITION`을 제거할 행을 고르는 검사로 바꾸세요.

열 목록은 없습니다. `DELETE`는 행 전체를 제거하므로, 열 1개를 비우는 것은 그것을 NULL로 설정하는 [UPDATE](https://villagesql.com/docs/ko/tutorial/update.md)입니다.

## 예제

### 먼저 보고, 그다음 삭제하기

`WHERE`를 `SELECT`로 쓰고 곧 잃게 될 행을 읽으세요.

```sql theme={null}
SELECT member_id, first_name, last_name FROM member WHERE active = 0;
```

```text theme={null}
+-----------+------------+-----------+
| member_id | first_name | last_name |
+-----------+------------+-----------+
|         3 | Linda      | Williams  |
+-----------+------------+-----------+
1 row in set (0.00 sec)
```

행 하나이고, 의도한 바로 그 행입니다. 이제 문장의 앞부분만 바꾸고 `WHERE`는 그대로 두세요.

```sql theme={null}
DELETE FROM member WHERE active = 0;
```

```text theme={null}
Query OK, 1 row affected (0.00 sec)
```

```sql theme={null}
SELECT member_id, first_name, last_name, active FROM member;
```

```text theme={null}
+-----------+------------+-----------+--------+
| member_id | first_name | last_name | active |
+-----------+------------+-----------+--------+
|         1 | Mary       | Smith     |      1 |
|         2 | Patricia   | Johnson   |      1 |
+-----------+------------+-----------+--------+
2 rows in set (0.00 sec)
```

`DELETE`는 영향받은 행 수만 보고하고 그 밖에는 아무것도 보고하지 않습니다. `UPDATE`는 `Rows matched`와 `Changed`가 있는 두 번째 줄을 출력하지만, `DELETE`에는 그에 해당하는 것이 없습니다.

### 아무것과도 일치하지 않는 WHERE는 오류가 아닙니다

```sql theme={null}
DELETE FROM member WHERE member_id = 99;
```

```text theme={null}
Query OK, 0 rows affected (0.00 sec)
```

아무것도 잘못되지 않았고 아무 일도 일어나지 않았습니다. 동작할 것으로 예상한 삭제 뒤의 `0 rows affected`는 `WHERE`가 틀렸다는 뜻이고, 문장은 그렇다고 말해 주지 않습니다.

## WHERE가 없으면 테이블을 비웁니다

```sql theme={null}
DELETE FROM member;
```

```text theme={null}
Query OK, 2 rows affected (0.00 sec)
```

```sql theme={null}
SELECT COUNT(*) AS members FROM member;
```

```text theme={null}
+---------+
| members |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)
```

안전 업데이트 모드는 이 형태를 거부하는데, `WHERE`에 키가 없는 `UPDATE`를 거부하는 것과 정확히 같습니다. [UPDATE](https://villagesql.com/docs/ko/tutorial/update.md)가 그것이 내는 `ERROR 1175`를 보여 주고, `mysql -u root -p --safe-updates sakila_practice`가 세션 전체에 대해 그것을 켭니다.

## TRUNCATE는 다르게 비웁니다

테이블이 비어 있으므로, 행을 하나 삽입하고 그 id를 보세요.

```sql theme={null}
INSERT INTO member (first_name, last_name, joined) VALUES ('Sam', 'Reed', '2026-06-01');
```

```text theme={null}
Query OK, 1 row affected (0.00 sec)
```

```sql theme={null}
SELECT member_id, first_name FROM member;
```

```text theme={null}
+-----------+------------+
| member_id | first_name |
+-----------+------------+
|         4 | Sam        |
+-----------+------------+
1 row in set (0.00 sec)
```

카운터는 `DELETE`가 제거한 행에서 이어졌습니다. `TRUNCATE TABLE`은 그렇지 않습니다.

```sql theme={null}
TRUNCATE TABLE member;
```

```text theme={null}
Query OK, 0 rows affected (0.00 sec)
```

```sql theme={null}
INSERT INTO member (first_name, last_name, joined) VALUES ('Sam', 'Reed', '2026-06-01');
```

```text theme={null}
Query OK, 1 row affected (0.00 sec)
```

```sql theme={null}
SELECT member_id, first_name FROM member;
```

```text theme={null}
+-----------+------------+
| member_id | first_name |
+-----------+------------+
|         1 | Sam        |
+-----------+------------+
1 row in set (0.00 sec)
```

`TRUNCATE`는 테이블을 삭제하고 빈 테이블을 만들며, 그래서 몇 개의 행을 제거했든 `0 rows affected`를 보고하고 카운터가 처음부터 다시 시작합니다. `WHERE`를 받지 않고, 롤백할 수 없으며, `DELETE` 트리거를 실행하지 않습니다. 테이블을 빈 상태로 되돌리려면 `TRUNCATE`를, 그 밖의 모든 경우에는 `DELETE`를 사용하세요.

## 요약

* `DELETE FROM table WHERE condition`으로 쓰고, `WHERE`를 먼저 `SELECT`로 실행하세요.
* 행 수만 나오고 `Rows matched` 줄은 없다고 예상하세요.
* `0 rows affected`는 실패가 아니라 아무것도 찾지 못한 `WHERE`로 읽으세요.
* `WHERE`를 빼면 확인 단계 없이 테이블이 비워집니다.
* 테이블을 비우고 초기화하려면 되돌릴 수 없다는 점을 알고 `TRUNCATE TABLE`을 사용하세요.

## 함께 보기

* [UPDATE](https://villagesql.com/docs/ko/tutorial/update.md) — 행 변경과 안전 업데이트 보호 장치
* [WHERE](https://villagesql.com/docs/ko/tutorial/where.md) — 어떤 행이 사라질지 결정하는 절
* [트랜잭션](https://villagesql.com/docs/ko/tutorial/transactions.md) — DELETE를 되돌리는 유일한 방법
* [MySQL의 소프트 삭제](https://villagesql.com/docs/ko/guides/soft-deletes.md) — 행을 제거하는 대신 사라진 것으로 표시하기


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