DELETE

テーブルから行を削除します。

構文

DELETE
    [ FROM ]
        
{ table_name WITH ( < table_hint_limited > [ ...n ] )
         |
view_name
        
| rowset_function_limited
        }

        [ FROM { < table_source > } [
,...n ] ]

    [ WHERE
        { < search_condition >
        | { [ CURRENT OF
                
{ { [ GLOBAL ] cursor_name }
                    |
cursor_variable_name
                }
            ] }
        }
    ]
    [ OPTION
( < query_hint > [ ,...n ] ) ]

< table_source > ::=
    table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
    |
view_name [ [ AS ] table_alias ]
    |
rowset_function [ [ AS ] table_alias ]
    |
derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
    | < joined_table >

< joined_table > ::=
    < table_source > < join_type > < table_source > ON < search_condition >
    | < table_source > CROSS JOIN < table_source >
    | < joined_table >

< join_type > ::=
    [ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
    [ < join_hint > ]
    JOIN

< table_hint_limited > ::=
    
{ FASTFIRSTROW
        |
HOLDLOCK
        | PAGLOCK
        | READCOMMITTED
        | REPEATABLEREAD
        | ROWLOCK
        | SERIALIZABLE
        | TABLOCK
        | TABLOCKX
        | UPDLOCK
    }

< table_hint > ::=
    
{ INDEX ( index_val [ ,...n ] )
        | FASTFIRSTROW
        |
HOLDLOCK
        |
NOLOCK
        | PAGLOCK
        | READCOMMITTED
        | READPAST
        | READUNCOMMITTED
        | REPEATABLEREAD
        | ROWLOCK
        | SERIALIZABLE
        | TABLOCK
        | TABLOCKX
        | UPDLOCK
    }

< query_hint > ::=
    { { HASH | ORDER } GROUP
        | { CONCAT | HASH | MERGE } UNION
        | FAST number_rows
        | FORCE ORDER
        | MAXDOP
        | ROBUST PLAN
        | KEEP PLAN

    }

引数

FROM

DELETE キーワードと対象の table_nameview_name、または rowset_function_limited との間で使用できるキーワードで、省略可能です。

table_name

行を削除するテーブルの名前です。

有効範囲内の変数 table、またはサーバー名として OPENDATASOURCE 関数を使用する、4 つの要素で構成されるテーブル名 (またはビュー名) も、DELETE ステートメント内のテーブル ソースとして使用できます。

WITH (<table_hint_limited> [...n])

対象のテーブルに設定可能なテーブル ヒントを指定します。キーワード WITH とかっこが必要になります。READPAST、NOLOCK、および READUNCOMMITTED は指定できません。テーブル ヒントの詳細については、「FROM」を参照してください。

view_name

ビューの名前です。view_name によって参照されるビューは更新可能である必要があります。また、そのビュー内の FROM 句で単一のベース テーブルを明示的に参照している必要があります。更新可能なビューの詳細については、「CREATE VIEW」を参照してください。

  テーブルまたはビューが別のデータベースにある場合、または所有者が現在のユーザーでない場合、4 つの要素から成る server_name.database.[owner].object_name という形式の修飾名を使用します。詳細については、「Transact-SQL 構文表記規則」を参照してください。

rowset_function_limited

プロバイダの機能によって、OPENQUERY 関数、または OPENROWSET 関数を指定します。プロバイダが必要とする機能の詳細については、「」を参照してください。行セット関数の詳細については、「OPENQUERY」および「OPENROWSET」を参照してください。

FROM <table_source>

追加の FROM 句を指定します。DELETE に対するこの Transact-SQL 拡張機能によって、<table_sources> のデータを指定し、最初の FROM 句内のテーブルから対応する行を削除できます。

結合を指定するこの拡張機能は、WHERE 句内のサブクエリの代わりに使用し、削除する行を識別できます。

table_name [ [ AS ] table_alias ]
削除操作の基準値を提供するテーブルの名前です。
view_name [ [AS] table_alias ]
削除操作の基準値を提供するビューの名前です。INSTEAD OF UPDATE トリガを伴うビューは、FROM 句を伴う UPDATE の対象にはなりません。
WITH (<table_hint>
1 つ以上のテーブル ヒントを指定します。テーブル ヒントの詳細については、「FROM」を参照してください。
rowset_function [ [ AS ] table_alias ]
行セット関数の名前およびオプションの別名を指定します。行セット関数の一覧の詳細については、「行セット関数」を参照してください。
derived_table [AS] table_alias
データベースから行を取得するサブクエリです。derived_table は 1 つ上のレベルのクエリの入力として使用されます。
column_alias
結果セット内の列名に対する別名です。このパラメータは省略可能です。選択リストの各列の別名を 1 つずつ含みます。列の別名リスト全体をかっこで囲みます。

<joined_table>

2 つ以上のテーブルが組み合わされた結果セットです。たとえば、次のようになります。

SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
    RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
        ON tab3.c1 = tab4.c1
        ON tab2.c3 = tab4.c3

複数の CROSS 結合については、かっこを使って結合の順序を変更できます。

<join_type>

結合演算子の種類を指定します。

INNER
一致するすべての行をペアで返すことを指定します。両方のテーブルで一致しない行は廃棄します。結合タイプを指定しない場合は、これが既定値になります。
LEFT [OUTER]
指定された条件に合わない左側のテーブルのすべての行が結果セットに含まれ、内部結合によって返されるすべての行に加えて、右側のテーブルからの出力列は NULL に設定されることを指定します。
RIGHT [OUTER]
指定された条件に合わない右側のテーブルのすべての行が結果セットに含まれ、内部結合によって返されるすべての行に加えて、左側のテーブルからの出力列は NULL に設定されることを指定します。
FULL [OUTER]
左または右のテーブルからの行が選択条件に一致しない場合は、その行を結果セットに含み、もう一方のテーブルに対応する出力列を NULL に設定することを指定します。これは、内部結合で通常返されるすべての行に追加されるものです。
JOIN
削除操作の中で、SQL-92 形式の結合を使用することを示すキーワードです。

ON <search_condition>

結合するときの条件を指定します。列と比較演算子はよく使用されますが、条件で任意の結合述語を指定できます。たとえば、次のようになります。

FROM Suppliers JOIN Products
    ON (Suppliers.SupplierID = Products.SupplierID)

列に結合条件を指定する場合、使用される列は、同じ列名または同じデータ型である必要はありません。ただし、データ型が異なる場合は、互換性のあるデータ型であるか、Microsoft® SQL Server™ が自動的に変換できるデータ型である必要があります。データ型が自動的に変換されない場合は、CAST 関数を使用して明示的に変換する必要があります。

検索条件および述語の詳細については、「Search Condition」を参照してください。

CROSS JOIN

2 つのテーブルの結合を指定します。SQL-92 形式でない旧形式の結合で WHERE 句が指定されていない場合と同じ行が返されます。

WHERE

削除する行数を制限するときに使用する条件を指定します。WHERE 句を指定しない場合は、DELETE によってテーブルからすべての行が削除されます。WHERE 句に指定される内容によって、削除操作には次の 2 種類があります。

  • 検索結果削除は、削除する行を限定する検索条件を指定します。

  • 位置指定削除は、CURRENT OF 句を使用してカーソルを指定します。削除操作は、カーソルの現在の位置で発生します。これは、WHERE search_condition 句を使用して削除する行を限定する検索結果削除よりも正確です。検索結果削除は、検索条件が 1 つの行を一意に識別しない場合、複数の行を削除します。
<search_condition>
削除する行を制限する条件を指定します。検索条件に含まれる述語の数に制限はありません。詳細については、「Search Condition」を参照してください。
CURRENT OF
指定されたカーソルの現在の位置で DELETE を実行することを指定します。
GLOBAL
cursor_name がグローバル カーソルを意味することを指定します。
cursor_name
フェッチが行われるオープン カーソルの名前です。cursor_name という名前のグローバル カーソルとローカル カーソルの両方がある場合、GLOBAL が指定されると cursor_name はグローバル カーソルを参照します。それ以外の場合、cursor_name はローカル カーソルを参照します。カーソルは、更新可能である必要があります。
cursor_variable_name
カーソル変数の名前です。カーソル変数は、更新できるカーソルを参照する必要があります。

OPTION (<query_hint> [,...n] )

オプティマイザ ヒントを使用して SQL Server のステートメント処理をカスタマイズすることを指定するキーワードです。

{ HASH | ORDER } GROUP
クエリの GROUP BY または COMPUTE 句で指定した集計で、ハッシュ演算または順序付けを使用することを指定します。
{ MERGE | HASH | CONCAT } UNION
UNION セットのマージ、ハッシュ演算、または連結を行うことにより、すべての UNION 演算を実行することを指定します。2 つ以上の UNION ヒントを指定した場合、クエリ オプティマイザは指定されたヒントの中から最もコストのかからない方法を選択します。

  FROM 句の中で、特定の結合テーブルのペアに対して <joint_hint> も指定した場合は、これが、OPTION 句に指定した <join_hint> よりも優先されます。


FAST number_rows
最初の number_rows (負でない整数) を高速検索するためにクエリの最適化を行うことを指定します。最初の number_rows を返した後、クエリは実行を続け、完全な結果セットを作成します。
FORCE ORDER
クエリの構文に示されている結合順序が、クエリの最適化中、保持されることを指定します。
MAXDOP number
このオプションを指定しているクエリに対してのみ、sp_configuremax degree of parallelism 設定オプションを上書きします。MAXDOP クエリ ヒントを使用している場合は、max degree of parallelism 設定オプションで使用されるすべての意味規則を適用できます。詳細については、「」を参照してください。
ROBUST PLAN
パフォーマンスが低下しても、最大行サイズになる可能性のあるプランを強制的にクエリ オプティマイザに実行させます。このようなプランが可能でない場合は、クエリ実行の後でエラー検出を行うのではなく、クエリ オプティマイザがエラーを返します。行が可変長列で構成されている可能性があります。SQL Server では、SQL Server が処理できる範囲を超えた最大可能サイズを持つように、行を定義できます。通常、可能な最大サイズに関係なく、アプリケーションは SQL Server の処理能力で実際に対応できるサイズの行を格納します。SQL Server が長すぎる行を検出した場合は、実行エラーが返されます。

KEEP PLAN

クエリ オプティマイザに対して、クエリの予想再コンパイルしきい値を緩和することを指定します。予想再コンパイルしきい値とは、予想した回数のインデックス列変更 (更新、削除、挿入など) がテーブルに加えられた場合に、クエリを自動的に再コンパイルする時点のことです。KEEP PLAN を指定することによって、テーブルに複数の更新が加えられても、クエリは頻繁に再コンパイルされません。

解説

変更されるオブジェクトが変数 table の場合は、ユーザー定義関数の内側で DELETE を使用できます。

サーバー名として OPENDATASOURCE 関数を使用する、4 つの要素で構成されるテーブル名 (またはビュー名) は、テーブル名を指定できるすべての位置で、テーブル ソースとして使用できます。

DELETE ステートメントは、トリガに違反したり、FOREIGN KEY 制約で別のテーブル内のデータによって参照されている行を削除しようとすると、失敗する可能性があります。DELETE が複数の行を削除するときに、削除される行のいずれかがトリガや制約に違反すると、ステートメントは取り消され、エラーが返されます。行は削除されません。

テーブルやビューを対象とする DELETE 操作で INSTEAD-OF トリガが定義されている場合は、DELETE ステートメントの "代わりに" トリガが実行します。以前のバージョンの SQL Server では、AFTER トリガのみが DELETE およびその他のデータ変更ステートメントでサポートされています。

DELETE ステートメントの中で、式の評価中に算術エラー (オーバーフロー、0 による除算、またはドメイン エラー) が発生すると、SQL Server はこれらのエラーを SET ARITHABORT が ON に設定されているかのように処理します。残りのバッチは取り消され、エラー メッセージが返されます。

SET ROWCOUNT オプションの設定は、リモート テーブルと、ローカルおよびリモート分割ビューに対する DELETE ステートメントでは無視されます。

テーブル内のすべての行を削除するには、DELETE よりも TRUNCATE TABLE の方が高速です。DELETE は、1 行ずつ物理的に行を削除し、削除された各行をトランザクション ログに記録します。TRUNCATE TABLE は、テーブルに関係付けられているすべてのページの割り当てを解除します。このため、TRUNCATE TABLE は DELETE よりも高速で、トランザクション ログの領域が少なくて済みます。TRUNCATE TABLE は、機能的には WHERE 句を伴わない DELETE に相当します。しかし、外部キーで参照されるテーブルで TRUNCATE TABLE を使用することはできません。DELETE も TRUNCATE TABLE も、削除された行が占めている領域を、新しいデータの記憶領域として解放します。

権限

DELETE 権限は、特に指定のない限り固定サーバー ロール sysadmin、固定データベース ロール db_owner、および固定データベース ロール db_datawriter のメンバと、テーブル所有者に与えられます。ロール sysadmindb_owner、および db_securityadmin のメンバとテーブル所有者は、権限をほかのユーザーに譲渡できます。

ステートメントに WHERE 句が含まれる場合は、SELECT 権限も必要です。

A.    パラメータを指定せずに DELETE を使用する

この例では、authors テーブルのすべての行が削除されます。

USE pubs
DELETE authors
B.    行セットに対して DELETE を使用する

この例では、au_lname は一意とは限らないため、au_lname が McBadden であるすべての行が削除されます。

USE pubs
DELETE FROM authors
WHERE au_lname = 'McBadden'
C.    カーソルの現在行で DELETE を使用する

この例では、complex_join_cursor というカーソルに対して行われる削除を示しています。カーソルによって現在フェッチされている 1 行だけが削除されます。

USE pubs
DELETE FROM authors
WHERE CURRENT OF complex_join_cursor
D.    サブクエリに基づいて DELETE を使用する、または Transact-SQL 拡張機能を使用する

この例では、結合または相関サブクエリに基づいて、ベース テーブルの記録を削除するのに、Transact-SQL の拡張機能を使った例を示します。最初の DELETE は、SQL-92 と互換性のあるサブクエリの機能を示し、2 番目の DELETE は Transact-SQL の拡張機能を示します。両方のクエリとも、titles テーブルに格納されているタイトルに基づいて、titleauthors テーブルの行を削除します。

/* SQL-92-Standard subquery */
USE pubs
DELETE FROM titleauthor
WHERE title_id IN
   (SELECT title_id
   FROM titles
   WHERE title LIKE '%computers%')

/* Transact-SQL extension */
USE pubs
DELETE titleauthor
FROM titleauthor INNER JOIN titles
   ON titleauthor.title_id = titles.title_id
WHERE titles.title LIKE '%computers%'
E.    DELETE および TOP 句を伴う SELECT を使用する

DELETE ステートメントの中で SELECT ステートメントを指定できるので、SELECT ステートメントの中で TOP 句を指定することもできます。たとえば、この例では、authors テーブルの先頭の 10 人の著者を削除します。

DELETE authors
FROM (SELECT TOP 10 * FROM authors) AS t1
WHERE authors.au_id = t1.au_id

関連項目

CREATE TABLE

CREATE TRIGGER

DROP TABLE

INSERT

SELECT

TRUNCATE TABLE

UPDATE

表示: