SQLを学ぶうえで、データを登録・更新する前に理解しておきたいのがCREATE文です。

CREATE文を使用すると、データベースやテーブルなど、データを保存するための入れ物を作成できます。

しかし、SQL初心者の場合は「CREATE TABLEの書き方がわからない」「データ型をどのように指定すればよいかわからない」「実行したのにテーブルが表示されない」といった部分でつまずきやすいです。

この記事では、SQL Server LocalDBとSQL Server Management Studioを使用し、CREATE文でデータベースとテーブルを作成する方法を手順に沿って解説します。

実際にSQLを実行し、作成したテーブルへデータを登録して確認するところまで進めるため、CREATE文の基本的な使い方を手を動かしながら学べます。

この記事でわかること

この記事では、SQL ServerにおけるCREATE文の基本から、SSMSを使った実行方法まで確認します。

  • CREATE文の役割
  • SSMSからSQL Server LocalDBへ接続する方法
  • CREATE DATABASEでデータベースを作成する方法
  • CREATE TABLEでテーブルを作成する方法
  • INTやNVARCHARなどの基本的なデータ型
  • PRIMARY KEYやNOT NULLなどの制約
  • 作成したテーブルへデータを登録して確認する方法

動作環境

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

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

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

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

完成イメージ

この記事では、「Products」という商品管理用のテーブルを作成します。

Productsテーブルには、次の情報を保存します。

カラム名保存する内容データ型
ProductId商品を識別する番号INT
ProductName商品名NVARCHAR(100)
Price商品価格INT
Stock在庫数INT
CreatedAt登録日時DATETIME2

最終的には、CREATE TABLEで作成したProductsテーブルへサンプルデータを登録し、SELECT文で内容を確認します。

作成後は、次のようなデータを確認できる状態を目指します。

ProductIdProductNamePriceStock
1ノートパソコン1200005
2マウス300020
3キーボード800010

CREATEの実践

ここからは、SSMSを使用してデータベースとテーブルを順番に作成します。

作業は次の流れで進めます。

  1. 新しいクエリを開く
  2. データベースを作成する
  3. 使用するデータベースを切り替える
  4. テーブルを作成する
  5. テーブルの作成結果を確認する
  6. サンプルデータを登録する
  7. SELECT文でデータを確認する

新しいクエリを開く

まずは、SQLを入力するためのクエリエディターを開きます。

SSMS上部にある「新しいクエリ」をクリックしてください。
画面中央にSQLを入力できるエディターが表示されます。

新しいクエリを開く画像

クエリ画面の上部には、現在選択されているデータベース名が表示されます。接続直後は、masterデータベースが選択されている場合があります。

今回は新しいデータベースを作成するため、masterが選択された状態でも問題ありません。

CREATE DATABASEでデータベースを作成する

クエリに、次のSQLを入力します。

CREATE DATABASE CreateDB;

入力後、SSMS上部の「実行」をクリックするか、F5キーを押してください。

CreateDBの作成画像

「コマンドは正常に完了しました。」と表示されれば、CreateDBデータベースの作成は成功です。

SQLで確認する場合は、次の命令も使用できます。

SELECT name
FROM sys.databases
WHERE name = 'CreateDB';

以下のようになっていれば、確認は完了です。

CreateDBの作成をSQLで確認する画像

CREATEの基本構文を確認する

CREATE DATABASEの基本構文は次のとおりです。

CREATE DATABASE データベース名;

今回のSQLでは、次のような指定をしています。

記述意味
CREATE新しいオブジェクトを作成する
DATABASE作成する対象がデータベースであることを指定する
CreateDB作成するデータベース名

使用するデータベースをCreateDBへ切り替える

次に、テーブルを作成するデータベースをCreateDBへ切り替えます。

USE CreateDB;

USE文はこれからSQLを実行する対象データベースを指定する命令です。

USEを実行せずにCREATE TABLEを実行すると、選択されている別のデータベースにテーブルが作成される可能性があります。
現在選択されているデータベースの確認は左上の項目で確認できます。

使用するデータベースをCreateDBへ切り替える画像

SQLで確認することも可能です。

SELECT DB_NAME() AS CurrentDatabase;

実行結果にCreateDBと表示されれば、データベースの切り替えは完了です。

使用するデータベースをCreateDBへ切り替えたことをSQLで確認する画像

CREATE TABLEでテーブルを作成する

CreateDBへ切り替えたら、Productsテーブルを作成します。

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

CREATE TABLE dbo.Products
(
    ProductId INT IDENTITY(1, 1) NOT NULL,
    ProductName NVARCHAR(100) NOT NULL,
    Price INT NOT NULL,
    Stock INT NOT NULL CONSTRAINT DF_Products_Stock DEFAULT 0,
    CreatedAt DATETIME2 NOT NULL
        CONSTRAINT DF_Products_CreatedAt DEFAULT SYSDATETIME(),

    CONSTRAINT PK_Products
        PRIMARY KEY (ProductId)
);

「コマンドは正常に完了しました。」と表示されれば、Productsテーブルの作成は成功です。

テーブル作成画像

CREATE TABLEの基本構文は次のとおりです。

CREATE TABLE テーブル名
(
    カラム名 データ型 制約,
    カラム名 データ型 制約
);

Productsテーブルでは、商品番号、商品名、価格、在庫数、登録日時を保存できるようにしています。

各カラムはカンマで区切り、最後のカラムまたは制約の後ろにはカンマを付けません。

テーブル名とスキーマを確認する

今回のSQLでは、テーブル名を次のように記述しています。

dbo.Products

dboはスキーマ名、Productsはテーブル名です。

スキーマは、データベース内のテーブルなどを整理するためのグループのようなものです。

記述意味
dboスキーマ名
Productsテーブル名
dbo.Productsスキーマを含めた正式なテーブル名

SQL Serverではテーブル名だけでも実行できる場合がありますが、実務ではスキーマ名を含めて記述する方法が一般的です。

SELECT *
FROM dbo.Products;

スキーマ名を明示すると、どのテーブルを使用しているのかが分かりやすくなり、同名テーブルとの混同も防ぎやすくなります。

ProductIdの設定を確認する

ProductIdには、次の設定を指定しています。

ProductId INT IDENTITY(1, 1) NOT NULL

それぞれの意味は次のとおりです。

設定意味
INT整数を保存する
IDENTITY(1, 1)1から始まり、1ずつ自動で増加する
NOT NULLNULLを許可しない

IDENTITYを指定すると、データを登録するたびにProductIdが自動的に採番されます。

たとえば、最初のデータは1、次のデータは2、その次は3になります。

そのため、INSERT文でデータを登録するときは、ProductIdを指定する必要がありません。

ProductNameの設定を確認する

ProductNameには、次の設定を指定しています。

ProductName NVARCHAR(100) NOT NULL

NVARCHARは、日本語を含む文字列を保存できるデータ型です。

括弧内の100は、2バイトを1単位とした文字列の最大長を表します。

NVARCHAR(100)

この場合、最大100単位分を保存できます。一般的な日本語は1文字1単位ですが、一部の文字は2単位を使うため、必ず100文字入るとは限りません。

商品名には日本語を使用する可能性があるため、今回はNVARCHAR型を使用しています。

また、NOT NULLを指定しているため、商品名にNULLを登録することはできません。
空文字列や空白だけの入力を禁止するには、別途チェックが必要です。

PriceとStockの設定を確認する

PriceとStockには、INT型を指定しています。

Price INT NOT NULL,
Stock INT NOT NULL CONSTRAINT DF_Products_Stock DEFAULT 0

Priceには商品の価格、Stockには商品の在庫数を保存します。

StockにはDEFAULT 0を設定しているため、INSERT文で在庫数を指定しなかった場合は、自動的に0が登録されます。

DEFAULT制約には、次の名前を付けています。

DF_Products_Stock

制約名を付けずに作成することもできますが、SQL Serverが自動生成した名前は分かりにくくなることがあります。

実務では、あとから変更や削除をしやすくするために、制約へ分かりやすい名前を付ける方法がおすすめです。

CreatedAtの設定を確認する

CreatedAtには、データを登録した日時を保存します。

CreatedAt DATETIME2 NOT NULL
    CONSTRAINT DF_Products_CreatedAt DEFAULT SYSDATETIME()

DATETIME2は、SQL Serverで日付と時刻を保存するためのデータ型です。

DEFAULTにSYSDATETIME関数を指定しているため、INSERT文でCreatedAtを省略すると、SQL Serverが現在日時を自動登録します。

DEFAULT SYSDATETIME()

DATETIME型も使用できますが、新しくテーブルを作成する場合は、扱える日付範囲や精度の面からDATETIME2を選択する方法があります。

必要な精度や既存システムとの互換性によって適切な型は異なるため、実際の開発環境に合わせて確認してください。

PRIMARY KEY制約を確認する

Productsテーブルには、ProductIdを主キーとして設定しています。

CONSTRAINT PK_Products
    PRIMARY KEY (ProductId)

PRIMARY KEYは、テーブル内のデータを一意に識別するための制約です。

主キーに指定したカラムには、同じ値を重複して登録できません。

また、主キーにはNULLも登録できません。

今回のProductIdはIDENTITYによって自動採番されるため、商品ごとに異なる番号が設定されます。

制約名には、次の名前を付けています。

PK_Products

PKはPRIMARY KEYを表す接頭辞として使用されています。命名規則はプロジェクトによって異なりますが、制約の種類と対象テーブルが分かる名前にすると管理しやすくなります。

作成したテーブルのカラムをSQLで確認する

テーブルのカラム情報は、次のSQLで確認できます。

SELECT
    COLUMN_NAME,
    DATA_TYPE,
    CHARACTER_MAXIMUM_LENGTH,
    IS_NULLABLE,
    COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'dbo'
  AND TABLE_NAME = 'Products'
ORDER BY ORDINAL_POSITION;

このSQLを実行すると、カラム名、データ型、最大文字数、NULLの許可、初期値を一覧で確認できます。

作成したテーブルのカラムをSQLで確認する画像

CREATE TABLEの実行後は、意図したデータ型や制約になっているか確認することが重要です。

特に、文字列の最大文字数やNULLの許可設定を間違えると、データ登録時のエラーにつながります。

SSMSの画面だけでなく、SQLからテーブル定義を確認する方法も覚えておくと便利です。

サンプルデータを登録する

テーブルを作成できたら、動作確認用のデータを登録します。

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

INSERT INTO dbo.Products
(
    ProductName,
    Price,
    Stock
)
VALUES
    (N'ノートパソコン', 120000, 5),
    (N'マウス', 3000, 20),
    (N'キーボード', 8000, 10);

ProductIdとCreatedAtは自動的に設定されるため、INSERT文では指定していません。

文字列の前に付いているNは、日本語などのUnicode文字列として扱うための指定です。

N'ノートパソコン'

NVARCHAR型へ日本語を登録する場合は、文字列の前にNを付ける方法を覚えておきましょう。

SELECT文で登録結果を確認する

最後に、Productsテーブルへ登録されたデータを確認します。

SELECT
    ProductId,
    ProductName,
    Price,
    Stock,
    CreatedAt
FROM dbo.Products
ORDER BY ProductId;

実行結果に3件の商品が表示されれば、テーブルの作成とデータ登録は完了です。

登録結果を確認する画像

ProductIdには1から始まる連番が設定され、CreatedAtには登録時の日時が設定されます。実際のCreatedAtの値は、SQLを実行した日時によって異なります。

すべてのSQLをまとめて実行する

ここまでのSQLを最初からまとめて実行する場合は、次のコードを使用できます。

すでにCreateDBやProductsテーブルが存在する環境ではエラーになるため、初回実行用のSQLとして使用してください。

CREATE DATABASE CreateDB;
GO

USE CreateDB;
GO

CREATE TABLE dbo.Products
(
    ProductId INT IDENTITY(1, 1) NOT NULL,
    ProductName NVARCHAR(100) NOT NULL,
    Price INT NOT NULL,
    Stock INT NOT NULL CONSTRAINT DF_Products_Stock DEFAULT 0,
    CreatedAt DATETIME2 NOT NULL
        CONSTRAINT DF_Products_CreatedAt DEFAULT SYSDATETIME(),

    CONSTRAINT PK_Products
        PRIMARY KEY (ProductId)
);

INSERT INTO dbo.Products
(
    ProductName,
    Price,
    Stock
)
VALUES
    (N'ノートパソコン', 120000, 5),
    (N'マウス', 3000, 20),
    (N'キーボード', 8000, 10);

SELECT
    ProductId,
    ProductName,
    Price,
    Stock,
    CreatedAt
FROM dbo.Products
ORDER BY ProductId;

SQLを一括実行すると、データベース作成、テーブル作成、データ登録、検索結果の確認まで進められます。
GOはSSMSなどが認識するバッチ区切りです。データベースを作成してから、次のバッチでUSEを実行します。C#から実行する場合はGOをSQL Serverへ送らず、コマンドを分けてください。

ただし、エラーが発生した場所を特定しやすくするため、初心者のうちは手順ごとに分けて実行する方法がおすすめです。

よくあるエラー・注意点

CREATE文では、同名オブジェクトの重複やデータベースの選択間違いがよく発生します。

エラーが出た場合は、エラーメッセージだけでなく、現在選択しているデータベースと既存オブジェクトを確認してください。

エラー・症状主な原因対処法
LocalDBへ接続できないサーバー名が間違っている(localdb)\MSSQLLocalDBになっているか確認する
証明書に関するエラーが表示されるSSMSの暗号化設定と証明書が一致していない接続オプションで「サーバー証明書を信頼する」を確認する
データベースが表示されないオブジェクトエクスプローラーが更新されていない「データベース」を右クリックして最新の情報に更新する
データベースがすでに存在すると表示されるCREATE DATABASEを複数回実行した既存のCreateDBを使用するか、別名で作成する
テーブルがすでに存在すると表示されるCREATE TABLEを複数回実行した既存テーブルを使用するか、削除後に再作成する
Productsテーブルが見つからないCreateDB以外を選択しているUSE CreateDBを実行する
CREATE TABLEで構文エラーになるカンマや括弧が不足している各カラム間のカンマと最後の閉じ括弧を確認する
文字列が文字化けするVARCHARを使用している、またはNを付けていないNVARCHARを使用し、文字列をN付きで記述する
NULLを挿入できないNOT NULLの列にNULLを登録しようとしているNULL以外の値を指定する
データベースを作成する権限がない接続ユーザーにCREATE DATABASE権限がない権限のあるユーザーを使用する。環境管理者への確認が必要
同じ制約名が存在すると表示される同一データベース内で制約名が重複しているテーブル名を含む一意な制約名へ変更する

「データベースが既に存在します」と表示される

CREATE DATABASEを複数回実行すると、同じ名前のデータベースを再作成しようとしてエラーになります。

Database 'CreateDB' already exists.

この場合、CreateDBがすでに作成されている可能性があります。

次のSQLで存在を確認してください。

SELECT name
FROM sys.databases
WHERE name = 'CreateDB';

すでに存在する場合は、CREATE DATABASEを再実行せず、そのままUSE文で切り替えます。

USE CreateDB;

学習用に作り直す場合はDROP DATABASEで削除できますが、データベース内のテーブルやデータもすべて削除されます。

実際の業務環境では、管理者の許可なく実行しないでください。

「データベースにオブジェクトが既にあります」と表示される

CREATE TABLEを複数回実行すると、次のようなエラーが表示されます。

There is already an object named 'Products' in the database.

これは、Productsという名前のオブジェクトがすでに存在していることが原因です。

次のSQLでテーブルの存在を確認できます。

SELECT
    OBJECT_ID(N'dbo.Products', N'U') AS ObjectId;

NULL以外の値が表示された場合、Productsテーブルは存在しています。

作り直す場合はDROP TABLEを使用できます。

DROP TABLE dbo.Products;

ただし、DROP TABLEを実行するとテーブル内のデータも削除されます。必要なデータがないことを確認してから実行してください。

テーブルが別のデータベースに作成された

CREATE TABLEを実行する前にUSE文を実行していない場合、masterなど別のデータベースにテーブルが作成される可能性があります。

現在のデータベースは、次のSQLで確認できます。

SELECT DB_NAME() AS CurrentDatabase;

CREATE TABLEを実行する前に、結果がCreateDBになっていることを確認してください。

USE CreateDB;

SSMS上部のデータベース選択欄から切り替えることもできますが、SQLファイル単体でも対象が分かるように、USE文を明示する方法が安全です。

特に複数のデータベースを扱う環境では、実行先の確認を習慣化してください。

カンマの位置が原因で構文エラーになる

CREATE TABLEでは、カラムとカラムの間にカンマが必要です。

次のSQLは、ProductNameの後ろにカンマがないためエラーになります。

CREATE TABLE dbo.Products
(
    ProductId INT NOT NULL,
    ProductName NVARCHAR(100) NOT NULL
    Price INT NOT NULL
);

正しくは次のとおりです。

CREATE TABLE dbo.Products
(
    ProductId INT NOT NULL,
    ProductName NVARCHAR(100) NOT NULL,
    Price INT NOT NULL
);

一方で、最後のカラムの後ろに不要なカンマを付けると、環境や記述によって構文エラーになります。

カラム間にはカンマを付け、最後には付けないと覚えておきましょう。

エラー位置として表示された行と、実際に間違っている行が異なる場合もあるため、エラー行の直前も確認してください。

データ型の選び方に注意する

カラムのデータ型は、保存する値に合わせて選択する必要があります。

保存する値データ型の例
整数INT
大きな整数BIGINT
日本語を含む文字列NVARCHAR
日付と時刻DATETIME2
日付のみDATE
小数DECIMAL
真偽値BIT

金額を保存する場合、整数だけでよければINTを使用できます。

小数を扱う場合は、次のようにDECIMAL型を使用します。

Price DECIMAL(10, 2) NOT NULL

FLOATは近似値を扱うデータ型であるため、金額のように正確さが必要な値では注意が必要です。

保存する値の範囲と必要な精度を考えてデータ型を選んでください。

あとからデータ型を変更すると既存データへ影響する可能性があるため、テーブル作成前の設計が重要です。

DROP文の実行には注意する

学習中にテーブルやデータベースを作り直す場合、DROP文を使用することがあります。

DROP TABLE dbo.Products;
DROP DATABASE CreateDB;

DROP文を実行すると、対象のテーブルやデータベースが削除されます。

削除されたデータは通常の操作では元に戻せません。

特にDROP DATABASEは、データベース内のテーブル、データ、制約などをまとめて削除します。

学習用環境であっても、実行前に対象名と接続先を確認してください。業務環境では、バックアップや管理者の承認が必要になる場合があります。

まとめ

この記事では、SQL Server LocalDBとSSMSを使用し、CREATE文でデータベースとテーブルを作成しました。

CREATE文は、データを登録する前に必要となるデータベースの構造を定義する命令です。

今回のポイントは次のとおりです。

  • CREATE DATABASEでデータベースを作成できる
  • USE文でSQLを実行するデータベースを切り替える
  • CREATE TABLEでテーブルとカラムを定義できる
  • データ型は保存する値に合わせて選択する
  • PRIMARY KEYでデータを一意に識別する
  • NOT NULLやDEFAULTで登録できる値のルールを決める
  • CREATE文を再実行すると、同名オブジェクトの重複エラーになる
  • 実行後はSSMSまたはSQLで作成結果を確認する

CREATE TABLEでは、単にカラム名を並べるだけでなく、データ型や制約を適切に設定することが重要です。

特に、主キー、NULLの許可、初期値、文字列の最大長は、テーブル作成時に確認しておきましょう。

CREATE文を理解したあとは、INSERT文でデータを登録し、SELECT文で取得する方法を学ぶと、SQLの基本的な流れを理解しやすくなります。

参考:Microsoft:USE/GO/nchar・nvarchar/NULL