SQLShack (日本語)
この記事では、SQL INSERT INTOSELECTステートメントについて説明します。その構文、例、および使用例とともに。
以前の記事SQLSELECT INTOステートメントでは、次のタスクについて説明しました。
- 適切なデータタイプのレコードを挿入しながら、SQLテーブルをその場で作成します。
- SQL SELECTINTOを使用して特定のファイルグループにレコードを挿入する
- 既存のテーブルにデータを挿入するために使用することはできません
INSERT INTOSELECTステートメント
通常のデータベースアクティビティとしてレコードを挿入します。 SSMS、Azure Data Studioなどのクライアントツールを使用して直接、またはアプリケーションから直接データを挿入できます。 SQLでは、SQL INSERTINTOステートメントを使用してレコードを挿入します。
INSERTINTOの構文
テーブルにデータを挿入すると、次の構文を使用できます。 SQL INSERTINTOステートメント。
1
2
|
INSERT INTO table_name(Column1、Column 2 ….)
VALUES(value1、value2、…);
|
テーブルの列に従ってすべての列の値を指定した場合注文の場合、列名を指定する必要はありません。テーブルにレコードを直接挿入できます。
1
2
|
INSERT INTO table_name
VALUES(value1、value2、…);
|
サンプルテーブルを作成し、そこにデータを挿入しましょう。
1
2
3
4
|
CREATETABLE従業員
(ID INT、
名前VARCHAR(20)
);
|
次のクエリを使用してデータを挿入できます。どちらのクエリもデータ挿入に有効です。
1
2
|
従業員に挿入(ID、名前)値(1、 “raj”)
従業員に挿入値(2、 “raj”)
|
列名がある場合、列名を指定せずにデータを挿入することはできません。データ挿入と列値の順序の不一致が異なります。次のエラーメッセージが表示されます。
- メッセージ213、レベル16、状態1、行6
列名または指定された値の数が表示されません一致テーブル定義。
- メッセージ245、レベル16、状態1、行6
varchar値「raj」をデータ型intに変換するときに変換に失敗しました。
この例では、SQL INSERT INTOステートメントを使用して、ステートメントに直接値を指定します。別のテーブルからデータを挿入するとします。 SQL INSERTINTOステートメントをselectステートメントと一緒に使用することもできます。これについては、次のセクションで説明します。
INSERT INTOSELECTステートメントの構文
次のINSERTINTO SELECTステートメントを使用して、他のSQLテーブルのデータをテーブルに挿入できます。
1
2
3
|
INSERT INTO table1(col1、col2、col3、…)
SELECT col1、col2、col3、…
FROM table2
|
このクエリは、次のタスクを実行します。
- 最初にテーブルからレコードを選択します(Selectステートメント)
- 次に、INSERTINTOで指定されたテーブルに挿入します
- 注:列構造は、SELECTステートメントによって返される列と宛先テーブルの間で一致する必要があります。
INSERT INTOSELECTの例
例1:ソーステーブルのすべての列から宛先テーブルにデータを挿入する
次のレコードがあります。既存のEmployeeテーブル。
次のクエリを使用して、別のテーブルCustomersを作成しましょう。
1
2
3
4
|
CREATE TABLE Customers
(ID INT、
Name VARCHAR(20)
);
|
EmployeesテーブルのすべてのレコードをCustomersテーブル。これを行うには、SQL INSERT INTOSELECTステートメントを使用できます。
1
2
3
|
INSERT INTO Customers
SELECT *
FROM Employees;
|
すべてのレコードをCustomersテーブルに挿入します。 CustomersテーブルのレコードがEmployeesテーブルに類似していることを確認できます。
この例では、すべてのレコードを挿入しました列をCustomersテーブルに追加します。
例2:列名を指定してソーステーブルから宛先テーブルに行を挿入します
先に進む前に、既存のCustomersテーブルを削除しましょう。ここで、IDENTITY列が1つ追加されたテーブルを作成します。 IDENTITY列は、ID値をテーブルに自動的に挿入します。 NULL値を許可するCity列も追加しました
1
2
3
4
5
6
|
CREATE TABLE Customers
(ID INT IDENTITY(1、1)、
Emp_ID INT、
Name VARCHAR(20)、
City VARCHAR(20)NULL、
);
|
INSERT INTOSELECTステートメントを次のように使用することはできません。上記の例。このコードを実行しようとすると、エラーメッセージが表示されます。
1
2
3
|
顧客に挿入
SELECT *
FROM従業員;
|
この場合、INSERTINTOステートメントで列名を指定する必要があります。
1
2
3
|
INSERT INTO Customers(Emp_ID、Name)
SELECT *
FROM従業員;
|
Customersテーブルには、次の列が追加されています。 NULL値を許可します。 Select onCustomersテーブルを実行してみましょう。次のスクリーンショットでは、City列にNULL値が表示されています。
ソーステーブルに別の列があるとします。 INSERT INTO SELECTステートメントで列名を指定して、宛先テーブルにレコードを挿入することもできます。データを挿入するには、適切なデータ型が必要です。 varchar列のデータをINT列に挿入することはできません。
ALTERTABLEステートメントを使用してEmployeesテーブルに新しい列を追加します。
1
2
|
ALTERTABLEの従業員
国を追加varchar(50);
|
テーブルレコードを国の値インドで更新します。
1
|
従業員セットの更新Country = “India”
|
ここで、INSERTINTOを再実行します。 SELECTステートメント。列名を指定する代わりにSELECT *を使用していることがわかります。
1
2
3
|
INSERT INTO Customers(Emp_ID、Name)
SELECT *
FROM従業員;
|
次のエラーメッセージが表示されます。このエラーは、ソーステーブルと宛先テーブルの間の列の不一致が原因で発生します。
次のクエリを使用して、ソーステーブルと宛先テーブルの間で列をマップできます。
1
2
3
4
5
6
|
顧客に挿入
(Emp_ID、
名前
)
SELECT ID、名前
FROM従業員;
|
例3:INSERT INTOSELECTを使用して一番上の行を挿入しますステートメント
ソーステーブルから宛先テーブルに上位N行を挿入するとします。 INSERT INTOSELECTステートメントでTop句を使用できます。次のクエリでは、上位1行をEmployeesテーブルからCustomersテーブルに挿入します。
1
2
3
4
5
6
|
INSERT TOP(1)INTO Customers
(Emp_ID、
名前
)
SELECT ID、名前
FROM従業員;
|
例4:列と定義された値の両方を使用して挿入するSQL INSERT INTOSELECTステートメント
前の例では、INSERT INTOステートメントで特定の値を指定するか、INSERT INTOSELECTを使用してソーステーブルからレコードを取得して宛先テーブルに挿入しました。
SQL INSERT INTOSELECTステートメントで列と定義された値の両方を組み合わせることができます。
CustomersテーブルとEmployeesテーブルには次の列があります。以前は、City列に値を挿入していませんでした。 Employeeテーブルにも必要な値がありません。 City列に明示的な値を指定する必要があります。
次のクエリでは、Cityの値を指定しました。列と、Employeesテーブルから挿入した残りの値。
1
2
|
INSERT TOP(1)INTO Customers(Emp_ID、Name、City)
SELECT ID、Name、 “Delhi” FROM従業員;
|
次のクエリでは、1つ挿入されていることがわかります。行(Top(1)句による)とCity列の値。
例5:INSERT INTO SELECT複数のテーブルからデータを取得するためのJoin句を含むステートメント
JOIN句を使用して、複数のテーブルからデータを取得できます。これらのテーブルは、ON句で指定された条件で結合されます。複数のテーブルからデータを取得してテーブルに挿入するとします。
この例では、AdventureWorks2017データベースを使用しています。まず、適切なデータ型を使用して新しいテーブルを作成します。
このテーブルには、複数テーブルの結合クエリの出力からのレコードが含まれている必要があります。次のクエリを実行して、HumanResources.EmployeeDataテーブルにデータを挿入します。
例6:INSERT INTOSELECTステートメントで共通テーブル式
共通テーブル式(CTE)を使用して、複数の列からの複雑な結合を単純化します。前の例では、SQLテーブルにデータを挿入するためのSelectステートメントでJOINSを使用しました。このパートでは、CTEを使用してクエリを書き直します。
CTEでは、コードを2つの部分に分割できます。
- SELECT、INSERT、UPDATE、DELETEステートメントの前にWITH句でCTEを定義します
- CTEを定義したら、リレーショナルSQLテーブルと同様にCTEを参照できます
次のコードを実行して、CTEを使用してデータを挿入します。
例7 :テーブル変数を使用したINSERT INTOSELECTステートメント
一時テーブルと同様にテーブル変数を使用します。テーブルのデータ型を使用して宣言できます。このテーブルは、永続テーブルを必要としないSQLServerでアクティビティを実行するために使用できます。次のクエリは3つの部分に分割できます。
- 適切な列データ型を使用してSQLテーブル変数を作成します。テーブル変数にはデータ型TABLEを使用する必要があります
- INSERT INTO SELECTステートメントを実行して、テーブル変数にデータを挿入します
- テーブル変数の結果セットを表示します
結論
この記事では、INSERT INTOSELECTステートメントの使用例について説明します。この記事がお役に立てば幸いです。以下のコメントでフィードバックをお寄せください。
- 作成者
- 最近の投稿
彼は、SQL Server Always On可用性グループに関する50部構成のシリーズで、単一のトピックに関する記事の最大の無料オンラインコレクションの1つを作成しています。 SQL Serverコミュニティへの貢献に基づいて、彼はSQLShackで2020年と2021年に継続的に名誉ある「年間最優秀著者」を含むさまざまな賞を受賞しています。
Rajは常に新しい課題に関心を持っているため、コンサルティングが必要な場合は彼の著作で取り上げられている主題についてのヘルプは、rajendra.gupta16 @ gmail.comに連絡できます。
RajendraGuptaによる投稿をすべて表示
- AWSのマイナーバージョンとメジャーバージョンのアップグレードの実行RDS SQLServer- 2021年1月29日
- AWS RDSPostgreSQLインスタンスのデプロイ-2021年1月27日
- AWSDMSを使用したオンプレミスSQLデータベースのAWSRDS SQLServerへの移行-1月25日、2021