SQLでテーブルに登録したデータを削除するときは、DELETEを使用します。

DELETEを使えば、指定した条件に一致するデータだけを削除したり、テーブル内のデータをすべて削除したりできます。

ただし、DELETEは使い方を間違えると、必要なデータまでまとめて削除してしまう可能性があります。特にWHERE句を付け忘れると、テーブル内のすべてのデータが削除されるため注意が必要です。

この記事では、SQL Server LocalDBSQL Server Management Studioを使って、テーブルの作成、サンプルデータの登録、DELETEによる削除、削除結果の確認までを順番に解説します。

実際にSQLを実行しながら確認できるため、DELETEを初めて使う方でも基本的な流れを理解できます。

この記事でわかること

この記事では、DELETEの構文だけでなく、安全に削除するための確認方法まで理解できる内容です。

  • DELETEの基本的な書き方
  • SQL Server LocalDBへ接続する方法
  • 動作確認用のテーブルを作成する方法
  • サンプルデータを登録する方法
  • WHERE句を使って特定のデータを削除する方法
  • 複数条件に一致するデータを削除する方法
  • トランザクションを使って削除を取り消す方法

動作環境

この記事では、Windows環境でSQL Server LocalDBとSSMSを使う前提で進めます。

バージョンは一例です。環境によって画面表示や細かい操作が異なる場合があります。

項目使用環境
OSWindows 11
SQL ServerSQL Server LocalDB
管理ツールSQL Server Management Studio(SSMS)
接続先(localdb)\MSSQLLocalDB
使用言語SQL

環境構築ができていない場合は、以下を参考にしてください。
また、C#.NETで実行したい方は本記事と以下の記事を見ながら試行してみてください。

完成イメージ

この記事では、商品情報を管理するProductsテーブルを作成します。

Productsテーブルに複数の商品データを登録し、DELETEを使って次の処理を実行します。

  • 商品IDを指定して1件だけ削除する
  • 価格を条件に複数件削除する
  • 複数条件を指定して削除する
  • 削除前後のデータをSELECT文で確認する
  • トランザクションを使って削除を取り消す

最終的には、削除対象を確認してから安全にDELETEを実行できる状態を目指します。

たとえば、以下のデータが登録されている状態から、ProductIdが3の商品だけを削除します。

ProductIdProductNamePriceStock
1ノートパソコン12000010
2マウス300050
3キーボード800030
4モニター3500015
5USBメモリ20000

DELETEの実行後は、ProductIdが3のキーボードだけが削除され、ほかの商品は残ります。

DELETEの実践

ここからは、SSMSを操作しながらDELETEを実行する手順を解説します。

SQLを初めて実行する場合は、途中の手順を飛ばさず、上から順番に進めてください。

学習用データベースを作成する

まずは、DELETEを試すためのデータベースを作成します。

今回は、SQL操作を練習するためのDeleteDBを使用します。

SSMSで新しいクエリを開き、以下のSQLを実行します。

CREATE DATABASE DeleteDB;

実行後、左側のデータベース一覧を更新すると、DeleteDBが表示されます。

DeleteDBの作成画像

※オブジェクトエクスプローラーに表示されない場合は、「データベース」を右クリックして「最新の情報に更新」を選択してください。

使用するデータベースを指定する

データベースを作成しただけでは、どのデータベースに対してSQLを実行するのか決まっていない場合があります。

USE文を使って、操作対象をDeleteDBへ切り替えます。

USE DeleteDB;

実行後、クエリエディター上部のデータベース選択欄がDeleteDBになっていることを確認してください。

使用するデータベースの確認

データベースを間違えると、別のデータベースにテーブルを作成したり、意図しないテーブルを操作したりする可能性があります。

そのため、SQLを実行する前に現在選択されているデータベース名を確認する習慣を付けておくと安全です。

Productsテーブルを作成する

続いて、商品情報を保存するProductsテーブルを作成します。

今回は、商品ID、商品名、価格、在庫数を管理します。

ProductIdは主キーとして設定し、商品を一意に識別できるようにします。

USE DeleteDB;

CREATE TABLE Products
(
    ProductId INT PRIMARY KEY,
    ProductName NVARCHAR(100) NOT NULL,
    Price INT NOT NULL,
    Stock INT NOT NULL
);

各カラムの役割は次のとおりです。

カラム名データ型内容
ProductIdINT商品ID
ProductNameNVARCHAR(100)商品名
PriceINT商品価格
StockINT在庫数

ProductNameには日本語を保存するため、NVARCHAR型を使用しています。

また、すべてのカラムにNOT NULLを設定しているため、値を省略した状態ではデータを登録できません。

テーブルを作成すると画像のようになります。

テーブル作成画像

サンプルデータを登録する

Productsテーブルを作成したら、DELETEを試すためのデータを登録します。

5件の商品データをまとめてINSERT文で追加します。

INSERT INTO Products
(
    ProductId,
    ProductName,
    Price,
    Stock
)
VALUES
    (1, N'ノートパソコン', 120000, 10),
    (2, N'マウス', 3000, 50),
    (3, N'キーボード', 8000, 30),
    (4, N'モニター', 35000, 15),
    (5, N'USBメモリ', 2000, 0);

日本語の文字列の前には、Nを付けています。
SQL ServerでNVARCHAR型へUnicode文字列を登録するときは、Nを付けて文字化けを防ぐのが基本です。

データ登録後、次のSELECT文を実行します。

SELECT
    ProductId,
    ProductName,
    Price,
    Stock
FROM Products;

実行結果に5件の商品が表示されれば、準備は完了です。

サンプルデータの登録

DELETEの基本構文を確認する

DELETEは、テーブルからデータを削除するためのSQLです。

基本構文は次のとおりです。

DELETE FROM テーブル名
WHERE 条件;

WHERE句には、削除するデータを絞り込む条件を指定します。

たとえば、ProductsテーブルからProductIdが3のデータを削除する場合は、次のように記述します。

DELETE FROM Products
WHERE ProductId = 3;

DELETEを構成する主な要素は次のとおりです。

要素役割
DELETE FROMデータを削除する命令
Products削除対象のテーブル
WHERE削除対象を絞り込む条件
ProductId = 3商品IDが3の行を指定

WHERE句を指定しない場合、テーブル内のすべてのデータが削除されます。

削除対象をSELECT文で確認する

DELETEを実行する前に、削除対象が正しいか確認します。

DELETEのWHERE句と同じ条件をSELECT文に指定することで、実際に削除されるデータを事前確認できます。

SELECT
    ProductId,
    ProductName,
    Price,
    Stock
FROM Products
WHERE ProductId = 3;

実行結果に、次のキーボードのデータだけが表示されることを確認します。

削除対象をSELECT文で確認する

意図していないデータが表示された場合は、DELETEを実行してはいけません。

ProductIdを指定して1件削除する

削除対象が正しいことを確認したら、DELETEを実行します。

今回は、ProductIdが3のキーボードを1件だけ削除します。

DELETE FROM Products
WHERE ProductId = 3;

実行後は、必ずSELECT文で現在のデータを確認します。

SELECT
    ProductId,
    ProductName,
    Price,
    Stock
FROM Products;

ProductIdが3のキーボードが表示されなければ、削除は完了です。

ProductIdを指定して1件削除する

数値条件を指定して複数件削除する

WHERE句には、完全一致だけでなく比較演算子も使用できます。

たとえば、価格が5000円未満の商品を削除する場合は、次のように記述します。

条件に一致するデータが複数ある場合は、複数行がまとめて削除されます。

削除前に、SELECT文で対象を確認します。

SELECT
    ProductId,
    ProductName,
    Price,
    Stock
FROM Products
WHERE Price < 5000;

対象が正しいことを確認したら、DELETEを実行します。

DELETE FROM Products
WHERE Price < 5000;

この条件では、価格が5000円未満のマウスとUSBメモリが削除対象になります。

数値条件を指定して複数件削除する

比較条件を使用するときは、境界値を含むかどうかに注意してください。

演算子意味
=等しい
<>等しくない
>より大きい
>=以上
<より小さい
<=以下

たとえば、5000円以下を削除したい場合は、5000未満ではなく以下の条件を使います。

WHERE Price <= 5000

文字列を条件にして削除する

商品名などの文字列を条件にして削除することもできます。

今回は、商品名がモニターのデータを削除します。

文字列はシングルクォーテーションで囲んで指定します。

まずは削除対象を確認します。

SELECT
    ProductId,
    ProductName,
    Price,
    Stock
FROM Products
WHERE ProductName = N'モニター';

対象が正しいことを確認したら、DELETEを実行します。

DELETE FROM Products
WHERE ProductName = N'モニター';

日本語を含む文字列では、Nを付けてUnicode文字列として指定しています。

文字列を条件にして削除する

商品名が完全に一致しない場合は削除されません。全角・半角や空白の違いによって一致しないこともあるため、登録されている実際の値をSELECT文で確認してください。

※ここまで前から順に行っていると、テーブルデータがノートパソコンのみになっているため、データを追加することを推奨します。

ANDを使って複数条件を指定する

複数の条件をすべて満たすデータを削除するときは、ANDを使用します。

たとえば、価格が10000円未満かつ在庫数が0の商品を削除する場合は、次のように記述します。

ANDでつないだ条件は、すべて満たしたデータだけが対象です。

SELECT
    ProductId,
    ProductName,
    Price,
    Stock
FROM Products
WHERE Price < 10000
AND Stock = 0;

削除対象を確認したら、DELETEへ変更します。

DELETE FROM Products
WHERE Price < 10000
AND Stock = 0;

今回のサンプルデータでは、価格が2000円で在庫数が0のUSBメモリが対象です。

ANDを使って複数条件を指定する

※データをリセットしてから実行しています。

条件を増やすほど削除対象を細かく絞り込めますが、条件の組み合わせが正しいか事前確認することが重要です。

ORを使って複数条件のどちらかを指定する

複数の条件のうち、いずれかを満たすデータを削除するときはORを使用します。

たとえば、ProductIdが2またはProductIdが4の商品を削除する場合は、次のように記述します。

ORは条件のどちらか一方でも一致すれば削除対象になります。

SELECT
    ProductId,
    ProductName,
    Price,
    Stock
FROM Products
WHERE ProductId = 2
   OR ProductId = 4;

対象データを確認したら、DELETEを実行します。

DELETE FROM Products
WHERE ProductId = 2
   OR ProductId = 4;

IDを複数指定する場合は、IN句を使って次のように書くこともできます。

DELETE FROM Products
WHERE ProductId IN (2, 4);

IN句を使うと、対象となる値が増えた場合でも条件を読みやすくできます。

ORを使って複数条件のどちらかを指定する

ただし、対象IDの入力ミスを防ぐため、IN句を使う場合もSELECT文で事前確認してください。

すべてのデータを削除する

WHERE句を付けずにDELETEを実行すると、テーブル内のすべてのデータが削除されます。

テーブル自体は残りますが、登録されている行はすべてなくなります。

DELETE FROM Products;

このSQLを実行した後にSELECT文を実行すると、Productsテーブルの結果は0件になります。

SELECT
    ProductId,
    ProductName,
    Price,
    Stock
FROM Products;

WHERE句のないDELETEは、初期データの作り直しやテストデータの削除などで使用できます。

すべてのデータを削除する

ただし、本番環境では重大なデータ消失につながる可能性があります。

トランザクションを使って削除を取り消す

DELETEの動作を確認したい場合は、トランザクションを使用すると安全です。

トランザクションを開始してからDELETEを実行し、ROLLBACKを実行すると、削除前の状態へ戻すことができます。

まず、動作確認用のデータを登録し直します。

DELETE FROM Products;

INSERT INTO Products
(
    ProductId,
    ProductName,
    Price,
    Stock
)
VALUES
    (1, N'ノートパソコン', 120000, 10),
    (2, N'マウス', 3000, 50),
    (3, N'キーボード', 8000, 30),
    (4, N'モニター', 35000, 15),
    (5, N'USBメモリ', 2000, 0);

次に、トランザクション内でProductIdが3のデータを削除します。

BEGIN TRANSACTION;

DELETE FROM Products
WHERE ProductId = 3;

SELECT
    ProductId,
    ProductName,
    Price,
    Stock
FROM Products;

DELETEの直後に実行したSELECT文では、ProductIdが3のデータが表示されません。

トランザクションを使って削除を取り消す前

しかし、以下を実行すると、削除処理が取り消されます。

ROLLBACK TRANSACTION;

ROLLBACK後に再度SELECT文を実行します。

SELECT
    ProductId,
    ProductName,
    Price,
    Stock
FROM Products;

ProductIdが3のデータが再び表示されれば、ロールバックは成功しています。

トランザクションを使って削除を取り消す後

削除内容に問題がなく、変更を確定する場合は、ROLLBACKではなくCOMMITを使用します。

BEGIN TRANSACTION;

DELETE FROM Products
WHERE ProductId = 3;

COMMIT TRANSACTION;

COMMITを実行すると削除内容が確定するため、実行前に対象データを十分に確認してください。

削除件数を確認する

DELETEを実行した直後は、SQL Serverのシステム変数を使って削除件数を確認できます。

@@ROWCOUNTを使うと、直前に実行したSQLによって処理された行数を取得できます。

DELETE FROM Products
WHERE Price < 10000;

SELECT @@ROWCOUNT AS DeletedCount;

たとえば、削除対象が3件だった場合は、DeletedCountに3が表示されます。

削除件数を確認する

ただし、@@ROWCOUNTは直前のSQLの結果を返します。

DELETEと@@ROWCOUNTの間に別のSELECT文などを実行すると、そのSQLの件数に変わる可能性があります。

そのため、DELETEの直後に@@ROWCOUNTを実行してください。

よくあるエラー・注意点

DELETEでは、構文エラーだけでなく、条件の指定ミスによる誤削除にも注意が必要です。

特に重要なのは、SQLが正常終了したことと、意図したデータだけを削除できたことは別という点です。

エラー・問題主な原因対処法
WHERE句を付けずに全件削除した削除条件を省略した実行前にSELECT文で対象を確認し、必要に応じてトランザクションを使用する
無効なオブジェクト名と表示されるテーブル名が違う、または別のデータベースを選択しているUSE文とテーブル名を確認する
削除件数が0件になるWHERE条件に一致するデータが存在しない同じWHERE条件を使ったSELECT文で確認する
文字列条件で削除できない全角・半角、空白、文字列の違いがある実際の登録値をSELECT文で確認する
DELETEで構文エラーになるFROMやWHEREの記述が間違っているDELETE FROM テーブル名 WHERE 条件の順番を確認する
DELETEが長時間終わらない大量データを削除している、ロックが発生している削除対象を分割し、実行中のトランザクションやロックを確認する
外部キー制約エラーが発生する別テーブルから削除対象の行が参照されている関連データや外部キー制約を確認する
ROLLBACKしても戻らないすでにCOMMITした、またはトランザクション外で実行したBEGIN TRANSACTIONからROLLBACKまでを同じ接続内で実行する
同じIDを再登録できないデータが残っている、主キーが重複しているSELECT文で既存データを確認する
SSMSにテーブルが表示されないオブジェクトエクスプローラーが更新されていない対象フォルダを右クリックして「最新の情報に更新」を実行する

WHERE句の付け忘れに注意する

DELETEでもっとも注意すべき点は、WHERE句の付け忘れです。

次のSQLを実行すると、Productsテーブル内のデータがすべて削除されます。

エラーにはならず、正常なSQLとして実行される点が特に危険です。

DELETE FROM Products;

全件削除を目的としていない場合は、必ずWHERE句を指定します。

また、DELETEを実行する前に、WHERE句を付けたSELECT文で対象件数を確認してください。

DELETEではカラム単位の削除はできない

DELETEは、テーブルから行単位でデータを削除するSQLです。

特定のカラムだけを空にする用途には使用できません。

たとえば、商品名を残したまま在庫数だけを変更したい場合は、DELETEではなくUPDATE文を使用します。

UPDATE Products
SET Stock = 0
WHERE ProductId = 1;

値自体を未設定にしたい場合は、カラムがNULLを許可していればNULLへ更新できます。

UPDATE Products
SET Stock = NULL
WHERE ProductId = 1;

ただし、今回のProductsテーブルではStockにNOT NULLを設定しているため、NULLは登録できません。

行を消す場合はDELETE、値を変更する場合はUPDATEと覚えておきましょう。

外部キーが設定されているデータは削除できない場合がある

削除対象のデータが別のテーブルから参照されている場合、外部キー制約によってDELETEが失敗することがあります。

たとえば、Productsテーブルの商品をOrderDetailsテーブルが参照している状態では、参照されている商品を直接削除できない場合があります。

この場合は、次の点を確認してください。

  • 関連する子テーブルのデータ
  • 外部キー制約の設定
  • ON DELETE CASCADEの有無
  • 削除する順番

ON DELETE CASCADEが設定されている場合、親データを削除すると関連する子データも削除される可能性があります。

設定内容はデータベースによって異なるため、削除前にテーブル間の関連を確認する必要があります。

DELETEとDROPの違いに注意する

DELETEとDROPは、どちらも削除に関係するSQLですが、削除する対象が異なります。

DELETEはデータを削除し、DROPはテーブル自体を削除します。

SQL削除対象テーブル構造
DELETEテーブル内の行残る
DROP TABLEテーブルそのもの削除される

DELETEでは、テーブルのカラムや主キーなどの構造は残ります。

DELETE FROM Products;

DROP TABLEを実行すると、テーブル自体がなくなります。

DROP TABLE Products;

DROP TABLEを実行した後は、Productsテーブルに対してSELECT文やINSERT文を実行できません。

そのため、データだけを消したい場合にDROP TABLEを使用しないよう注意してください。

DELETEとTRUNCATE TABLEの違いに注意する

テーブル内の全データを削除する方法には、DELETEのほかにTRUNCATE TABLEがあります。

どちらも全件削除に使用できますが、動作には違いがあります。

条件を指定して一部だけ削除したい場合はDELETEを使用します。

比較項目DELETETRUNCATE TABLE
WHERE句使用できる使用できない
一部データの削除できるできない
全件削除できるできる
IDENTITYの値通常はリセットされない通常は初期値へ戻る
外部キーの影響制約に従って実行制約によって実行できない場合がある
トリガーDELETEトリガーが動作するDELETEトリガーは通常動作しない

今回のProductsテーブルにはIDENTITYを使用していませんが、自動採番を使用しているテーブルでは結果が異なることがあります。

また、TRUNCATE TABLEの利用可否やトランザクションの動作は、データベース製品によって異なります。

SQL Serverで使用する場合も、実行前に制約やテーブル構成を確認してください。

まとめ

この記事では、SQL Server Management Studioを使ってDELETEを実行する方法を解説しました。

DELETEを使うと、条件に一致するデータだけを削除できます。

一方で、WHERE句を付け忘れるとテーブル内のすべてのデータが削除されます。そのため、DELETEは実行前の確認が特に重要なSQLです。

重要なポイントを整理します。

  • DELETEはテーブル内の行を削除する
  • WHERE句で削除対象を指定する
  • WHERE句を省略すると全件削除になる
  • 実行前にSELECT文で削除対象を確認する
  • 複数条件にはANDやORを使用する
  • トランザクションを使うとROLLBACKで削除を取り消せる
  • 削除後はSELECT文と削除件数を確認する

DELETEを理解した後は、INSERT文、UPDATE文、トランザクション、外部キー制約について学ぶと、SQLによるデータ操作をより安全に行えるようになります。