Delete (SQL)
1. 개요
DELETE (SQL)는 SQL에서 테이블의 데이터를 삭제하는 데 사용되는 명령어이다. DELETE 문은 `DELETE FROM 테이블 이름 [WHERE 조건]` 형식을 따르며, WHERE 절에 맞는 행을 삭제한다. WHERE 절이 생략되면 테이블의 모든 행이 삭제된다. DELETE는 DML(데이터 조작 언어) 명령이므로, 트랜잭션 제어가 가능하며, 다른 테이블을 참조해야 하는 경우 서브 쿼리, USING 또는 FROM 절을 사용할 수 있다. 일반적으로 TRUNCATE TABLE보다 느리게 작동하며, 데이터베이스 트리거가 발생할 수 있다.
| 종류 | 데이터베이스 |
|---|---|
| 하위 종류 | 데이터 조작 언어 |
| 의미 | 테이블에서 행을 제거 |
|---|---|
| 관련 명령 | SELECT INSERT UPDATE |
| SQL 표준 버전 | SQL:2003 이후 |
|---|
| 기본 구문 | DELETE FROM 테이블_이름 WHERE 조건; |
|---|---|
| 설명 | 테이블에서 조건을 만족하는 행을 삭제함. 조건이 생략되면 모든 행이 삭제됨. |
| 예시 | DELETE FROM 직원들 WHERE 부서 = '마케팅'; |
| 추가 구문 | DELETE FROM 테이블_이름; |
| 설명 | 테이블의 모든 행을 삭제함. 테이블 구조는 유지됨. |
| 주의 | "TRUNCATE TABLE 테이블_이름;" 명령은 DELETE보다 빠르지만, 롤백이 불가능함. |
| 지원 시스템 | MariaDB MySQL 오라클 PostgreSQL SQLite SQL 서버 |
|---|
-
SQL 키워드 -
TRUNCATE (SQL)
TRUNCATE는 SQL에서 테이블 내의 모든 데이터를 빠르게 삭제하는 명령어로, 외래 키 제약 조건 무시, 테이블 잠금 방식, 트랜잭션 처리 방식 등 DELETE 명령어와 차이를 보이며, WHERE 절을 사용할 수 없어 테이블의 모든 행을 삭제하고, 일부 데이터베이스 시스템에서는 롤백이 불가능할 수 있다. -
SQL 키워드 -
Null (SQL)
Null은 SQL에서 데이터베이스 테이블 열의 값 부재를 나타내는 특별한 표식으로, 0이나 빈 문자열과 구별되며 삼진 논리와 관련된 특별한 처리 방식으로 인해 데이터베이스 설계 및 쿼리 작성 시 주의가 필요하고 SQL 표준 구현에 대한 논쟁이 존재한다.
2. 사용법
DELETE 문의 기본 구문은 다음과 같다.
DELETE FROM 기본 테이블 [WHERE 조건식]
WHERE 절을 사용하여 삭제할 행을 특정 조건으로 제한할 수 있다. WHERE 절을 생략하면 테이블의 모든 행이 삭제된다. DELETE 문은 결과 집합을 반환하지 않는다.
DELETE 문 실행은 다른 테이블에 대한 삭제를 유발하는 트리거를 발생시킬 수 있다. 예를 들어, 외래 키로 연결된 두 테이블에서 참조되는 테이블의 행이 삭제되면, 참조 무결성을 유지하기 위해 참조하는 테이블의 해당 행도 함께 삭제될 수 있다. (Cascading constraints영어 참고)
DELETE 시에 삭제 대상 외의 테이블을 참조하는 경우에는 서브 쿼리를 사용할 필요가 있지만, 데이터베이스에 따라 USING 또는 추가적인 FROM 절을 통해 테이블 참조를 추가할 수 있는 경우도 있다.
DELETE FROM 기본 테이블 USING 보조 테이블 WHERE 기본 테이블.열 = 보조 테이블.열 ...
DELETE 문을 실행했을 때, 데이터베이스 트리거를 설정함으로써 다른 테이블도 함께 삭제할 수 있다. 예를 들어, 두 개의 테이블이 외래 키로 연결되어 있을 때, 한 테이블의 특정 행이 삭제되면 삭제된 행과 연결된 다른 테이블의 행도 트리거에 의해 자동으로 삭제되어 참조 무결성을 유지할 수 있다.
3. 예제
sql
DELETE FROM pies WHERE flavor='Lemon Meringue';
```
`pies` 테이블에서 `flavor` 열의 값이 'Lemon Meringue'인 행을 삭제한다.
```sql
DELETE FROM trees WHERE height < 80;
```
`trees` 테이블에서 `height` 열의 값이 80보다 작은 행을 삭제한다.
```sql
DELETE FROM mytable;
```
`mytable` 테이블의 모든 행을 삭제한다.
```sql
DELETE FROM mytable WHERE id IN (SELECT id FROM mytable2);
```
`mytable` 테이블에서 `id`가 `mytable2` 테이블에 존재하는 행을 서브쿼리를 사용하여 삭제한다.
```sql
DELETE FROM mytable WHERE id IN (value1, value2, value3, value4, value5);
```
`mytable` 테이블에서 `id`가 `value1`, `value2`, `value3`, `value4`, `value5` 값 중 하나와 일치하는 행을 삭제한다.
4. 연관 테이블을 사용한 예제
사람과 주소를 나타내는 간단한 데이터베이스가 있다고 가정해 보자. 여러 사람이 특정 주소에 살 수 있으며, 한 사람은 여러 주소에 살 수 있다. 이는 다대다 관계의 예시이다. 데이터베이스는 person(사람), address(주소), pa 세 개의 테이블로 구성되어 있다.
| pid | name (이름) |
|---|---|
| 1 | Joe (조) |
| 2 | Bob (밥) |
| 3 | Ann (앤) |
| aid | description (설명) |
|---|---|
| 100 | 2001 Main St. (메인 스트리트 2001) |
| 200 | 35 Pico Blvd. (피코 대로 35) |
| pid | aid |
|---|---|
| 1 | 100 |
| 2 | 100 |
| 3 | 100 |
| 1 | 200 |
pa 테이블은 person(사람) 테이블과 address(주소) 테이블을 연결하여 Joe (조), Bob (밥), Ann (앤)이 모두 메인 스트리트 2001에 살고, Joe (조)는 피코 대로에도 거주하고 있음을 보여준다.
Joe (조)를 데이터베이스에서 제거하려면 다음 두 개의 DELETE (삭제) 명령을 실행해야 한다.
```sql
DELETE FROM person WHERE pid=1;
DELETE FROM pa WHERE pid=1;
```
참조 무결성을 유지하기 위해 Joe (조)의 레코드는 person(사람)과 pa에서 모두 제거해야 한다. 데이터베이스는 트리거를 설정하여 person(사람)에서 행이 삭제될 때마다 연결된 행이 pa에서 삭제되도록 할 수 있다. 그러면 첫 번째 문장:
```sql
DELETE FROM person WHERE pid=1;
```
은 두 번째 문장을 자동으로 트리거한다.
```sql
DELETE FROM pa WHERE pid=1;
```
5. 특징
DELETE 문은 DML(데이터 조작 언어) 명령이므로, `COMMIT` 및 `ROLLBACK` 명령을 사용하여 트랜잭션을 제어할 수 있다. `WHERE` 절을 사용하여 삭제할 레코드를 제한할 수 있으며, `WHERE` 절을 생략하면 테이블의 모든 행을 삭제한다.
DELETE 문은 다음과 같은 특징을 가진다.
* 테이블의 데이터가 차지하는 공간(TABLESPACE)을 즉시 해제하지 않는다.
* 테이블에 할당된 SEQUENCE 값을 재설정하지 않는다.
* 일반적으로 `TRUNCATE` 문보다 느리게 작동한다.
* `ROLLBACK` 명령을 사용하여 레코드 삭제 작업을 취소할 수 있다.
* 공유 테이블 잠금을 필요로 한다.
* 트리거가 작동한다.
* 데이터베이스 링크와 함께 사용할 수 있다.
* 삭제된 레코드 수를 반환한다.
* `TRUNCATE` 문보다 더 많은 트랜잭션 공간을 사용하고, 더 많은 redo와 undo를 생성한다.
* 인덱싱된 뷰와 함께 사용할 수 있다.
* DELETE 작업은 사용할 수 없는 인덱스를 다시 사용할 수 있게 만들지 않는다.
* 실행 시 성능 저하를 유발할 수 있다. (삭제를 위해 테이블의 각 레코드가 잠기기 때문)
* 트랜잭션 로그를 사용하여 레코드를 읽고, 제약 조건을 확인하고, 블록을 업데이트하고, 인덱스를 업데이트하고, redo/undo를 생성한다. 이러한 모든 작업에는 시간이 걸리므로 `TRUNCATE`보다 훨씬 더 오래 걸린다.
DELETE 문을 실행하면 다른 테이블을 삭제하도록 실행하는 트리거가 발생할 수 있다. 예를 들어, 두 테이블이 외래 키로 연결되어 있고 행이 참조된 테이블에서 삭제되면, 참조 무결성을 유지하기 위해 참조하는 테이블에서도 공통적으로 삭제가 이루어진다.
6. 성능
일반적으로 모든 행을 삭제하는 경우에는 DELETE보다 TRUNCATE TABLE 문이 더 빠르게 처리할 수 있다.
7. 관련 명령어
`TRUNCATE TABLE` 명령어는 테이블의 모든 행을 삭제하며, DBMS에 따라 메타데이터만 변경하기 때문에 `DELETE`보다 훨씬 빠르게 작동한다. 이는 `TRUNCATE TABLE`이 일반적으로 제약 조건을 적용하거나 트리거를 실행하는 데 시간을 쓰지 않기 때문이다.
DROP 명령어는 테이블 전체를 삭제하는 데 사용된다.
8. 추가적인 정보 (일본어판 참고)
DELETE 실행 시, 삭제 대상 외 테이블을 참조해야 한다면 서브 쿼리를 사용할 필요가 있다. 하지만, 데이터베이스에 따라 USING 또는 추가적인 FROM 절을 통해 테이블 참조를 추가할 수 있는 경우도 있다.
DELETE 문을 실행했을 때, 데이터베이스 트리거를 설정함으로써 다른 테이블도 함께 삭제할 수 있다. 예를 들어, 두 개의 테이블이 외래 키로 연결되어 있을 때, 한 테이블의 특정 행이 삭제되면 삭제된 행과 연결된 다른 테이블의 행도 트리거에 의해 자동으로 삭제되어 참조 무결성을 유지할 수 있다.