SQL Server SELECT INTO で既存のテーブルにデータを追加する方法

2024-04-02

SQL Server の SELECT INTO で既存のテーブルにデータを追加する方法

SQL Server の SELECT INTO は、SELECT ステートメントで取得したデータを既存のテーブルに挿入する便利な機能です。既存のデータを更新したり、別のテーブルからデータをコピーしたり、複雑な処理の結果を新しいレコードとして追加したりと、様々な用途に活用できます。

基本構文

INSERT INTO 既存テーブル名 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM データソース;

ポイント

  • 既存テーブル名: データを挿入するテーブルを指定します。
  • 列名: 挿入するデータの列を指定します。既存テーブルの列名と一致する必要があります。
  • データソース: SELECT ステートメントでデータを取得する元となるテーブル、ビュー、サブクエリなどを指定します。
  • 列名とデータソースの列数は一致する必要があります。
  • データ型も一致する必要があります。一致しない場合は、暗黙的な変換が行われる場合もありますが、エラーが発生する可能性もあります。

別のテーブルからデータをコピー

INSERT INTO 顧客情報 (顧客名, 住所, 電話番号)
SELECT 名前, 〒, 電話
FROM 顧客リスト;

複雑な処理の結果を新しいレコードとして追加

INSERT INTO 注文履歴 (注文日, 商品名, 数量, 金額)
SELECT GETDATE(), 商品名, 在庫数, 単価 * 在庫数
FROM 商品在庫
WHERE 在庫数 > 0;

INSERT INTO と SELECT ステートメントの組み合わせ

SELECT INTO は、INSERT INTOSELECT ステートメントを組み合わせた短縮形です。

SELECT 列名1, 列名2, ...
INTO 既存テーブル名
FROM データソース;

主キーの考慮

既存テーブルに主キーがある場合、SELECT INTO で挿入するデータは主キーの制約を満たす必要があります。重複する主キーを挿入しようとすると、エラーが発生します。

その他の注意点

  • 既存テーブルにデータが存在する場合は、INSERT INTO で挿入するデータは末尾に追加されます。
  • SELECT INTO は、トランザクションの一部として実行されます。そのため、エラーが発生した場合は、ロールバックによって挿入されたデータは取り消されます。

補足

  • SELECT INTO は、新しいテーブルを作成するよりも高速にデータを追加できます。
  • SELECT INTO は、複雑な処理の結果を新しいレコードとして追加する際に便利です。



別のテーブルからデータをコピー

-- 顧客情報テーブルと顧客リストテーブルを作成
CREATE TABLE 顧客情報 (
    顧客ID INT PRIMARY KEY IDENTITY,
    顧客名 VARCHAR(50) NOT NULL,
    住所 VARCHAR(100) NOT NULL,
    電話番号 VARCHAR(20) NOT NULL
);

CREATE TABLE 顧客リスト (
    名前 VARCHAR(50) NOT NULL,
    〒 VARCHAR(10) NOT NULL,
    電話 VARCHAR(20) NOT NULL
);

-- 顧客リストテーブルのデータを顧客情報テーブルにコピー
INSERT INTO 顧客情報 (顧客名, 住所, 電話番号)
SELECT 名前, 〒, 電話
FROM 顧客リスト;

-- 顧客情報テーブルの内容を確認
SELECT * FROM 顧客情報;

複雑な処理の結果を新しいレコードとして追加

-- 商品在庫テーブルを作成
CREATE TABLE 商品在庫 (
    商品ID INT PRIMARY KEY,
    商品名 VARCHAR(50) NOT NULL,
    在庫数 INT NOT NULL,
    単価 DECIMAL(10, 2) NOT NULL
);

-- 注文履歴テーブルを作成
CREATE TABLE 注文履歴 (
    注文ID INT PRIMARY KEY IDENTITY,
    注文日 DATETIME NOT NULL,
    商品名 VARCHAR(50) NOT NULL,
    数量 INT NOT NULL,
    金額 DECIMAL(10, 2) NOT NULL
);

-- 在庫数>0の商品を注文履歴テーブルに追加
INSERT INTO 注文履歴 (注文日, 商品名, 数量, 金額)
SELECT GETDATE(), 商品名, 在庫数, 単価 * 在庫数
FROM 商品在庫
WHERE 在庫数 > 0;

-- 注文履歴テーブルの内容を確認
SELECT * FROM 注文履歴;

INSERT INTO と SELECT ステートメントの組み合わせ

-- 顧客情報テーブルを作成
CREATE TABLE 顧客情報 (
    顧客ID INT PRIMARY KEY IDENTITY,
    顧客名 VARCHAR(50) NOT NULL,
    住所 VARCHAR(100) NOT NULL,
    電話番号 VARCHAR(20) NOT NULL
);

-- 顧客リストテーブルのデータを顧客情報テーブルにコピー
SELECT *
INTO 顧客情報
FROM 顧客リスト;

-- 顧客情報テーブルの内容を確認
SELECT * FROM 顧客情報;



SQL Server で既存のテーブルにデータを追加する他の方法

INSERT INTO ステートメントは、データを1行ずつ挿入する最も基本的な方法です。

INSERT INTO 既存テーブル名 (列名1, 列名2, ...)
VALUES (値1, 値2, ...);
INSERT INTO 顧客情報 (顧客名, 住所, 電話番号)
VALUES ('山田太郎', '〒100-0001 東京都千代田区', '03-1234-5678');

BULK INSERT は、CSVファイルなどの外部データソースから大量のデータを高速に挿入するのに適しています。

BULK INSERT 既存テーブル名
FROM 'データファイルパス'
WITH (FORMAT = 'CSV', FIELDTERMINATOR = ',');
BULK INSERT 顧客情報
FROM 'C:\data\顧客情報.csv'
WITH (FORMAT = 'CSV', FIELDTERMINATOR = ',');

OPENROWSET は、別のデータベースサーバーにあるテーブルのデータを挿入するのに使用できます。

INSERT INTO 既存テーブル名 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM OPENROWSET('接続文字列', 'SELECT * FROM 

sql sql-server t-sql


@@VERSION関数、SERVERPROPERTY関数、sys.dm_server_properties DMVの詳細解説

方法1:@@VERSION関数を使用する@@VERSION関数は、現在のSQL Serverインスタンスのバージョン情報を返します。この関数は、最も簡単で便利な方法です。例:出力:方法2:SERVERPROPERTY関数を使用するSERVERPROPERTY関数は、指定されたプロパティの値を返します。この関数は、@@VERSION関数よりも詳細な情報を取得できます。...


WHERE句とLIMIT句を使いこなせ! PostgreSQLで条件付きかつ行制限付きのSELECTクエリを実行する方法

LIMIT 句は、SELECT クエリの後に記述し、返される行の最大数を指定します。構文は以下の通りです。ここで、n は返される行の最大数です。例えば、以下のクエリは、customers テーブルから最初の 10 件のレコードのみを返します。...


安全かつ効率的に!PostgreSQLでvarchar列のサイズを変更する方法

例:この例では、customersテーブルのname列のサイズを50文字に縮小します。注意点:varchar列のサイズを小さくすると、データが切り捨てられる可能性があります。テーブルにデータが大量にある場合、サイズ変更処理に時間がかかる場合があります。...


【超便利】MySQLで現在の日付だけを取得する方法2選!今日の日付を簡単ゲット!

NOW() 関数は、現在の日時を最も汎用的に取得するために使用されます。結果は YYYY-MM-DD HH:MM:SS 形式の文字列で、現在時刻だけでなく現在の日付も含まれます。CURDATE() 関数は、現在の日付のみを YYYY-MM-DD 形式の文字列として取得します。...


information_schema.schemata ビューと information_schema.tables ビューを結合して PostgreSQL テーブルの存在を確認する

PostgreSQLデータベースで、特定のスキーマ内に指定されたテーブルが存在するかどうかを確認するには、以下の方法があります。方法information_schema. tables ビューを使用するinformation_schema...