INSERT INTOとSELECT INTOを超えた!SQL Serverでデータを操作する高度なテクニック
SQL Server における INSERT INTO
と SELECT INTO
は、どちらもデータをテーブルに挿入するための SQL ステートメントですが、それぞれ異なる目的と動作を持っています。
INSERT INTO
- 既存のテーブルに新しいレコードを挿入するために使用されます。
- 挿入するレコードの値を直接指定できます。
- 既存のテーブル構造に一致する値のみ挿入されます。
- 新しいテーブルを作成し、既存のテーブルからデータを取得してその新しいテーブルに挿入するために使用されます。
- 既存のテーブルから選択した列のみを新しいテーブルに挿入できます。
- 新しいテーブルの構造は、選択した列に基づいて自動的に作成されます。
比較表
機能 | INSERT INTO | SELECT INTO |
---|---|---|
目的 | 既存のテーブルにレコードを挿入 | 新しいテーブルを作成し、既存のテーブルからデータを挿入 |
操作対象 | 既存のテーブル | 新しいテーブル |
データ指定方法 | 直接指定 | SELECT 句で選択 |
構造 | 既存のテーブル構造に準拠 | 選択した列に基づいて自動生成 |
ログ | 通常ログ | 最小ログ (条件付き) |
使用例
INSERT INTO を使用して、既存の Customers
テーブルに新しいレコードを挿入する例:
INSERT INTO Customers (CustomerID, CustomerName, City)
VALUES (1001, 'John Doe', 'Seattle');
SELECT INTO を使用して、Orders
テーブルから CustomerID
と OrderDate
列のみを含む新しい RecentOrders
テーブルを作成し、そこにデータを挿入する例:
SELECT CustomerID, OrderDate
INTO RecentOrders
FROM Orders
WHERE OrderDate > '2024-01-01';
補足
SELECT INTO
は、一時的なデータセットやバックアップ目的でよく使用されます。INSERT INTO SELECT
は、SELECT INTO
と同様の機能を提供しますが、既存のテーブルが存在する必要があります。- どちらのステートメントも、パフォーマンスとトランザクションログの観点から異なる特性を持っています。
INSERT INTO を使用して既存のテーブルにデータ挿入
この例では、Customers
テーブルに新しいレコードを挿入します。
INSERT INTO Customers (CustomerID, CustomerName, City)
VALUES (1001, 'John Doe', 'Seattle');
解説
- このステートメントは、
Customers
という名前のテーブルにデータを挿入します。 CustomerID
、CustomerName
、City
という 3 つの列に値を挿入します。- 挿入する値は、カッコ内にカンマ区切りで指定します。
SELECT INTO を使用して新しいテーブルを作成し、既存のテーブルからデータ挿入
SELECT CustomerID, OrderDate
INTO RecentOrders
FROM Orders
WHERE OrderDate > '2024-01-01';
RecentOrders
テーブルには、CustomerID
とOrderDate
という 2 つの列が含まれます。WHERE
句を使用して、OrderDate
が 2024 年 1 月 1 日以降のレコードのみを挿入するように条件を指定します。
- これらの例はほんの一例です。
INSERT INTO
とSELECT INTO
は、さまざまな目的に使用できます。 - 詳細については、SQL Server のドキュメントを参照してください。
SQL Serverでデータを挿入するその他の方法
BULK INSERT
- 大量のデータを高速に挿入する場合に使用されます。
- 専用のツールまたは API を使用して実行できます。
OPENROWSET
- 外部ソース (テキスト ファイル、Excel ファイルなど) からデータを挿入する場合に使用されます。
sp_rename
- 既存のテーブルの名前を変更する場合に使用されます。
TRUNCATE TABLE
- テーブル内のすべてのデータを削除する場合に使用されます。
これらの方法はそれぞれ異なる用途に適しています。状況に応じて適切な方法を選択してください。
sql-server t-sql sql-server-2008