DELETE (Transact-SQL)DELETE (Transact-SQL)

적용 대상: 예SQL Server(2008부터) 예Azure SQL Database 예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

SQL ServerSQL Server의 테이블 또는 뷰에서 하나 이상의 행을 제거합니다.Removes one or more rows from a table or view in SQL ServerSQL Server.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
[ WITH <common_table_expression> [ ,...n ] ]  
DELETE   
    [ TOP ( expression ) [ PERCENT ] ]   
    [ FROM ]   
    { { table_alias  
      | <object>   
      | rowset_function_limited   
      [ WITH ( table_hint_limited [ ...n ] ) ] }   
      | @table_variable  
    }  
    [ <OUTPUT Clause> ]  
    [ FROM table_source [ ,...n ] ]   
    [ WHERE { <search_condition>   
            | { [ CURRENT OF   
                   { { [ GLOBAL ] cursor_name }   
                       | cursor_variable_name   
                   }   
                ]  
              }  
            }   
    ]   
    [ OPTION ( <Query Hint> [ ,...n ] ) ]   
[; ]  
  
<object> ::=  
{   
    [ server_name.database_name.schema_name.   
      | database_name. [ schema_name ] .   
      | schema_name.  
    ]  
    table_or_view_name   
}  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
DELETE FROM [database_name . [ schema ] . | schema. ] table_name    
    [ WHERE <search_condition> ]   
    [ OPTION ( <query_options> [ ,...n ]  ) ]  
[; ]  

인수Arguments

WITH <common_table_expression>WITH <common_table_expression>
DELETE 문 범위 내에 정의되고 공통 테이블 식이라고도 하는 명명된 임시 결과 집합을 지정합니다.Specifies the temporary named result set, also known as common table expression, defined within the scope of the DELETE statement. 결과 집합은 SELECT 문에서 파생됩니다.The result set is derived from a SELECT statement.

공통 테이블 식은 SELECT, INSERT, UPDATE 및 CREATE VIEW 문과 함께 사용될 수도 있습니다.Common table expressions can also be used with the SELECT, INSERT, UPDATE, and CREATE VIEW statements. 자세한 내용은 WITH common_table_expression(Transact-SQL)을 참조하세요.For more information, see WITH common_table_expression (Transact-SQL).

TOP (expression) [ PERCENT ]TOP (expression) [ PERCENT ]
삭제될 임의 행의 개수 또는 백분율(%)을 지정합니다.Specifies the number or percent of random rows that will be deleted. expression 은 행의 수 또는 비율일 수 있습니다.expression can be either a number or a percent of the rows. INSERT, UPDATE 또는 DELETE와 함께 사용된 TOP 식에서 참조된 행은 어떠한 순서로도 정렬되지 않습니다.The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order. 자세한 내용은 TOP(Transact-SQL)을 참조하세요.For more information, see TOP (Transact-SQL).

FROMFROM
DELETE 키워드와 대상 table_or_view_name 또한 rowset_function_limited 사이에서 선택적으로 사용할 수 있는 키워드입니다.An optional keyword that can be used between the DELETE keyword and the target table_or_view_name, or rowset_function_limited.

table_aliastable_alias
행을 삭제할 테이블 또는 뷰를 나타내는 FROM table_source 절에 지정되는 별칭입니다.The alias specified in the FROM table_source clause representing the table or view from which the rows are to be deleted.

server_nameserver_name
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

테이블이나 뷰가 위치한 서버의 이름입니다. 연결된 서버 이름 또는 OPENDATASOURCE 함수를 서버 이름으로 사용합니다.The name of the server (using a linked server name or the OPENDATASOURCE function as the server name) on which the table or view is located. server_name이 지정되면 database_nameschema_name이 필요합니다.If server_name is specified, database_name and schema_name are required.

database_namedatabase_name
데이터베이스의 이름입니다.The name of the database.

schema_nameschema_name
테이블이나 뷰가 속한 스키마의 이름입니다.The name of the schema to which the table or view belongs.

table_or_view_nametable_or_view_name
행을 제거할 테이블 또는 뷰의 이름입니다.The name of the table or view from which the rows are to be removed.

테이블 변수는 해당 범위 내에서 DELETE 문의 테이블 원본으로도 사용될 수 있습니다.A table variable, within its scope, also can be used as a table source in a DELETE statement.

table_or_view_name에서 참조되는 뷰는 업데이트가 가능해야 하며 해당 뷰 정의의 FROM 절에서 정확히 하나의 기본 테이블을 참조해야 합니다.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view definition. 업데이트할 수 있는 뷰에 대한 자세한 내용은 CREATE VIEW (Transact-SQL)를 참조하세요.For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

공급자 기능에 관련된 OPENQUERY 또는 OPENROWSET 함수입니다.Either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

WITH ( <table_hint_limited> [... n] )WITH ( <table_hint_limited> [... n] )
대상 테이블에 허용되는 하나 이상의 테이블 힌트를 지정합니다.Specifies one or more table hints that are allowed for a target table. WITH 키워드와 괄호가 필요합니다.The WITH keyword and the parentheses are required. NOLOCK 및 READUNCOMMITTED는 허용되지 않습니다.NOLOCK and READUNCOMMITTED are not allowed. 테이블 힌트에 대한 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하세요.For more information about table hints, see Table Hints (Transact-SQL).

<OUTPUT_Clause><OUTPUT_Clause>
삭제된 행 또는 삭제된 행 기반의 식을 DELETE 작업의 일부로 반환합니다.Returns deleted rows, or expressions based on them, as part of the DELETE operation. OUTPUT 절은 뷰나 원격 테이블을 대상으로 하는 모든 DML 문에서 지원되지 않습니다.The OUTPUT clause is not supported in any DML statements targeting views or remote tables. 자세한 내용은 OUTPUT Clause(Transact-SQL)를 참조하세요.For more information, see OUTPUT Clause (Transact-SQL).

FROM table_sourceFROM table_source
FROM 절을 추가로 지정합니다.Specifies an additional FROM clause. DELETE에 대한 이 Transact-SQLTransact-SQL 확장을 사용하여 <table_source>의 데이터를 지정하고 첫 번째 FROM 절에 있는 테이블에서 해당 행을 삭제할 수 있습니다.This Transact-SQLTransact-SQL extension to DELETE allows specifying data from <table_source> and deleting the corresponding rows from the table in the first FROM clause.

조인을 지정하는 이 확장을 WHERE 절에서 하위 쿼리 대신 사용하여 제거될 행을 식별할 수 있습니다.This extension, specifying a join, can be used instead of a subquery in the WHERE clause to identify rows to be removed.

자세한 내용은 FROM(Transact-SQL)을 참조하세요.For more information, see FROM (Transact-SQL).

WHEREWHERE
삭제될 행의 개수를 제한하는 조건을 지정합니다.Specifies the conditions used to limit the number of rows that are deleted. WHERE 절을 지정하지 않으면 DELETE는 테이블의 모든 행을 제거합니다.If a WHERE clause is not supplied, DELETE removes all the rows from the table.

WHERE 절에 지정된 내용에 따라 두 가지 형식의 삭제 작업이 있습니다.There are two forms of delete operations based on what is specified in the WHERE clause:

  • 검색 결과 삭제는 삭제할 행을 한정하는 검색 조건을 지정합니다.Searched deletes specify a search condition to qualify the rows to delete. 예를 들어,WHERE column_name = .For example, WHERE column_name = value.

  • 위치 지정 삭제는 커서를 지정하는 CURRENT OF 절을 사용합니다.Positioned deletes use the CURRENT OF clause to specify a cursor. 이 경우 커서의 현재 위치에서 삭제 작업이 발생합니다.The delete operation occurs at the current position of the cursor. 이것은 WHERE search_condition 절을 사용하여 삭제될 행을 한정하는 검색 결과 DELETE 문보다 정확한 방법입니다.This can be more accurate than a searched DELETE statement that uses a WHERE search_condition clause to qualify the rows to be deleted. 검색 결과 DELETE 문은 검색 조건이 한 행을 고유하게 식별하지 못할 경우 여러 행을 삭제할 수 있습니다.A searched DELETE statement deletes multiple rows if the search condition does not uniquely identify a single row.

<search_condition><search_condition>
삭제될 행을 제한하는 조건을 지정합니다.Specifies the restricting conditions for the rows to be deleted. 검색 조건에 포함시킬 수 있는 조건자의 개수에는 제한이 없습니다.There is no limit to the number of predicates that can be included in a search condition. 자세한 내용은 검색 조건(Transact-SQL)을 참조하세요.For more information, see Search Condition (Transact-SQL).

CURRENT OFCURRENT OF
지정한 커서의 현재 위치에서 DELETE가 수행되도록 지정합니다.Specifies that the DELETE is performed at the current position of the specified cursor.

GLOBALGLOBAL
cursor_name이 전역 커서를 참조하도록 지정합니다.Specifies that cursor_name refers to a global cursor.

cursor_namecursor_name
인출이 수행되는 열린 커서의 이름입니다.Is the name of the open cursor from which the fetch is made. 이름이 cursor_name인 전역 커서와 로컬 커서가 모두 있는 경우 이 인수는 GLOBAL이 지정되면 전역 커서를 참조하고, 그렇지 않으면 로컬 커서를 참조합니다.If both a global and a local cursor with the name cursor_name exist, this argument refers to the global cursor if GLOBAL is specified; otherwise, it refers to the local cursor. 커서는 업데이트될 수 있어야 합니다.The cursor must allow updates.

cursor_variable_namecursor_variable_name
커서 변수의 이름입니다.The name of a cursor variable. 커서 변수는 업데이트를 허용하는 커서를 참조해야 합니다.The cursor variable must reference a cursor that allows updates.

OPTION ( <query_hint> [ ,... n] )OPTION ( <query_hint> [ ,... n] )
데이터베이스 엔진Database Engine에서 최적화 프로그램 힌트를 사용하여 문을 처리하는 방법을 사용자 지정한다는 것을 나타내는 키워드입니다.Keywords that indicate which optimizer hints are used to customize the way the 데이터베이스 엔진Database Engine processes the statement. 자세한 내용은 쿼리 힌트(Transact-SQL)를 참조하세요.For more information, see Query Hints (Transact-SQL).

최선의 구현 방법Best Practices

테이블의 모든 행을 삭제하려면 TRUNCATE TABLE을 사용합니다.To delete all the rows in a table, use TRUNCATE TABLE. TRUNCATE TABLE은 DELETE보다 더 빠르고 시스템 및 트랜잭션 로그 리소스를 더 적게 사용합니다.TRUNCATE TABLE is faster than DELETE and uses fewer system and transaction log resources. TRUNCATE TABLE은 테이블이 복제에 참여할 수 없는 등의 제한 사항이 있습니다.TRUNCATE TABLE has restrictions, for example, the table cannot participate in replication. 자세한 내용은 TRUNCATE TABLE(Transact-SQL)을 참조하세요.For more information, see TRUNCATE TABLE (Transact-SQL)

@@ROWCOUNT 함수를 사용하여 클라이언트 애플리케이션에 삭제된 행의 수를 반환할 수 있습니다.Use the @@ROWCOUNT function to return the number of deleted rows to the client application. 자세한 내용은 @@ROWCOUNT&#40;Transact-SQL&#41;을 참조하세요.For more information, see @@ROWCOUNT (Transact-SQL).

오류 처리Error Handling

TRY…CATCH 구문에 명령문을 지정하여 DELETE 문에 대한 오류 처리를 구현할 수 있습니다.You can implement error handling for the DELETE statement by specifying the statement in a TRY...CATCH construct.

DELETE 문이 트리거를 위반하거나 FOREIGN KEY 제약 조건이 있는 다른 테이블의 데이터에 의해 참조되는 행을 제거하려고 하면 DELETE 문은 실패할 수 있습니다.The DELETE statement may fail if it violates a trigger or tries to remove a row referenced by data in another table with a FOREIGN KEY constraint. DELETE가 여러 행을 제거하는 경우 제거되는 행 중 하나가 트리거 또는 제약 조건을 위반하면 이 문이 취소되고 오류가 반환되며 행이 제거되지 않습니다.If the DELETE removes multiple rows, and any one of the removed rows violates a trigger or constraint, the statement is canceled, an error is returned, and no rows are removed.

식 계산 중 DELETE 문에서 산술 오류(오버플로, 0으로 나누기, 도메인 오류 등)가 발생하면 데이터베이스 엔진Database Engine에서는 SET ARITHABORT가 ON으로 설정된 것처럼 이러한 오류를 처리합니다.When a DELETE statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the 데이터베이스 엔진Database Engine handles these errors as if SET ARITHABORT is set ON. 나머지 일괄 처리가 취소되고 오류 메시지가 반환됩니다.The rest of the batch is canceled, and an error message is returned.

상호 운용성Interoperability

수정할 개체가 테이블 변수인 경우 사용자 정의 함수의 본문에 DELETE를 사용할 수 있습니다.DELETE can be used in the body of a user-defined function if the object modified is a table variable.

FILESTREAM 열이 있는 행을 삭제하면 해당 내부 파일 시스템 파일도 삭제됩니다.When you delete a row that contains a FILESTREAM column, you also delete its underlying file system files. 기본 파일은 FILESTREAM 가비지 수집기를 통해 제거됩니다.The underlying files are removed by the FILESTREAM garbage collector. 자세한 내용은 Access FILESTREAM Data with Transact-SQL을 참조하세요.For more information, see Access FILESTREAM Data with Transact-SQL.

INSTEAD OF 트리거가 정의된 뷰를 직접 또는 간접으로 참조하는 DELETE 문에 FROM 절을 지정할 수 없습니다.The FROM clause cannot be specified in a DELETE statement that references, either directly or indirectly, a view with an INSTEAD OF trigger defined on it. INSTEAD OF 트리거에 대한 자세한 내용은 CREATE TRIGGER(Transact-SQL)를 참조하세요.For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

제한 사항Limitations and Restrictions

TOP을 DELETE와 함께 사용할 경우 참조된 행은 어떠한 순서로도 정렬되지 않으며 ORDER BY 절을 이 문에서 직접 지정할 수 없습니다.When TOP is used with DELETE, the referenced rows are not arranged in any order and the ORDER BY clause can not be directly specified in this statement. TOP을 사용하여 시간 순서로 행을 삭제해야 하는 경우에는 하위 SELECT 문에서 ORDER BY 절을 지정하는 방식으로 TOP을 사용해야 합니다.If you need to use TOP to delete rows in a meaningful chronological order, you must use TOP together with an ORDER BY clause in a subselect statement. 이 항목의 뒷부분에 나오는 예 섹션을 참조하세요.See the Examples section that follows in this topic.

TOP은 분할된 뷰에서 DELETE 문에 사용할 수 없습니다.TOP cannot be used in a DELETE statement against partitioned views.

잠금 동작Locking Behavior

기본적으로 DELETE 문은 항상 수정하는 테이블에 대해 배타적(X) 잠금을 획득하고 해당 트랜잭션이 완료될 때까지 이 잠금을 보유합니다.By default, a DELETE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. 배타(X) 잠금을 사용하면 다른 트랜잭션이 데이터를 수정할 수 없습니다. 읽기 작업은 NOLOCK 힌트 또는 READ UNCOMMITED 격리 수준을 사용해서만 수행할 수 있습니다.With an exclusive (X) lock, no other transactions can modify data; read operations can take place only with the use of the NOLOCK hint or read uncommitted isolation level. 테이블 힌트를 지정해 다른 잠금 방법을 지정하여 DELETE 문의 기간에 이 기본 동작을 재정의할 수 있지만, 숙련된 개발자 및 데이터베이스 관리자가 최후의 수단으로만 힌트를 사용하시기 바랍니다.You can specify table hints to override this default behavior for the duration of the DELETE statement by specifying another locking method, however, we recommend that hints be used only as a last resort by experienced developers and database administrators. 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하세요.For more information, see Table Hints (Transact-SQL).

힙에서 행을 삭제할 때 데이터베이스 엔진Database Engine 이 작업에 대해 행 또는 페이지 잠금을 사용할 수 있습니다.When rows are deleted from a heap the 데이터베이스 엔진Database Engine may use row or page locking for the operation. 이 경우 삭제 작업에서 비운 페이지가 힙에 할당된 상태로 남아 있습니다.As a result, the pages made empty by the delete operation remain allocated to the heap. 빈 페이지의 할당이 취소되지 않으면 데이터베이스의 다른 개체가 해당 공간을 다시 사용할 수 없습니다.When empty pages are not deallocated, the associated space cannot be reused by other objects in the database.

힙에서 행을 삭제하고 페이지 할당을 취소하려면 다음 방법 중 하나를 사용하세요.To delete rows in a heap and deallocate pages, use one of the following methods.

  • DELETE 문에 TABLOCK 힌트를 지정합니다.Specify the TABLOCK hint in the DELETE statement. TABLOCK 힌트를 사용하면 삭제 작업이 행 또는 페이지 잠금 대신 배타적 잠금을 수행하므로Using the TABLOCK hint causes the delete operation to take an exclusive lock on the table instead of a row or page lock. 페이지 할당을 취소할 수 있습니다.This allows the pages to be deallocated. TABLOCK 힌트에 대한 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하세요.For more information about the TABLOCK hint, see Table Hints (Transact-SQL).

  • 테이블에서 모든 행이 삭제되는 경우 TRUNCATE TABLE을 사용합니다.Use TRUNCATE TABLE if all rows are to be deleted from the table.

  • 행을 삭제하기 전에 힙에 클러스터형 인덱스를 만듭니다.Create a clustered index on the heap before deleting the rows. 행이 삭제되고 나면 클러스터형 인덱스를 삭제할 수 있습니다.You can drop the clustered index after the rows are deleted. 이 방법은 앞의 두 방법보다 시간이 오래 걸리며 임시 리소스를 더 많이 사용합니다.This method is more time consuming than the previous methods and uses more temporary resources.

참고

ALTER TABLE <table_name> REBUILD문을 사용하여 언제든지 힙에서 빈 페이지를 제거할 수 있습니다.Empty pages can be removed from a heap at any time by using the ALTER TABLE <table_name> REBUILD statement.

로깅 동작Logging Behavior

DELETE 문은 항상 전체 로깅됩니다.The DELETE statement is always fully logged.

보안Security

PermissionsPermissions

대상 테이블에 DELETE 권한이 필요합니다.DELETE permissions are required on the target table. 문에 WHERE 절이 포함되어 있을 경우 SELECT 권한도 필요합니다.SELECT permissions are also required if the statement contains a WHERE clause.

sysadmin 고정 서버 역할의 멤버, db_ownerdb_datawriter 고정 데이터베이스 역할의 멤버 및 테이블 소유자에게는 기본적으로 DELETE 권한이 부여됩니다.DELETE permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. sysadmin, db_ownerdb_securityadmin 역할의 멤버와 테이블 소유자는 다른 사용자에게 권한을 위임할 수 있습니다.Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.

Examples

범주Category 중요한 구문 요소Featured syntax elements
기본 구문Basic syntax DeleteDELETE
삭제되는 행 제한Limiting the rows deleted WHERE • FROM • 커서 •WHERE • FROM • cursor •
원격 테이블에서 행 삭제Deleting rows from a remote table 연결된 서버 • OPENQUERY 행 집합 함수 • OPENDATASOURCE 행 집합 함수Linked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
DELETE 문의 결과 캡처Capturing the results of the DELETE statement OUTPUT 절OUTPUT clause

기본 구문Basic Syntax

이 섹션의 예에서는 최소 필수 구문을 사용하여 DELETE 문의 기본 기능을 보여 줍니다.Examples in this section demonstrate the basic functionality of the DELETE statement using the minimum required syntax.

1.A. WHERE 절 없이 DELETE 사용Using DELETE with no WHERE clause

다음 예에서는 삭제되는 행 수를 제한하는 WHERE 절을 사용하지 않았기 때문에 SalesPersonQuotaHistory 데이터베이스의 AdventureWorks2012AdventureWorks2012 테이블에서 모든 행을 삭제합니다.The following example deletes all rows from the SalesPersonQuotaHistory table in the AdventureWorks2012AdventureWorks2012 database because a WHERE clause is not used to limit the number of rows deleted.

DELETE FROM Sales.SalesPersonQuotaHistory;  
GO  

삭제되는 행 제한Limiting the Rows Deleted

이 섹션의 예에서는 삭제되는 행 수를 제한하는 방법을 보여 줍니다.Examples in this section demonstrate how to limit the number of rows that will be deleted.

2.B. WHERE 절을 사용하여 행 집합 삭제Using the WHERE clause to delete a set of rows

다음 예에서는 ProductCostHistory 열의 값이 AdventureWorks2012AdventureWorks2012 을 초과하는 모든 행을 StandardCost 데이터베이스의 1000.00테이블에서 삭제합니다.The following example deletes all rows from the ProductCostHistory table in the AdventureWorks2012AdventureWorks2012 database in which the value in the StandardCost column is more than 1000.00.

DELETE FROM Production.ProductCostHistory  
WHERE StandardCost > 1000.00;  
GO  

다음 예서는 보다 복잡한 WHERE 절을 보여 줍니다.The following example shows a more complex WHERE clause. WHERE 절은 삭제할 행을 확인하기 위해 충족해야 하는 두 가지 조건을 정의합니다.The WHERE clause defines two conditions that must be met to determine the rows to delete. StandardCost 열의 값은 12.00 에서 14.00 사이여야 하고, SellEndDate 열의 값은 Null이어야 합니다.The value in the StandardCost column must be between 12.00 and 14.00 and the value in the column SellEndDate must be null. 또한 이 예에서는 **@@ROWCOUNT** 함수 값을 인쇄하여 삭제된 행 수를 반환합니다.The example also prints the value from the **@@ROWCOUNT** function to return the number of deleted rows.

DELETE Production.ProductCostHistory  
WHERE StandardCost BETWEEN 12.00 AND 14.00  
      AND EndDate IS NULL;  
PRINT 'Number of rows deleted is ' + CAST(@@ROWCOUNT as char(3));  

3.C. 커서를 사용하여 삭제할 행 확인Using a cursor to determine the row to delete

다음 예에서는 EmployeePayHistory 데이터베이스의 AdventureWorks2012AdventureWorks2012 라는 커서를 사용하여 my_cursor.The following example deletes a single row from the EmployeePayHistory table in the AdventureWorks2012AdventureWorks2012 database using a cursor named my_cursor. 삭제 작업은 현재 커서에서 인출된 한 행에만 영향을 줍니다.The delete operation affects only the single row currently fetched from the cursor.

DECLARE complex_cursor CURSOR FOR  
    SELECT a.BusinessEntityID  
    FROM HumanResources.EmployeePayHistory AS a  
    WHERE RateChangeDate <>   
         (SELECT MAX(RateChangeDate)  
          FROM HumanResources.EmployeePayHistory AS b  
          WHERE a.BusinessEntityID = b.BusinessEntityID) ;  
OPEN complex_cursor;  
FETCH FROM complex_cursor;  
DELETE FROM HumanResources.EmployeePayHistory  
WHERE CURRENT OF complex_cursor;  
CLOSE complex_cursor;  
DEALLOCATE complex_cursor;  
GO  

4.D. 한 테이블의 데이터에 대한 조인 및 하위 쿼리를 사용하여 다른 테이블의 행 삭제Using joins and subqueries to data in one table to delete rows in another table

다음 예에서는 한 테이블의 데이터를 기반으로 다른 테이블의 행을 삭제하는 두 가지 방법을 보여 줍니다.The following examples show two ways to delete rows in one table based on data in another table. 두 예에서 모두 SalesPerson 테이블에 저장된 연누계 매출에 기반하여 AdventureWorks2012AdventureWorks2012 데이터베이스의 SalesPersonQuotaHistory 테이블에서 행을 삭제합니다.In both examples, rows from the SalesPersonQuotaHistory table in the AdventureWorks2012AdventureWorks2012 database are deleted based on the year-to-date sales stored in the SalesPerson table. 첫 번째 DELETE 문은 ISO 호환 하위 쿼리 솔루션을 보여 주고 두 번째 DELETE 문은 두 테이블을 조인하는 Transact-SQLTransact-SQL FROM 확장을 보여 줍니다.The first DELETE statement shows the ISO-compatible subquery solution, and the second DELETE statement shows the Transact-SQLTransact-SQL FROM extension to join the two tables.

-- SQL-2003 Standard subquery  
  
DELETE FROM Sales.SalesPersonQuotaHistory   
WHERE BusinessEntityID IN   
    (SELECT BusinessEntityID   
     FROM Sales.SalesPerson   
     WHERE SalesYTD > 2500000.00);  
GO  
-- Transact-SQL extension  
  
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  
-- No need to mention target table more than once.  
  
DELETE spqh  
  FROM  
        Sales.SalesPersonQuotaHistory AS spqh  
    INNER JOIN Sales.SalesPerson AS sp  
        ON spqh.BusinessEntityID = sp.BusinessEntityID  
  WHERE  sp.SalesYTD > 2500000.00;  

5.E. TOP를 사용하여 삭제되는 행 수 제한Using TOP to limit the number of rows deleted

DELETE 문에 TOP(n) 절을 사용하면 n개의 행을 임의로 선택하여 삭제 작업이 수행됩니다.When a TOP (n) clause is used with DELETE, the delete operation is performed on a random selection of n number of rows. 다음 예에서는 20 데이터베이스의 PurchaseOrderDetail 테이블에서 기한이 2006년 7월 1일 이전인 행 중 AdventureWorks2012AdventureWorks2012개의 행을 임의로 선택하여 삭제합니다.The following example deletes 20 random rows from the PurchaseOrderDetail table in the AdventureWorks2012AdventureWorks2012 database that have due dates that are earlier than July 1, 2006.

DELETE TOP (20)   
FROM Purchasing.PurchaseOrderDetail  
WHERE DueDate < '20020701';  
GO  

TOP을 사용하여 시간 순서로 행을 삭제해야 하는 경우에는 하위 SELECT 문에서 ORDER BY를 지정하는 방식으로 TOP을 사용해야 합니다.If you have to use TOP to delete rows in a meaningful chronological order, you must use TOP together with ORDER BY in a subselect statement. 다음 쿼리는 PurchaseOrderDetail 테이블에서 기한이 가장 빠른 10개의 행을 삭제합니다.The following query deletes the 10 rows of the PurchaseOrderDetail table that have the earliest due dates. 10개의 행만 삭제하기 위해 하위 SELECT 문에서 지정한 열(PurchaseOrderID)은 테이블의 기본 키입니다.To ensure that only 10 rows are deleted, the column specified in the subselect statement (PurchaseOrderID) is the primary key of the table. 하위 SELECT 문에 키가 아닌 열을 사용하면 지정한 열에 중복 값이 있을 경우 10개가 넘는 행이 삭제될 수 있습니다.Using a nonkey column in the subselect statement may result in the deletion of more than 10 rows if the specified column contains duplicate values.

DELETE FROM Purchasing.PurchaseOrderDetail  
WHERE PurchaseOrderDetailID IN  
   (SELECT TOP 10 PurchaseOrderDetailID   
    FROM Purchasing.PurchaseOrderDetail   
    ORDER BY DueDate ASC);  
GO  

원격 테이블에서 행 삭제Deleting Rows From a Remote Table

이 섹션의 예에서는 원격 테이블을 참조하는 연결된 서버 또는 행 집합 함수 를 사용하여 원격 테이블에서 행을 삭제하는 방법을 보여 줍니다.Examples in this section demonstrate how to delete rows from a remote table by using a linked server or a rowset function to reference the remote table. 원격 테이블은 SQL Server의 다른 서버 또는 인스턴스에 있습니다.A remote table exists on a different server or instance of SQL Server.

적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

6.F. 연결된 서버를 사용하여 원격 테이블에서 데이터 삭제Deleting data from a remote table by using a linked server

다음 예에서는 원격 테이블에서 행을 삭제합니다.The following example deletes rows from a remote table. 먼저 sp_addlinkedserver를 사용하여 원격 데이터 원본에 대한 링크를 만듭니다.The example begins by creating a link to the remote data source by using sp_addlinkedserver. 그런 다음, 연결된 서버 이름 MyLinkServerserver.catalog.schema.object와 같이 네 부분으로 구성된 개체 이름의 일부로 지정됩니다.The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'.  
  
EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI',   
    @datasrc = N'server_name',  
    @catalog = N'AdventureWorks2012';  
GO  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  
  
DELETE MyLinkServer.AdventureWorks2012.HumanResources.Department 
WHERE DepartmentID > 16;  
GO  

7.G. OPENQUERY 함수를 사용하여 원격 테이블에서 데이터 삭제Deleting data from a remote table by using the OPENQUERY function

다음 예에서는 OPENQUERY 행 집합 함수를 지정하여 원격 테이블에서 행을 삭제합니다.The following example deletes rows from a remote table by specifying the OPENQUERY rowset function. 이 예에서는 이전 예에서 만든 연결된 서버 이름이 사용됩니다.The linked server name created in the previous example is used in this example.

DELETE OPENQUERY (MyLinkServer, 'SELECT Name, GroupName 
FROM AdventureWorks2012.HumanResources.Department  
WHERE DepartmentID = 18');  
GO  

8.H. OPENDATASOURCE 함수를 사용하여 원격 테이블에서 데이터 삭제Deleting data from a remote table by using the OPENDATASOURCE function

다음 예에서는 OPENDATASOURCE 행 집합 함수를 지정하여 원격 테이블에서 행을 삭제합니다.The following example deletes rows from a remote table by specifying the OPENDATASOURCE rowset function. server_name 또는 server_name\instance_name 형식을 사용하여 데이터 원본에 대해 유효한 서버 이름을 지정해야 합니다.Specify a valid server name for the data source by using the format server_name or server_name\instance_name.

DELETE FROM OPENDATASOURCE('SQLNCLI',  
    'Data Source= <server_name>; Integrated Security=SSPI')  
    .AdventureWorks2012.HumanResources.Department   
WHERE DepartmentID = 17;'  

DELETE 문의 결과 캡처Capturing the results of the DELETE statement

9.I. DELETE에 OUTPUT 절 사용Using DELETE with the OUTPUT clause

다음 예에서는 DELETE 문의 결과를 AdventureWorks2012AdventureWorks2012 데이터베이스의 테이블 변수로 저장하는 방법을 보여 줍니다.The following example shows how to save the results of a DELETE statement to a table variable in the AdventureWorks2012AdventureWorks2012 database.

DELETE Sales.ShoppingCartItem  
OUTPUT DELETED.*   
WHERE ShoppingCartID = 20621;  
  
--Verify the rows in the table matching the WHERE clause have been deleted.  
SELECT COUNT(*) AS [Rows in Table] 
FROM Sales.ShoppingCartItem 
WHERE ShoppingCartID = 20621;  
GO  

10.J. DELETE 문에 OUTPUT 및 <from_table_name> 사용Using OUTPUT with <from_table_name> in a DELETE statement

다음 예에서는 ProductProductPhoto 문의 AdventureWorks2012AdventureWorks2012 절에 정의된 검색 조건에 따라 FROM 데이터베이스의 DELETE 테이블에서 행을 삭제합니다.The following example deletes rows in the ProductProductPhoto table in the AdventureWorks2012AdventureWorks2012 database based on search criteria defined in the FROM clause of the DELETE statement. OUTPUT 절은 삭제될 테이블의 DELETED.ProductID, DELETED.ProductPhotoID열과 Product 테이블의 열을 반환합니다.The OUTPUT clause returns columns from the table being deleted, DELETED.ProductID, DELETED.ProductPhotoID, and columns from the Product table. 이것은 FROM 절에서 삭제할 행을 지정하는 데 사용됩니다.This is used in the FROM clause to specify the rows to delete.

DECLARE @MyTableVar table (  
    ProductID int NOT NULL,   
    ProductName nvarchar(50)NOT NULL,  
    ProductModelID int NOT NULL,   
    PhotoID int NOT NULL);  
  
DELETE Production.ProductProductPhoto  
OUTPUT DELETED.ProductID,  
       p.Name,  
       p.ProductModelID,  
       DELETED.ProductPhotoID  
    INTO @MyTableVar  
FROM Production.ProductProductPhoto AS ph  
JOIN Production.Product as p   
    ON ph.ProductID = p.ProductID   
    WHERE p.ProductModelID BETWEEN 120 and 130;  
  
--Display the results of the table variable.  
SELECT ProductID, ProductName, ProductModelID, PhotoID   
FROM @MyTableVar  
ORDER BY ProductModelID;  
GO  

예제: Azure SQL 데이터 웨어하우스Azure SQL Data Warehouse병렬 데이터 웨어하우스Parallel Data WarehouseExamples: Azure SQL 데이터 웨어하우스Azure SQL Data Warehouse and 병렬 데이터 웨어하우스Parallel Data Warehouse

11.K. 테이블에서 행을 삭제합니다.Delete all rows from a table

다음 예에서는 삭제될 행 수를 제한하는 WHERE 절을 사용하지 않았기 때문에 Table1 테이블에서 모든 행을 삭제합니다.The following example deletes all rows from the Table1 table because a WHERE clause is not used to limit the number of rows deleted.

DELETE FROM Table1;  

12.L. 테이블에서 행 집합을 DELETE합니다.DELETE a set of rows from a table

다음 예에서는 Table1 테이블에서 StandardCost 열에 1000.00보다 큰 값을 가진 모든 행을 삭제합니다.The following example deletes all rows from the Table1 table that have a value greater than 1000.00 in the StandardCost column.

DELETE FROM Table1  
WHERE StandardCost > 1000.00;  

13.M. DELETE 문과 함께 LABEL 사용Using LABEL with a DELETE statement

다음 예제에서는 DELETE 문과 함께 레이블을 사용합니다.The following example uses a label with the DELETE statement.

DELETE FROM Table1  
OPTION ( LABEL = N'label1' );  
  

14.N. DELETE 문에 레이블 및 쿼리 힌트 사용Using a label and a query hint with the DELETE statement

이 쿼리는 DELETE 문에 쿼리 조인 힌트를 사용하는 기본 구문을 보여줍니다.This query shows the basic syntax for using a query join hint with the DELETE statement. 조인 힌트 및 OPTION 절을 사용하는 방법에 대한 자세한 내용은 OPTION(SQL Server PDW) 을 참조하십시오.For more information on join hints and how to use the OPTION clause, see OPTION (SQL Server PDW).

-- Uses AdventureWorks  
  
DELETE FROM dbo.FactInternetSales  
WHERE ProductKey IN (   
    SELECT T1.ProductKey FROM dbo.DimProduct T1   
    JOIN dbo.DimProductSubcategory T2  
    ON T1.ProductSubcategoryKey = T2.ProductSubcategoryKey  
    WHERE T2.EnglishProductSubcategoryName = 'Road Bikes' )  
OPTION ( LABEL = N'CustomJoin', HASH JOIN ) ;  

참고 항목See Also

CREATE TRIGGER(Transact-SQL) CREATE TRIGGER (Transact-SQL)
INSERT(Transact-SQL) INSERT (Transact-SQL)
SELECT(Transact-SQL) SELECT (Transact-SQL)
TRUNCATE TABLE (Transact-SQL) TRUNCATE TABLE (Transact-SQL)
UPDATE(Transact-SQL) UPDATE (Transact-SQL)
WITH common_table_expression(Transact-SQL) WITH common_table_expression (Transact-SQL)
@@ROWCOUNT&#40;Transact-SQL&#41;@@ROWCOUNT (Transact-SQL)