Share via


DELETE를 사용하여 행 삭제

DELETE 문은 테이블이나 뷰에서 하나 이상의 행을 제거합니다.

DELETE 구문의 간단한 형태는 다음과 같습니다.

DELETE table_or_view

FROM table_sources

WHERE search_condition

table_or_view 매개 변수는 행을 삭제할 테이블 또는 뷰의 이름을 지정합니다. WHERE 검색 조건을 만족하는 table_or_view의 모든 행은 삭제됩니다. WHERE 절을 지정하지 않으면 table_or_view의 모든 행이 삭제됩니다. FROM 절은 table_or_view.에서 삭제될 행을 한정하는 WHERE 절 검색 조건에서 조건자로 사용할 수 있는 조인 조건과 추가 테이블 또는 뷰를 지정합니다. 행은 FROM 절에 지정된 테이블에서는 삭제되지 않고 table_or_view에 지정된 테이블에서만 삭제됩니다.

모든 행이 제거된 테이블은 데이터베이스에 유지됩니다. DELETE 문은 테이블의 행만 삭제하며 데이터베이스에서 테이블을 제거하려면 DROP TABLE 문을 사용해야 합니다.

힙에서 행 삭제

에서 행을 삭제할 때 데이터베이스 엔진이 작업을 수행하기 위해 행 또는 페이지 잠금을 사용할 수 있습니다. 따라서 삭제 작업으로 인해 비워진 페이지가 힙에 할당된 채로 남게 됩니다. 빈 페이지의 할당이 취소되지 않으면 해당 공간을 데이터베이스의 다른 개체에 다시 사용할 수 없습니다.

힙에서 행을 삭제하고 페이지의 할당을 취소하려면 다음 방법 중 하나를 사용하십시오.

  • DELETE 문에 TABLOCK 힌트를 지정합니다. TABLOCK 힌트를 사용하면 삭제 작업 시 행 또는 페이지 잠금 대신 테이블에 대한 공유 잠금이 사용됩니다. 따라서 페이지의 할당을 취소할 수 있습니다. TABLOCK 힌트에 대한 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하십시오.

  • 테이블에서 행을 모두 삭제해야 하는 경우에는 TRUNCATE TABLE을 사용합니다.

  • 행을 삭제하기 전에 힙에 클러스터형 인덱스를 만듭니다. 이러한 클러스터형 인덱스는 행을 삭제한 후에 제거할 수 있습니다. 이 방법은 앞에 소개한 방법보다 시간이 오래 걸리고 임시 리소스가 더 많이 사용됩니다.

잠금에 대한 자세한 내용은 데이터베이스 엔진에서의 잠금을 참조하십시오.

다음 예에서는 WHERE 절을 사용하여 삭제될 행 수를 제한하지 않았기 때문에 SalesPersonQuotaHistory 테이블에서 모든 행을 삭제합니다.

USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO

다음 예에서는 ProductCostHistory 테이블에서 StandardCost 열의 값이 1000.00을 초과하는 행을 모두 삭제합니다.

USE AdventureWorks2008R2;
GO
DELETE FROM Production.ProductCostHistory
WHERE StandardCost > 1000.00;
GO

다음 예에서는 조인 또는 상관 하위 쿼리를 기반으로 기본 테이블에서 레코드를 삭제하는 데 사용되는 Transact-SQL 확장을 보여 줍니다. 첫 번째 DELETE 문은 ISO 호환 하위 쿼리 솔루션을 보여 주고 두 번째 DELETE 문은 Transact-SQL 확장을 보여 줍니다. 두 쿼리 모두 SalesPerson 테이블에 저장된 연간 매출에 기반하여 SalesPersonQuotaHistory 테이블에서 행을 제거합니다.

-- SQL-2003 Standard subquery

USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
WHERE BusinessEntityID IN 
    (SELECT BusinessEntityID 
     FROM Sales.SalesPerson 
     WHERE SalesYTD > 2500000.00);
GO
-- Transact-SQL extension
USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER JOIN Sales.SalesPerson AS sp
ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;

GO