sql >> データベース >  >> RDS >> Sqlserver

SQL Serverの削除ステートメント:テーブルから1つまたは複数の行を削除する方法

    データを削除するためのDELETEステートメントの適切な適用は非常に重要であり、多くの問題が伴います。それでも、そのようなすべてのタスクを簡素化するDELETEステートメントの使用法の標準的な方法があります。

    この記事では、DELETEステートメントを正しく使用するための最も役立つヒントを提供するために、いくつかのプロのライフシナリオについて説明します。さまざまな方法でテーブルからデータを削除できます。実用的な例で説明されているSQLServerのDELETEとTRUNCATEの違いを調べてください。

    T-SQL 削除 コマンド 基本

    まず、可能な限り簡単な方法でT-SQLDeleteステートメントに精通する必要があります。

    Deleteステートメントは、その名前が示すように、データベーステーブルからデータを削除するのに役立つステートメントです。

    テーブル は、データを格納するためにデータベースに作成する構造です。たとえば、本のテーブルを作成して、それらの本に関連するレコードを保存できます。

    データベース は、データとそのデータを保持するためのデータ構造の組織化されたコレクションです。つまり、データはデータベース内にテーブルの形式で保存できます。

    1行または複数行を削除する方法

    deleteステートメントを使用して、テーブルから1つ以上のレコード(一般に行と呼ばれる)を削除できます。

    Deleteステートメントは、テーブルから一部またはすべてのデータ(行)を削除します。

    Microsoftのドキュメントによると、DeleteステートメントはSQLServerのテーブルまたはビューから1つ以上の行を削除します。

    このステートメントが、テーブルからデータ(行)の一部またはすべてを削除するかどうかをどのように定義するのか不思議に思うかもしれません。答えは、削除する必要があるものを指定する基準または条件にあります。

    SQLServerのコマンドを削除

    ステートメントの最も単純な構文は次のとおりです。

    Delete FROM <TableName> WHERE <Condition>

    テーブル名と、テーブルからデータ(行)を削除するための基準/条件を指定する必要があります。

    注:条件の要件は必須ではありませんが、条件(WHERE句)を指定してDELETEステートメントを使用することが重要です。

    WHERE条件なしでDELETEtableコマンドを実行すると、テーブルからすべての行(データ)が削除されます。したがって、すべての行を削除する場合を除いて、WHERE条件を使用することを習慣にしてください。

    互換性

    このステートメントは、次のようなSQLServerの多くのバージョンと互換性があります。

    1. SQLServer2012以降のバージョン。
    2. クラウドベースのSQLServerデータベース(Azure SQLデータベース)。
    3. クラウドベースのSQLデータウェアハウス(Azure Synapse Analytics)。

    テーブルから行を削除するためのステップバイステップのチェックリスト

    次に、いくつかの実際的なシナリオでDeleteステートメントの使用法を調べます。

    手順の概要

    1. サンプルデータベースを設定します。
    2. データを表示します。
    3. データを削除します。
    4. より多くのデータをテーブルに挿入し直します。
    5. 削除する前にデータを表示します。
    6. 条件に基づいて列のデータを削除する方法。
    7. 削除後のデータを表示します。
    8. より多くのデータをテーブルに挿入し直します。
    9. 削除する前にデータを表示します。
    10. 別の条件に基づいてデータを削除します。
    11. 削除後のデータを表示します。
    12. データをテーブルに挿入し直します。
    13. 今回は2つの条件に基づいてデータを削除します。
    14. 削除後のデータを表示します。

    サンプルデータベースのセットアップ(BooksSample)

    スクリプトをテストして実行するには、サンプルデータベースが必要です。まず、次の手順をカバーして、そのサンプルデータベースを設定する必要があります。

    1. サンプルデータベースを作成します。
    2. サンプルデータベースにテーブルを作成します。
    3. データ(2行)をデータベーステーブルに挿入します。

    SQL ServerManagementStudioまたはdbForgeStudiofor SQL Serverを開き、次のスクリプトを実行してサンプルデータベースをセットアップします。

    -- Connect to the 'master' database to run this snippet
    USE master
    GO
    -- Create a new database if it does not already exist
    IF NOT EXISTS (
        SELECT [name]
    FROM sys.databases
    WHERE [name] = N'BooksSample'
    )
    CREATE DATABASE BooksSample
    GO
    
    USE BooksSample
    
    -- Create the table book
    CREATE TABLE [dbo].[Book]
    (
        [BookNumber] INT NOT NULL PRIMARY KEY,-- Primary Key column
        [Title] VARCHAR(150) NOT NULL,
        [Stock] SMALLINT NOT NULL
        
    );
    GO
    
    -- Insert rows into table 'Book' 
    INSERT INTO [dbo].[Book]
        ( -- Columns to insert data into
        [BookNumber], [Title], [Stock]
        )
    VALUES
        ( -- First row: values for the columns in the list above
            1, 'Learn SQL in 7 Days', 50
    ),
        ( -- Second row: values for the columns in the list above
            2, 'Creating Databases in Minutes', 50
    );
    
    GO
    

    データを表示する(ブックテーブル)

    データベースに最近作成され、入力されたテーブルを表示してみましょう。以下のスクリプトを実行します:

    -- View data (rows) from the table (Book)
    SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b
    

    出力は次のとおりです。

    表(本)の2行を見ることができます。現時点では、これらはすべてこのテーブルに存在するデータです。

    データを削除する

    覚えているように、正しい削除の条件/基準について言及し忘れると、テーブル内のすべての行が削除されるリスクがあります。

    偶発的なデータ損失を避けるために、常にWHERE句をDeleteステートメントとともに使用してください。唯一の例外は、すべてのデータを意図的に削除する必要がある場合です。

    サンプルデータベーステーブルからすべてのデータ(行)を削除するには、次のスクリプトを実行します。

    -- Delete all the data (rows) from the table Book
    DELETE FROM dbo.Book
    

    出力は次のとおりです。

    削除後のデータを表示

    次に、すべての行が削除されているかどうかを確認する必要があります。

    -- View data (rows) from the table (Book)
    SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b
    

    結果は次のとおりです。

    このようにして、からすべての行を正常に削除しました。 テーブル。そのために、削除基準/条件なしでDELETEステートメントを適用しました。

    データをテーブルに挿入し直します(同じタイトルで)

    データ(行)をテーブルに挿入し直してから、いくつかの条件/基準に基づいてDELETEステートメントを適用できます。

    今回は、より多くの行を挿入することを選択しましたが、意図的に同じタイトルを付けています:

    -- Insert rows into table 'Book' 
    INSERT INTO [dbo].[Book]
        ( -- Columns to insert data into
        [BookNumber], [Title], [Stock]
        )
    VALUES
        ( -- First row: values for the columns in the list above
            1, 'Learn SQL in 7 Days', 50
    ),
        ( -- Second row: values for the columns in the list above
            2, 'Creating Databases in Minutes', 50
    ),
    	( -- Third row: values for the columns in the list above
            3, 'Creating Databases in Minutes', 50
    ),
        ( -- Fourth row: values for the columns in the list above
            4, 'Creating Databases in Minutes', 50
    );
    
    GO
    

    出力は次のとおりです。

    :削除または変更されたデータを復元するには、専用のソフトウェアソリューションを使用できます。 dbForgeトランザクションログソリューションを使用すると、これらのデータを復元し、誰がいつ削除または変更したかを確認できます。

    削除する前にデータを表示する

    データを表示するには、次のスクリプトを実行します。

    -- View data (rows) from the table (Book)
    SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b
    

    出力は次のとおりです。

    この出力は、同じ本のタイトルの3つの行を誤って挿入したことを示しています。それは問題です。簡単な解決策は、不要な行を削除し、重複するタイトルの行を削除するための特定の条件を適用することです。

    条件(BookNumber)に基づいてSQL列のデータを削除する方法

    重要:この問題を解決するには、次のいずれかの方法を検討する場合があります。

    1. BookNumberで削除
    2. タイトルで削除

    私のシナリオでは、タイトルで削除しないことを選択します。タイトルで削除すると、保持する必要のある行を含め、そのタイトルを含むすべての行が削除されます。したがって、推奨されるアプローチは、 BookNumberに基づいてテーブルを削除することです。 列。

    結果セットを見ると、 BookNumber:3であることが簡単にわかります。 およびBookNumber:4 重複する行です。以前は、SQLで重複を削除する方法について詳しく説明しました。データベースの一貫性を保つために、それらを削除する必要があります。

    ここでも、次のオプションが発生します。

    1. ブック番号(BookNumber)が2より大きい場所を削除します。
    2. BookNumberが3と4の場所を削除します。

    最初のオプションを選択しましょう。ただし、重複する行の後に行がない場合にのみ有効であることに注意してください。

    次のスクリプトを実行します。

    -- Delete all the data (rows) from the table Book where BookNumber is greater than 2
    DELETE FROM dbo.Book
    WHERE BookNumber>2
    

    削除後のデータを表示

    データを削除した後、テーブルを確認しましょう:

    -- View data (rows) from the table (Book)
    SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b
    

    出力は次のとおりです。

    より多くのデータをテーブルに挿入します(より多くの在庫)

    株式に関連するより多くのデータ(行)を配置するには、次のスクリプトを使用します。

    -- Insert rows into table 'Book' 
    INSERT INTO [dbo].[Book]
        ( -- Columns to insert data into
        [BookNumber], [Title], [Stock]
        )
    VALUES
        ( -- First row: values for the columns in the list above
            3, 'Basic Data Structures', 60
    ),
        ( -- Second row: values for the columns in the list above
            4, 'Advanced Data Structures', 0
    )
    GO
    

    削除する前にデータを表示する

    表をご覧ください:

    -- View data (rows) from the table (Book)
    SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b
    

    出力は次のとおりです。

    別の条件に基づいてデータを削除する

    データベースにより正確な情報を保持するために、在庫切れの本を削除する必要があると想定します。これを行うには、Stockが0の行を探す必要があります。

    Stockに基づく条件でDELETEステートメントを使用できます。 列値0:

    -- Delete all the out of stock (Where Stock is 0) books (rows) from the table Book 
    DELETE FROM dbo.Book
    WHERE Stock=0
    

    削除後のデータを表示

    -- View data (rows) from the table (Book)
    SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b
    

    より多くのデータをテーブルに挿入(より多くのタイトルとストック)

    テーブルにさらに2つの行を追加しています:

    -- Insert rows into table 'Book' 
    INSERT INTO [dbo].[Book]
        ( -- Columns to insert data into
        [BookNumber], [Title], [Stock]
        )
    VALUES
        ( -- First row: values for the columns in the list above
            4, 'Learn Azure SQL Database in 10 Days', 0
    ),
        ( -- Second row: values for the columns in the list above
            5, 'Azure SQL Database Concepts', 1
    )
    GO
    

    削除する前にデータを表示する

    要件に基づいて、さらに何かを削除する前に行を確認してください:

    -- View data (rows) from the table (Book)
    SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b
    

    テーブルの出力は次のとおりです。

    2つの条件に基づいてデータを削除する

    今回は、すべてのを削除する必要があります (行)タイトルに SQLという単語が含まれている場合 在庫がありません(在庫値は0です)。

    つまり、SQL関連の在庫切れの本をすべて削除します。

    この場合、DELETEステートメントで複数の条件を指定する必要があります。在庫切れの本と、タイトルにSQLという単語が含まれている本だけを削除するようにする必要があります。

    次のスクリプトを表示します:

    -- Delete all the out of stock (Where Stock is 0) SQL related (Title contains SQL) books (rows) from the table Book 
    DELETE FROM dbo.Book
    WHERE Title LIKE '%SQL%' and Stock=0
    

    削除後のデータを表示

    最後にデータを表示します:

    重要なヒント :データを削除する前に、削除に使用するのと同じ条件に基づいてSELECTステートメントを実行します。このようにして、削除アクティビティが正しいデータに適用されるようにします。

    たとえば、最初にSELECTクエリを実行して、削除を目的とした行のみを取得していることを確認します。

    SELECT * FROM dbo.Book
    WHERE Title LIKE '%SQL%' and Stock=0
    

    自信がついたら、SELECTをDELETEステートメントに変えることができます。

    DELETE FROM dbo.Book
    WHERE Title LIKE '%SQL%' and Stock=0
    

    おめでとうございます!

    要件に応じて、テーブルから1つ以上の行を削除(削除)するタスクを正常にマスターしました。

    高度な削除シナリオや、DELETEステートメントの使用に関するその他の専門的なヒントについては連絡を取り合ってください。

    やるべきこと

    テーブルから行を正常に削除できるようになったので、スキルをさらにトレーニングして向上させることができます。

    1. 在庫にアイテムが1つしかない行を削除してみてください。
    2. タイトルにStructureという単語が含まれているすべての書籍を削除します。
    3. 本番号(BookNumber)1を除くすべての本(行)を削除します。

    SQLDELETEステートメントに関するより高度なシナリオをご覧ください。


    1. 現実的なテストデータをTeradataに入力するDeNovo

    2. Oracle regexp_replaceによってスペースで区切られたリストから重複を削除するにはどうすればよいですか?

    3. 問題セット2–エンティティと属性の特定

    4. RACでのSYSパスワードの変更