SQLを学ぶうえで、SELECT文の次に覚えておきたいのがINSERTです。

INSERTを使用すると、データベースのテーブルに新しいデータを追加できます。

しかし、初めてINSERTを使う場合は、「どこにSQLを書くのか」「文字列や日付をどのように指定するのか」「実行後のデータをどこで確認するのか」といった点で迷いやすいでしょう。

この記事では、SQL Server LocalDBとSQL Server Management Studioを使用し、テーブルの作成からINSERTによるデータ登録、SELECT文を使った登録結果の確認までを順番に解説します。

単純なINSERTだけでなく、複数行の追加、NULLの登録、既定値の使用方法なども扱います。

この記事を読みながら実際に操作することで、SSMS上でテーブルにデータを追加する基本操作を身につけられます。

この記事でわかること

この記事では、INSERTを使ってSQL Serverのテーブルにデータを追加する方法を学びます。

  • SQL Server LocalDBへSSMSから接続する方法
  • INSERTの基本的な書き方
  • テスト用のデータベースとテーブルを作成する方法
  • 1件のデータをテーブルへ追加する方法
  • 複数件のデータをまとめて追加する方法
  • NULLや既定値を登録する方法
  • SELECT文で登録結果を確認する方法

動作環境

この記事では、Windows環境でSQL Server LocalDBとSSMSを使う前提で進めます。

バージョンは一例です。環境によって画面表示や細かい操作が異なる場合があります。

項目使用環境
OSWindows 11
SQL ServerSQL Server LocalDB
管理ツールSQL Server Management Studio(SSMS)
接続先(localdb)\MSSQLLocalDB
使用言語SQL

環境構築ができていない場合は、以下を参考にしてください。
また、C#.NETで実行したい方は本記事と以下の記事を見ながら試行してみてください。

完成イメージ

この記事では、Usersテーブルに複数のユーザー情報が登録された状態を目指します。

作成するUsersテーブルには、次の情報を保存します。

列名内容データ例
UserIDユーザーID1
UserNameユーザー名山田太郎
Age年齢25
Emailメールアドレスyamada@example.com
CreatedAt登録日時2026-06-09 10:00:00

UserIDは自動採番に設定します。そのため、INSERTを実行するときにUserIDを指定する必要はありません。

CreatedAtには既定値を設定し、値を指定しなかった場合はSQL Serverが自動的に現在日時を登録するようにします。

INSERTの実行後にSELECT文でテーブルを確認し、追加したデータが表示されれば完成です。

INSERTの実践

ここからは、SSMSを操作しながらINSERTを実行する手順を解説します。

SQLを初めて実行する場合は、途中の手順を飛ばさず、上から順番に進めてください。

学習用データベースを作成する

まずは、INSERTを試すためのデータベースを作成します。

今回は、InsertDBという名前のデータベースを使用します。

SSMSで新しいクエリを開き、以下のSQLを実行します。

CREATE DATABASE InsertDB;

実行後、左側のデータベース一覧を更新すると、InsertDBが表示されます。

InsertDBの作成画像

使用するデータベースを選択する

データベースを作成しただけでは、クエリの実行対象がInsertDBになっているとは限りません。

そのため、USE文を使用して操作対象のデータベースを切り替えます

次のSQLを実行してください。

USE InsertDB;

SSMS上部にあるデータベース選択欄からInsertDBを選択する方法もあります。
ただし、SQLの中にUSE文を書いておくと、どのデータベースを操作するSQLなのかが明確になります。

以降のSQLは、InsertDBを選択した状態で実行します。

データを登録するUsersテーブルを作成する

次に、INSERTでデータを追加するためのUsersテーブルを作成します。

今回は、ユーザー名、年齢、メールアドレス、登録日時を管理するテーブルを作成します。

次のSQLを実行してください。

USE InsertDB;

CREATE TABLE Users
(
    UserID INT IDENTITY(1, 1) PRIMARY KEY,
    UserName NVARCHAR(50) NOT NULL,
    Age INT NULL,
    Email NVARCHAR(100) NULL,
    CreatedAt DATETIME2 NOT NULL
    CONSTRAINT DF_Users_CreatedAt DEFAULT SYSDATETIME()
);

各列の役割は次のとおりです。

列名データ型設定内容
UserIDINTユーザーID
UserNameNVARCHAR(50)ユーザー名
AgeINT年齢
EmailNVARCHAR(100)メールアドレス
CreatedAtDATETIME2登録日時

UserIDに設定したIDENTITYは、データを登録するたびに番号を自動的に割り当てる機能です。
IDENTITY(1, 1)の1つ目の値は開始番号、2つ目の値は増加する間隔を表します。

この場合、UserIDは1から始まり、データが追加されるたびに1ずつ増加します。

UserNameにはNOT NULLを指定しているため、NULLを登録できません

一方、AgeとEmailはNULLを許可しています。

作成したテーブルを確認する

テーブル作成後は、Usersテーブルが正しく作成されているか確認します。

オブジェクトエクスプローラーで、次の順番に展開してください。

  1. データベース
  2. InsertDB
  3. テーブル

テーブル一覧にUsersが表示されない場合は、「テーブル」を右クリックして「最新の情報に更新」を選択します。

テーブル作成画像

環境によっては、テーブル名がdbo.Usersと表示されます。

dboはスキーマ名です。スキーマとは、データベース内のテーブルなどを分類するための名前です。

今回のSQLでは、Usersとdbo.Usersのどちらで指定しても通常は同じテーブルを参照しますが、実務ではdbo.Usersのようにスキーマ名を付ける書き方が明確です。

INSERTの基本構文を確認する

INSERTは、テーブルに新しい行を追加するために使用します。

基本構文は、追加先のテーブル、対象列、登録する値の順番で記述します。

INSERT INTO テーブル名
(
    列名1,
    列名2,
    列名3
)
VALUES
(
    値1,
    値2,
    値3
);

INSERT INTOの後ろには、データを追加するテーブル名を指定します。

続く丸括弧の中には、データを追加する列名を記述します。

VALUESの丸括弧には、各列へ登録する値を指定します。

このとき、列名と値は同じ順番で対応させる必要があります

たとえば、列名をUserName、Age、Emailの順番で書いた場合、VALUESもユーザー名、年齢、メールアドレスの順番で指定します。

INSERTで1件のデータを追加する

ここでは、Usersテーブルへ1件のデータを追加します。

文字列はシングルクォーテーションで囲み、数値はそのまま記述します。

次のSQLを実行してください。

INSERT INTO dbo.Users
(
    UserName,
    Age,
    Email
)
VALUES
(
    N'山田太郎',
    25,
    N'yamada@example.com'
);

実行すると、最後にSELECTでテーブルデータを確認するようにしています。

INSERT文で1件のデータを追加する

このSQLでは、次のデータを登録しています。

列名登録する値
UserName山田太郎
Age25
Emailyamada@example.com

UserIDはIDENTITYによって自動採番されるため、INSERTには含めていません。
CreatedAtもDEFAULT制約によって現在日時が自動登録されるため、省略しています。

また、日本語の文字列には、シングルクォーテーションの前にNを付けています。
Nは、文字列をUnicode文字列として扱うための指定です。
NVARCHAR型へ日本語を登録する場合は、次のようにNを付けて記述しておくと安全です。

N'山田太郎'

文の結果に表示されれば、INSERTは正常に完了しています。

複数行のデータをまとめて追加する

INSERTでは、1回の実行で複数行を追加できます。

複数行を追加する場合は、VALUESの値をカンマで区切って複数記述します。

次のSQLを実行してください。

INSERT INTO dbo.Users
(
    UserName,
    Age,
    Email
)
VALUES
    (N'佐藤花子', 28, N'sato@example.com'),
    (N'鈴木一郎', 32, N'suzuki@example.com'),
    (N'高橋美咲', 21, N'takahashi@example.com');

このSQLでは、3件のユーザー情報をまとめて追加しています。

実行後、メッセージ欄に「3行処理されました」と表示されれば成功です。

次のSELECT文で登録結果を確認します。

SELECT
    UserID,
    UserName,
    Age,
    Email,
    CreatedAt
FROM dbo.Users
ORDER BY UserID;

ORDER BY UserIDを指定することで、UserIDの小さい順に結果を表示できます。

複数行のデータをまとめて追加する

1件ずつINSERTを書くこともできますが、追加するデータが決まっている場合は、複数行をまとめた方がSQLを簡潔に記述できます。

NULLを登録する

AgeやEmailのようにNULLを許可している列には、NULLを登録できます。

NULLは、値が存在しないことを表す特別な値です。

空文字や0とは意味が異なります。

次のSQLでは、年齢とメールアドレスをNULLで登録します。

INSERT INTO dbo.Users
(
    UserName,
    Age,
    Email
)
VALUES
(
    N'田中次郎',
    NULL,
    NULL
);

NULLは文字列ではないため、シングルクォーテーションで囲みません。

次のように書くと、NULLではなく「NULL」という4文字の文字列として扱われます。

N'NULL'

登録後は、SELECT文で確認してください。

SELECT
    UserID,
    UserName,
    Age,
    Email,
    CreatedAt
FROM dbo.Users
WHERE UserName = N'田中次郎';

結果欄でAgeとEmailがNULLと表示されれば成功です。

NULLを登録する

NOT NULLが設定されている列にはNULLを登録できないため、テーブル定義も合わせて確認する必要があります。

日付を指定してデータを追加する

CreatedAtへ任意の日時を登録することもできます。

日付や日時は、SQL Serverが解釈しやすい形式で指定します。

次の例では、2026年6月1日の10時30分を登録します。

INSERT INTO dbo.Users
(
    UserName,
    Age,
    Email,
    CreatedAt
)
VALUES
(
    N'中村直樹',
    27,
    N'nakamura@example.com',
    '2026-06-01T10:30:00'
);

SELECT
    UserID,
    UserName,
    Age,
    Email,
    CreatedAt
FROM dbo.Users

日時はシングルクォーテーションで囲みます。

年月日の区切りには「ハイフン」を使用し、日付と時刻の間に「T」を入れています。

日付を指定してデータを追加する

SQL Serverの言語設定や日付形式によっては、スラッシュ区切りなどの日時が意図どおりに変換されない場合があります。

そのため、YYYY-MM-DDTHH:MM:SS形式を使用すると解釈の違いを避けやすくなります

列名を省略したINSERTを確認する

INSERTでは、列名を省略して値だけを書くこともできます。

ただし、列名の省略は基本的におすすめしません

列名を省略する場合は、テーブルの列順に合わせて値を指定する必要があります。

UsersテーブルではUserIDがIDENTITY列のため、単純にすべての列を省略したINSERTは扱いにくくなります。

例として、IDENTITY列を持たないテーブルでは次のように記述できます。

CREATE TABLE Categories
(
    CategoryID INT NOT NULL,
    CategoryName NVARCHAR(50) NOT NULL
);

INSERT INTO Categories
VALUES
(
    1,
    N'食品'
);

この書き方では、1がCategoryID、食品がCategoryNameに登録されます。

しかし、あとから列の追加や順序変更が行われると、SQLが動かなくなったり、意図しない列へ値を登録したりする原因になります。

実務では次のように、対象の列名を明示する書き方が安全です。

INSERT INTO Categories
(
    CategoryID,
    CategoryName
)
VALUES
(
    1,
    N'食品'
);

INSERTした件数を確認する

INSERTの実行直後に、追加された行数を確認したい場合は、「@@ROWCOUNT」を使用できます。

@@ROWCOUNTは、直前のSQLによって処理された行数を返します

次のSQLを実行してください。

INSERT INTO dbo.Users
(
    UserName,
    Age,
    Email
)
VALUES
    (N'小林優子', 24, N'kobayashi@example.com'),
    (N'加藤大輔', 31, N'kato@example.com');

SELECT @@ROWCOUNT AS InsertedRowCount;

2件のデータが追加された場合、InsertedRowCountには2が表示されます。

INSERTした件数を確認する

INSERTと@@ROWCOUNTの間に別のSQLを実行すると、そのSQLの件数に変わる場合があります。

そのため、INSERTの直後に確認することが重要です。

よくあるエラー・注意点

INSERTでは、列数の不一致やデータ型の違い、NOT NULL制約などが原因でエラーが発生します。

ここでは、初心者が遭遇しやすいエラーと対処方法を整理します。

エラー・症状主な原因対処方法
Invalid object name ‘Users’Usersテーブルが存在しない、または別のデータベースを選択しているUSE InsertDBを実行し、dbo.Usersが存在するか確認する
Column name or number of supplied values does not match table definition列数とVALUESの値の数が一致していない列名と値の数を揃える
Cannot insert the value NULL into columnNOT NULL列にNULLを登録している必須列へ値を指定するか、テーブル定義を見直す
String or binary data would be truncated列の最大文字数を超える文字列を登録している文字数を短くするか、列のサイズを変更する
Conversion failed when convertingデータ型に合わない値を登録しているINT列には数値、日時列には正しい日時形式を指定する
Explicit value must be specified for identity columnIDENTITY列の扱いが正しくない通常はIDENTITY列をINSERT対象から除外する
Cannot insert explicit value for identity columnIDENTITY列へ明示的に値を登録しているUserIDを列リストとVALUESから除外する
データが重複して登録された同じINSERTを複数回実行したSELECT文で確認し、不要なデータをDELETEする
日本語が文字化けするVARCHAR型を使用している、またはNを付けていないNVARCHAR型を使用し、日本語文字列の前にNを付ける
日付の変換エラーが発生するSQL Serverが解釈しにくい日付形式を指定しているYYYY-MM-DDTHH:MM:SS形式を使用する

列数と値の数を一致させる

INSERTでは、列名の数とVALUESに指定する値の数を一致させる必要があります

次のSQLは、列が3つあるのに値が2つしかないためエラーになります。

INSERT INTO dbo.Users
(
    UserName,
    Age,
    Email
)
VALUES
(
    N'山田太郎',
    25
);

正しくは、Emailに対応する値も指定します。

INSERT INTO dbo.Users
(
    UserName,
    Age,
    Email
)
VALUES
(
    N'山田太郎',
    25,
    N'yamada@example.com'
);

Emailへ値を登録しない場合でも、列リストにEmailを書いた場合はNULLなどの値が必要です。

または、Email自体を列リストから省略します。

文字列はシングルクォーテーションで囲む

文字列を登録するときは、値をシングルクォーテーションで囲む必要があります

次のSQLは、山田太郎を列名として解釈しようとするためエラーになります。

INSERT INTO dbo.Users
(
    UserName,
    Age
)
VALUES
(
    山田太郎,
    25
);

正しくは、次のように記述します。

INSERT INTO dbo.Users
(
    UserName,
    Age
)
VALUES
(
    N'山田太郎',
    25
);

ダブルクォーテーションではなく、シングルクォーテーションを使用する点に注意してください。

シングルクォーテーションを含む文字列に注意する

登録する文字列自体にシングルクォーテーションが含まれる場合は、シングルクォーテーションを2つ続けて記述します。

たとえば、O’Connorという文字列を登録する場合は次のように書きます。

INSERT INTO dbo.Users
(
    UserName,
    Age,
    Email
)
VALUES
(
    N'O''Connor',
    30,
    N'oconnor@example.com'
);

文字列内のシングルクォーテーションをそのまま1つだけ書くと、文字列の終了位置と判断され、構文エラーになります。

アプリケーションからSQLを実行する場合は、文字列を直接連結せずパラメーターを使用する必要があります。

ただし、この記事ではSSMS上でSQLを直接実行する方法のみを扱っています。

IDENTITY列には通常値を指定しない

UserIDはIDENTITY列として設定しているため、SQL Serverが自動的に値を割り当てます。

したがって、通常のINSERTではUserIDを指定しません

次のSQLはエラーになる可能性があります。

INSERT INTO dbo.Users
(
    UserID,
    UserName,
    Age,
    Email
)
VALUES
(
    100,
    N'山田太郎',
    25,
    N'yamada@example.com'
);

通常は次のようにUserIDを除外します。

INSERT INTO dbo.Users
(
    UserName,
    Age,
    Email
)
VALUES
(
    N'山田太郎',
    25,
    N'yamada@example.com'
);

IDENTITY_INSERTを有効にすると明示的なIDを登録できますが、データ移行などの特別なケースで使う機能です。

初心者がINSERTを練習する段階では、自動採番に任せる方法が安全です。

INSERTを再実行するとデータが追加される

INSERTは、実行するたびに新しい行を追加します。

同じINSERTを2回実行すると、同じ内容のデータが2行登録される可能性があります。

INSERT INTO dbo.Users
(
    UserName,
    Age,
    Email
)
VALUES
(
    N'山田太郎',
    25,
    N'yamada@example.com'
);

登録前後にはSELECT文でデータを確認してください。

重複したデータを削除する場合はDELETE文を使用しますが、条件を付けずにDELETE文を実行するとテーブル内の全データが削除されます。

そのため、DELETE文を使用する前には必ず対象データをSELECT文で確認してください。

まとめ

この記事では、SQL Server LocalDBとSSMSを使用し、INSERTでテーブルにデータを追加する方法を解説しました。

今回行った内容は次のとおりです。

  • SSMSからSQL Server LocalDBへ接続した
  • SampleDBデータベースを作成した
  • Usersテーブルを作成した
  • INSERTで1件のデータを追加した
  • 複数行のデータをまとめて追加した
  • NULLやDEFAULTを使ってデータを登録した
  • SELECT文で登録結果を確認した
INSERTでは、列名とVALUESの値を同じ順番で対応させることが重要です。

また、列名を省略するとテーブル構造の変更に弱くなるため、基本的には列名を明示して記述しましょう。

次に学ぶ内容としては、登録したデータを変更するUPDATE文や、不要なデータを削除するDELETE文があります。

INSERT、SELECT、UPDATE、DELETEを一通り理解すると、SQLにおける基本的なデータ操作ができるようになります。