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

SQLServerCRUDの操作

    データベースプログラミングには、次の4つの基本的な操作があります。 create 読む 更新 、および削除 CRUD オペレーション。これらはデータベースプログラミングの最初のステップです。

    CRUDという用語は、JamesMartinの著書「ManagingtheDatabaseEnvironment」に最初に登場しました。それ以来、この用語は一般的になりました。この記事では、操作の構文が他のリレーショナルデータベースやNoSQLデータベースと異なる可能性があるため、SQLServerの観点からCRUD操作について説明します。

    準備

    リレーショナルデータベースの主なアイデアは、データをテーブルに格納することです。テーブルデータの読み取り、挿入、削除が可能です。このように、CRUD操作はテーブルデータを操作します。

    C C REATE 行をテーブルに挿入
    R R EAD テーブルから行を読み取る(選択する)
    U U PDATE テーブルの行を編集する
    D D ELETE テーブルから1行を削除

    CRUDの操作を説明するために、データテーブルが必要です。作成しましょう。 3つの列のみが含まれます。最初の列には国名が格納され、2番目の列にはこれらの国の大陸が格納され、最後の列にはこれらの国の人口が格納されます。 T-SQLステートメントを使用してこのテーブルを作成し、 TblCountryというタイトルを付けることができます。

    CREATE TABLE [dbo].[TblCountry]
    (
    	[CountryName]		VARCHAR(50), 
        [ContinentNames]	VARCHAR(50) NULL, 
        [CountryPopulation]		BIGINT NULL 
    )
    

    それでは、 TblCountryで実行されたCRUD操作を確認しましょう。 テーブル。

    C –作成

    テーブルに新しい行を追加するには、 INSERT INTOを使用します 指図。このコマンドでは、ターゲットテーブルの名前を指定する必要があり、列名を角かっこで囲んでリストします。ステートメント構造はVALUESで終わる必要があります:

    INSERT INTO TblCountry  
    (CountryName,ContinentNames,CountryPopulation) 
    VALUES   ('Germany','Europe',8279000 )
    

    テーブルに複数の行を追加するには、次のタイプのINSERTステートメントを使用できます。

    INSERT INTO TblCountry  
    (CountryName,ContinentNames,CountryPopulation) 
    VALUES   
    ('Germany','Europe',8279000 ), 
    ('Japan','Asia',126800000 ),
    ('Moroco','Africa',35740000)
    

    INTOに注意してください キーワードはオプションであり、挿入ステートメントで使用する必要はありません。

    INSERT  TblCountry  
    (CountryName,ContinentNames,CountryPopulation) 
    VALUES   
    ('Germany','Europe',8279000 ), 
    ('Japan','Asia',126800000 ),
    ('Moroco','Africa',35740000)
    

    また、次の形式を使用して、テーブルに複数の行を挿入できます。

    INSERT INTO TblCountry
    SELECT 'Germany','Europe',8279000 
    UNION ALL
    SELECT 'Japan','Asia',126800000 
    UNION ALL
    SELECT 'Moroco','Africa',35740000
    

    次に、ソーステーブルから宛先テーブルにデータを直接コピーします。このメソッドは、INSERTINTO…SELECTとして知られています。 ステートメント。

    INSERT INTO…SELECTでは、ソーステーブルと宛先テーブルのデータ型を一致させる必要があります。次のINSERTINTO…SELECTステートメントでは、 SourceCountryTblのデータを挿入します。 TblCountryへのテーブル テーブル。

    最初に、いくつかの合成データを SourceCountryTblに挿入します このデモンストレーションの表。

    DROP TABLE IF EXISTS [SourceCountryTbl]
    CREATE TABLE [dbo].[SourceCountryTbl]
    (
    	[SourceCountryName]		VARCHAR(50), 
        [SourceContinentNames]	VARCHAR(50) NULL, 
        [SourceCountryPopulation]		BIGINT NULL 
    	
    )
    
    
    INSERT INTO [SourceCountryTbl] 
    VALUES 
    ('Ukraine','Europe',44009214  ) ,
    ('UK','Europe',66573504) ,
    ('France','Europe',65233271)
    

    次に、INSERTINTO…SELECTステートメントを実行します。

    INSERT INTO TblCountry
    SELECT * FROM SourceCountryTbl
    

    上記の挿入ステートメントは、すべての SourceCountryTblを追加しました TblCountryへのデータ テーブル。 WHEREを追加することもできます selectステートメントをフィルタリングする句。

    INSERT INTO TblCountry
    SELECT * FROM SourceCountryTbl WHERE TargetCountryName='UK'
    

    SQL Serverでは、INSERTINTO…SELECTステートメントでテーブル変数(一時テーブルデータをローカルスコープに格納するのに役立つオブジェクト)を使用できます。次のデモンストレーションでは、テーブル変数をソーステーブルとして使用します。

      DECLARE @SourceVarTable AS TABLE
      ([TargetCountryName]		VARCHAR(50), 
        [TargetContinentNames]	VARCHAR(50) NULL, 
        [TargetCountryPopulation]		BIGINT NULL 
       )
    
    
        INSERT INTO @SourceVarTable 
         VALUES 
         ('Ukraine','Europe',44009214  ) ,
         ('UK','Europe',66573504) ,
         ('France','Europe',65233271)
    
    
    INSERT INTO TblCountry
    SELECT * FROM @SourceVarTable
    

    ヒント :Microsoftは、SQLServer2016の並列挿入の機能を発表しました。 。この機能により、並列スレッドでINSERT操作を実行できます。

    TABLOCKを追加した場合 挿入ステートメントの最後にヒントを与えると、SQL Serverは、サーバーの最大並列度または並列処理パラメーターのコストしきい値に応じて、処理実行プランとの並列処理を選択できます。

    並列挿入処理により、挿入ステートメントの実行時間も短縮されます。ただし、 TABLOCK ヒントは、挿入操作中に挿入されたテーブルのロックを取得します。並列挿入の詳細については、Real WorldParallelINSERT…SELECTを参照してください。

    もう1つの便利なステートメントはSELECTINTOです。このメソッドを使用すると、1つのテーブルから新しく作成されたテーブルにデータをコピーできます。次のステートメントでは、 NewCountryTable クエリの実行前には存在しませんでした。クエリはテーブルを作成し、 TblCountryからすべてのデータを挿入します テーブル。

    SELECT * INTO NewCountryTable 
    FROM TblCountry
    

    同時に、ソーステーブルの特定の列に対して新しいテーブルを作成できます。

    場合によっては、INSERTステートメントから挿入された値を返して使用する必要があります。 SQL Server 2005以降、INSERTステートメントを使用すると、INSERTステートメントから問題の値を取得できます。

    次に、テストテーブルを削除して作成し、新しいID列を追加します。また、この列にデフォルトの制約を追加します。そのため、この列に明示的な値を挿入しないと、新しい値が自動的に作成されます。

    次のサンプルでは、​​1つの列を持つテーブルを宣言し、 SeqIDの出力を挿入します。 OUTPUT列を使用したこのテーブルの列値:

    DROP TABLE IF EXISTS TblCountry
    CREATE TABLE [dbo].[TblCountry]
    (
    	[CountryName]		VARCHAR(50), 
        [ContinentNames]	VARCHAR(50) NULL, 
        [CountryPopulation]		BIGINT NULL ,
    	SeqID uniqueidentifier  default(newid())
    )	
    
    
    
    DECLARE @OutputID AS TABLE(LogID uniqueidentifier) 
     
    INSERT  TblCountry  
    (CountryName,ContinentNames,CountryPopulation) 
    OUTPUT INSERTED.SeqId INTO @OutputID
    VALUES   
    ('Germany','Europe',8279000 )
    
    SELECT * FROM @OutPutId
    

    R –読み取り

    読む 操作はテーブルからデータを取得し、テーブルのレコードを含む結果セットを返します。複数のテーブルからデータを取得する場合は、JOIN演算子を使用して、テーブル間に論理関係を作成できます。

    SELECTステートメントは、読み取りで単一の主要な役割を果たします 手術。これは3つのコンポーネントに基づいています:

    • 列– データを取得する列を定義します
    • 表–私たち データを取得するテーブルを指定します
    • フィルター–私たち 読み取りたいデータをフィルタリングできます。この部分はオプションです。

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

    SELECT column1, column2,...,columnN
    FROM table_name
    

    次に、例を見ていきます。最初に、読み取るサンプルテーブルが必要です。作成しましょう:

    DROP TABLE  IF EXISTS TblCountry
     GO
    CREATE TABLE [dbo].[TblCountry]
    (
    	[CountryName]		VARCHAR(50), 
        [ContinentNames]	VARCHAR(50) NULL, 
        [CountryPopulation]		BIGINT NULL 
    )
    
    GO
    INSERT INTO TblCountry  
    (CountryName,ContinentNames,CountryPopulation) 
    VALUES   
    ('Germany','Europe',8279000 ), 
    ('Japan','Asia',126800000 ),
    ('Moroco','Africa',35740000)
    

    テーブルのすべての列を読み取る

    アスタリスク(*)演算子は、テーブル内のすべての列を返すため、SELECTステートメントで使用されます。

    SELECT * FROM TblCountry

    ヒント :アスタリスク(*)演算子は、より多くのネットワークトラフィックを引き起こし、より多くのリソースを消費するため、パフォーマンスに悪影響を与える可能性があります。したがって、返されたすべての列からすべてのデータを取得する必要がない場合は、SELECTステートメントでアスタリスク(*)を使用しないでください。

    テーブルの特定の列を読み取る

    テーブルの特定の列も読み取ることができます。 CountryNameのみを返す例を確認してみましょう およびCountryPopulation 列:

    SELECT CountryName,CountryPopulation FROM TblCountry

    SELECTステートメントでのエイリアスの使用

    SELECTステートメントでは、テーブルまたは列に一時的な名前を付けることができます。これらの一時的な名前はエイリアスです。前の2つのクエリをテーブルと列のエイリアスで書き直してみましょう。

    次のクエリでは、 TblC エイリアスはテーブル名を指定します:

    SELECT TblC.* FROM TblCountry TblC

    次の例では、列名のエイリアスを提供します。 CountryNameを変更します CName 、および CountryPopulation CPop

    SELECT TblC.CountryName AS [CName], CountryPopulation AS [CPop] FROM TblCountry TblC

    エイリアスの目的は次のとおりです。

    • テーブル名または列名が複雑な場合は、クエリを読みやすくします。
    • テーブルのクエリを複数回使用するようにしてください。
    • テーブル名または列名が長い場合は、クエリの記述を簡素化します。

    SELECTステートメントのフィルタリング

    SELECTステートメントを使用すると、WHERE句を使用して結果セットをフィルタリングできます。たとえば、 CountryNameに従ってSELECTステートメントをフィルタリングします。 列を作成し、ドイツのデータのみを結果セットに返します。次のクエリは、フィルタを使用して読み取り操作を実行します。

    SELECT TblC.* FROM TblCountry TblC
    WHERE TblC.CountryName='Germany'
    

    SELECTステートメントの結果の並べ替え

    ORDER BY句は、SELECTステートメントの結果セットを指定された1つまたは複数の列で並べ替えるのに役立ちます。 ORDER BY句を使用して、昇順または降順の並べ替えを実行できます。

    TblCountryを並べ替えます 国の人口に応じた昇順の表:

    SELECT TblC.* FROM TblCountry TblC
    ORDER BY TblC.CountryPopulation ASC
    

    ヒント :ORDER BY句で列インデックスを使用でき、列インデックス番号は1から始まります。

    前のクエリを書くこともできます。数字の3は、 CounrtyPopulationを示します。

    SELECT TblC.* FROM TblCountry TblC
    ORDER BY 3 ASC
    

    U –更新

    UPDATEステートメントは、テーブル内の既存のデータを変更します。データを変更するターゲット列を定義できるように、このステートメントにはSET句を含める必要があります。

    次のクエリは、 CounrtyPopulationのすべての行を変更します 列の値を1にします。

    UPDATE TblCountry SET CountryPopulation=1
    GO
    SELECT TblC.* FROM TblCountry TblC
    

    UPDATEステートメントでは、WHERE句を使用して、テーブル内の特定の1つまたは複数の行を変更できます。

    日本を変えましょう CounrtyPopulationの行 245000まで:

    UPDATE TblCountry SET CountryPopulation=245000
    WHERE CountryName = 'Japan'
    GO
    SELECT TblC.* FROM TblCountry TblC
    

    UPDATEステートメントは、deleteステートメントとinsertステートメントの和集合です。したがって、OUTPUT句を介して挿入された値と削除された値を返すことができます。

    例を見てみましょう:

    UPDATE TblCountry SET CountryPopulation=22
    OUTPUT inserted.CountryPopulation AS [Insertedvalue],
    deleted.CountryPopulation AS [Deletedvalue]
    WHERE CountryName = 'Germany'
    

    ご覧のとおり、 CountryPopulationを変更しました 1から22までの値。次に、挿入された値と削除された値を見つけることができます。さらに、これらの値をテーブル変数(テーブルとして使用できる特別な変数タイプ)に挿入できます。

    挿入された値と削除された値をテーブル変数に挿入します:

    DECLARE @LogTable TABLE(InsertValLog INT , DelValLog INT) 
    
    
    UPDATE TblCountry SET CountryPopulation=45
    OUTPUT inserted.CountryPopulation ,
    deleted.CountryPopulation INTO @LogTable
    WHERE CountryName = 'Germany'
    
    
    SELECT * FROM @LogTable
    

    @@ ROWCOUNT 最後のステートメントで影響を受けた行数を返すシステム変数です。したがって、この変数を使用して、updateステートメントの変更された行を公開できます。

    次の例では、更新クエリは3行を変更し、@@ROWCOUNTシステム変数は3を返します。

    UPDATE TblCountry SET CountryPopulation=1
    SELECT @@ROWCOUNT AS [AffectedRowNumber]
    

    D –削除

    Deleteステートメントは、既存の行をテーブルから削除します。

    最初に、DELETEステートメントでWHERE句を使用する方法を見てみましょう。ほとんどの場合、削除された行をフィルタリングします。

    次の例は、特定の行を削除する方法を示しています。

    SELECT TblC.* FROM TblCountry TblC
    DELETE FROM TblCountry WHERE CountryName='Japan'
    SELECT TblC.* FROM TblCountry TblC
    

    ただし、DELETEステートメントを使用すると、テーブルからすべてのレコードを削除できます。ただし、DELETEステートメントは非常に基本的なものであり、WHERE条件は使用しません。

    SELECT TblC.* FROM TblCountry TblC
    DELETE FROM TblCountry
    SELECT TblC.* FROM TblCountry TblC
    

    それでも、データベース設計の状況によっては、外部キーやその他の制約に違反している場合、DELETEステートメントは1行を削除しません。

    たとえば、 AdventureWorks データベースでは、 ProductCategoryの行を削除できません ProductCategoryID であるため、テーブル そのテーブルで外部キーとして指定されています。

    ProductCategoryから行を削除してみましょう テーブル–間違いなく、次のエラーが発生します:

    DELETE FROM [Production].[ProductCategory]
    WHERE ProductCategoryID=1
    

    結論

    したがって、SQLでのCRUD操作について説明しました。 INSERT、SELECT、UPDATE、およびDELETEステートメントはSQLデータベースの基本機能であり、SQLデータベースプログラミングを学習する場合は、それらを習得する必要があります。 CRUD理論は良い出発点になる可能性があり、多くの実践が専門家になるのに役立ちます。


    1. PostgreSQLスキーマ/Djangoを使用した名前空間

    2. PHPとLinuxを介してpdoを使用してmssqlに接続するにはどうすればよいですか?

    3. postgresql配列を行にアンラップします

    4. 書き込み可能なパーティションへの変更が予期せず失敗する可能性があります