본문 바로가기
WIKI 기술 지식 베이스

DELETE

원문 보기 위키 갱신

DELETE 문은 테이블에서 행을 제거해요.

출처: 문서

본문

DELETE 문은 테이블에서 행을 제거해요.

문법

DELETE FROM table-name
[WHERE expression]
[RETURNING result-column [, result-column ...]]
[ORDER BY sort-expression [, sort-expression ...]]
[LIMIT expression [OFFSET expression]]

설명

DELETE는 WHERE 조건과 일치하는 행을 제거해요. WHERE 절을 주지 않으면 테이블의 모든 행이 삭제돼요. 테이블 자체는 제거되지 않아요; 테이블을 완전히 없애려면 DROP TABLE을 쓰세요.

WHERE 절

WHERE 절은 어떤 행이 삭제될지 좁혀줘요. 표현식이 참으로 평가되는 행만 제거돼요. WHERE 절이 없으면 테이블의 모든 행이 삭제돼요.

DELETE FROM logs WHERE created_at < date('now', '-90 days');

RETURNING 절

RETURNING 절을 쓰면 DELETE 문이 삭제된 각 행의 값을 반환해요. 결과 컬럼은 삭제된 행의 컬럼을 참조하는 아무 표현식이나 될 수 있어요.

DELETE FROM sessions
WHERE expires_at < datetime('now')
RETURNING session_id, user_id;

ORDER BY와 LIMIT

ORDER BY와 LIMIT 절은 어떤 행이 삭제될지 좁혀줘요. ORDER BY가 행을 검토할 순서를 정하고, LIMIT가 실제로 제거될 행 수의 상한을 정해요. ORDER BY는 LIMIT가 반드시 함께 있어야 해요.

DELETE FROM logs
ORDER BY created_at ASC
LIMIT 1000;

LIMIT는 선택적인 OFFSET을 받아서, 제한을 적용하기 전에 일정 수의 행을 건너뛸 수 있어요:

DELETE FROM logs
ORDER BY created_at ASC
LIMIT 500 OFFSET 100;
`DELETE` 문에는 `LIMIT` 없는 `ORDER BY`가 허용되지 않아요. 특정 순서로 조건과 일치하는 모든 행을 삭제해야 한다면, 예상 일치 행 수보다 큰 `LIMIT` 값을 넣어주세요.

예제

조건과 일치하는 행 삭제하기

CREATE TABLE tasks (id INTEGER PRIMARY KEY, title TEXT, completed INTEGER);
INSERT INTO tasks VALUES (1, 'Write docs', 1);
INSERT INTO tasks VALUES (2, 'Review PR', 0);
INSERT INTO tasks VALUES (3, 'Fix bug', 1);

DELETE FROM tasks WHERE completed = 1;

SELECT * FROM tasks;
-- 2|Review PR|0

RETURNING으로 삭제하기

CREATE TABLE queue (id INTEGER PRIMARY KEY, payload TEXT, priority INTEGER);
INSERT INTO queue VALUES (1, 'job_a', 10);
INSERT INTO queue VALUES (2, 'job_b', 5);
INSERT INTO queue VALUES (3, 'job_c', 10);

DELETE FROM queue
WHERE id = (SELECT id FROM queue ORDER BY priority DESC, id ASC LIMIT 1)
RETURNING id, payload;
-- 1|job_a

ORDER BY와 LIMIT으로 가장 오래된 행 삭제하기

CREATE TABLE events (id INTEGER PRIMARY KEY, message TEXT, created_at TEXT);
INSERT INTO events VALUES (1, 'startup', '2025-01-01');
INSERT INTO events VALUES (2, 'request', '2025-01-02');
INSERT INTO events VALUES (3, 'shutdown', '2025-01-03');
INSERT INTO events VALUES (4, 'startup', '2025-01-04');

DELETE FROM events
ORDER BY created_at ASC
LIMIT 2;

SELECT * FROM events;
-- 3|shutdown|2025-01-03
-- 4|startup|2025-01-04

더 알아보기 (Learn more)