SQL Server(Transact-SQL)의 DELETE 문은 테이블에서 하나 이상의 레코드를 삭제할 때 사용하는 명령어입니다. 이 글에서는 DELETE 문의 기본 구문부터 TOP, PERCENT, EXISTS 절을 활용한 실전 예제까지 차근차근 살펴봅니다.
DELETE 명령 기본 구문
DELETE 명령의 간단한 구문은 다음과 같습니다.
DELETE FROM 테이블명
[WHERE 조건];
전체 구문은 다음과 같습니다.
DELETE [TOP (값) [PERCENT]]
FROM 테이블명
[WHERE 조건];
주요 매개변수 설명
테이블명
삭제할 레코드가 있는 테이블입니다.
WHERE 조건 (선택 사항)
삭제 대상 레코드가 반드시 충족해야 하는 조건입니다. WHERE 절을 생략하면 테이블의 모든 행이 삭제되므로 각별히 주의해야 합니다.
TOP (값) (선택 사항)
지정하면 결과 집합의 첫 번째 행부터 값에 해당하는 개수만큼 삭제합니다. 예를 들어 TOP(10)은 결과 집합에서 상위 10개 행을 삭제합니다.
PERCENT (선택 사항)
지정하면 결과 집합 전체를 기준으로 지정한 백분율에 해당하는 상위 행들을 삭제합니다. 예를 들어 TOP(10) PERCENT는 결과 집합의 상위 10%에 해당하는 행을 삭제합니다.
참고: DELETE 문에서는 열(필드) 이름을 나열할 필요가 없습니다. DELETE는 항상 행 단위로 동작하며 행 전체를 삭제하기 때문입니다.
DELETE 문 사용 예제
예제 1. 조건 하나 사용하기
DELETE FROM employees
WHERE name = 'Sarah';
이 명령은 직원 이름이 'Sarah'인 모든 레코드를 삭제합니다.
삭제될 레코드 수를 미리 확인하려면 DELETE를 실행하기 전에 다음 SELECT 문을 실행해 보세요.
SELECT COUNT(*)
FROM employees
WHERE name = 'Sarah';
예제 2. 두 개의 조건 사용하기
DELETE FROM employees
WHERE last_name = 'Johnson'
AND employee_id >= 80;
이 명령은 성이 'Johnson'이고 employee_id가 80 이상인 모든 레코드를 삭제합니다.
삭제될 행 수를 확인하려면 DELETE 실행 전에 아래 SELECT 문을 실행합니다.
SELECT COUNT(*)
FROM employees
WHERE last_name = 'Johnson'
AND employee_id >= 80;
예제 3. TOP 키워드 사용하기
DELETE TOP(3)
FROM employees
WHERE last_name = 'Johnson';
이 명령은 성이 'Johnson'인 레코드 중 처음 3개만 삭제합니다. 같은 조건을 만족하는 나머지 레코드는 이 DELETE 문의 영향을 받지 않습니다.
예제 4. EXISTS 절 사용하기
다른 테이블의 값을 기준으로 레코드를 삭제하는 등 더 복잡한 삭제 작업도 가능합니다. DELETE 문의 FROM 절에는 여러 테이블을 지정할 수 없으므로, 이런 경우 EXISTS 절을 활용합니다.
DELETE FROM employees
WHERE EXISTS
(SELECT *
FROM contacts
WHERE contacts.contact_id = employees.employee_id
AND contacts.contact_id < 100);
이 DELETE 문은 contacts(연락처) 테이블에 contact_id가 100보다 작고 그 값이 employees 테이블의 employee_id와 일치하는 레코드가 존재할 때, 해당 직원 레코드를 모두 삭제합니다.
삭제될 행 수를 미리 파악하려면 DELETE 실행 전에 다음 SELECT 문을 실행하세요.
SELECT COUNT(*)
FROM employees
WHERE EXISTS
(SELECT *
FROM contacts
WHERE contacts.contact_id = employees.employee_id
AND contacts.contact_id < 100);
실무 팁
DELETE로 삭제한 데이터는 기본적으로 되돌릴 수 없습니다. 대량의 데이터를 삭제하기 전에는 트랜잭션(BEGIN TRAN … ROLLBACK)으로 결과를 먼저 검증하거나 백업을 확보하는 것이 안전합니다. 또한 테이블의 모든 데이터를 삭제할 때는 WHERE 절 없는 DELETE보다 TRUNCATE TABLE이 더 빠를 수 있습니다. 단, TRUNCATE는 조건부 삭제가 불가능하고 동작 방식도 다르므로 상황에 맞게 선택해야 합니다.