データベースプログラミングには、次の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理論は良い出発点になる可能性があり、多くの実践が専門家になるのに役立ちます。