Share via


DELETE の使用による行の削除

更新 : 2006 年 4 月 14 日

DELETE ステートメントは、テーブルやビューの 1 つ以上の行を削除する場合に使用します。

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 AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO

次の例では、ProductCostHistory テーブルから StandardCost 列の値が 1000.00 より大きいすべての行が削除されます。

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

次の例は、結合または相関サブクエリに基づくベース テーブルからレコードを削除するために使用する Transact-SQL 拡張機能を示します。最初の DELETE ステートメントは SQL-2003 と互換性のあるサブクエリ ソリューションを示し、2 つ目の DELETE ステートメントは Transact-SQL 拡張機能を示しています。両方のクエリにより、SalesPerson テーブルに格納されている今年に入ってからの売上高に基づいて SalesPersonQuotaHistory テーブルから行が削除されます。

-- SQL-2003 Standard subquery

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
WHERE SalesPersonID IN 
    (SELECT SalesPersonID 
     FROM Sales.SalesPerson 
     WHERE SalesYTD > 2500000.00);
GO

-- Transact-SQL extension
USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
FROM Sales.SalesPersonQuotaHistory AS spqh
    INNER JOIN Sales.SalesPerson AS sp
    ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO

参照

概念

結果セット内の行の削除
TRUNCATE TABLE の使用による全行削除
TOP の使用による削除行数の制限

その他の技術情報

DROP TABLE (Transact-SQL)
DELETE (Transact-SQL)
テーブル内のデータの削除

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 4 月 14 日

新しい内容 :
  • 「ヒープからの行の削除」を追加しました。