Skip to content

第16章 SQLServer 環境構築

この章では、研修で使うデータベース環境を、自分の手で構築できる ようになることを目指します。

次章の 第 17 章「C#からデータベースを操作する」 では、C# から TrainingDB に接続して SQL を実行します。 この章では、その TrainingDB を SSMS(SQL Server Management Studio)を使って自分で作ります。

SQLServer 2022 と SSMS のインストール(付録 G)
SSMS で localhost に接続 ← この章の開始地点
TrainingDB データベース作成
departments / employees テーブル作成(社員系)
products / orders / order_items テーブル作成(商品・注文系)
サンプルデータ投入
SSMS の基本操作(クエリ実行・データ確認)

第 18 章以降の Windows フォーム章や Web MVC 章でも、ここで作る TrainingDB をそのまま使い続けます。

研修中の進め方について

研修では、SQLServer・SSMS・TrainingDB事前に用意されている前提 です。 この章は、自分の端末で研修を再現したいとき、または現場で DB を触る基礎を身につけたいときに進めてください。 研修時間内に必ず実施する章ではありません。


この章でできるようになること

Section titled “この章でできるようになること”

この章を終えると、次のことができるようになります。

  • SSMS から localhost の SQLServer に接続できる
  • SSMS でデータベース(TrainingDB)を新規作成できる
  • CREATE TABLEdepartmentsemployees(社員系)を作成できる
  • CREATE TABLEproductsordersorder_items(商品・注文系)を作成できる
  • 複数のテーブルにまたがる外部キー(注文 → 商品)を指定できる
  • INSERT でサンプルデータを投入できる
  • SSMS のクエリエディタで SELECT を実行できる
  • SSMS のオブジェクトエクスプローラーでテーブル・データを確認できる

項目内容
データベース管理SQL Server Management Studio (SSMS)
データベースSQLServer 2022(Express Edition で OK)
認証方式Windows 統合認証
作成するデータベースTrainingDB
作成するテーブル社員系:departmentsemployees / 商品・注文系:productsordersorder_items

SQLServer / SSMS がまだインストールされていない場合

付録 G「SQLServer 2022 / SSMS インストール手順」を先に進めてください。


作業を始める前に、次の内容を確認してください。

  • SQLServer 2022 がインストール済みで、サービスが「実行中」になっている
  • SSMS がインストール済みで、起動できる
  • Windows ユーザーで Windows にログインしている(統合認証で使うため)
  • 第 15 章までの内容を Git に提出済みである

この章を通して、次のデータベース構造を作ります。 社員系(部署・社員)と 商品・注文系(商品・注文・注文明細)の 2 グループです。

TrainingDB
│ ◆ 社員系
├─ departments テーブル(部署マスター)
│ department_id department_name manager_id
│ ----------- --------------- ----------
│ 1 総務 ...
│ ...
├─ employees テーブル(社員)
│ employee_id last_name first_name email hire_date salary department_id
│ ----------- --------- ---------- ----------------------- --------- -------- --------------
│ 1001 山田 二郎 yamada.jiro@example.com ... 500000.00 1
│ ...
│ ◆ 商品・注文系
├─ products テーブル(商品マスター)
│ product_id product_name category price stock
│ ---------- ------------ -------- ----- -----
│ 1 ノート 文房具 180 50
│ ...
├─ orders テーブル(注文)
│ order_id customer_name order_date
│ -------- ------------- ----------
│ 1 田中商店 2026-05-10
│ ...
└─ order_items テーブル(注文明細)
order_item_id order_id product_id quantity
------------- -------- ---------- --------
1 1 1 3
...

社員名・部署名は SQL 研修で扱った Oracle の pingt ユーザーと同じ顔ぶれにしてあり、研修間の連続性を持たせています。 商品(products)は、第 12 章・第 14 章の演習で使った商品リスト(ノート・マグカップなど 6 件)と同じものを DB 化したもので、コンソールで学んだ List<Product> がそのまま DB のテーブルに対応することを体感できます。 orders / order_items は、1 つの注文が複数の商品を含む 「1 対多」 の関係を表し、第 17 章以降で テーブルを結合(JOIN)する 演習の題材になります。

詳細なテーブル定義とサンプルデータ

完全な CREATE 文・INSERT 文は、docs_meta/章間整合ルール.md セクション 1-2 にまとまっています(本章 16-4 / 16-5 でも掲載します)。


16-2 SSMS でサーバーに接続する

Section titled “16-2 SSMS でサーバーに接続する”

SSMS を起動すると、まず 「サーバーへの接続」ダイアログ が表示されます。

次のとおり入力してください。

項目
サーバーの種類データベース エンジン
サーバー名localhost
認証Windows 認証
暗号化オプション(Optional)
サーバー証明書を信頼チェックを入れる

入力したら 接続 をクリックします。

TODO: 図16-1「SSMS サーバー接続ダイアログ」を挿入する

接続に成功すると、左側に オブジェクトエクスプローラー が表示され、ツリー状にサーバー情報を確認できます。

DESKTOP-XXXX (SQL Server 16.0.x - DESKTOP-XXXX\username)
├─ データベース
│ ├─ システム データベース
│ │ ├─ master
│ │ ├─ model
│ │ ├─ msdb
│ │ └─ tempdb
│ └─ (ユーザーが作ったデータベースがここに並びます)
├─ セキュリティ
├─ サーバー オブジェクト
└─ 管理

TODO: 図16-2「SSMS オブジェクトエクスプローラーの全体像」を挿入する

接続できない場合は、付録 G「よくあるトラブル」を確認してください。


データベースを作る方法は 2 つあります。どちらで進めても構いません。

  1. オブジェクトエクスプローラーの データベース を右クリック
  2. 新しいデータベース を選択
  3. データベース名に TrainingDB と入力
  4. 他はそのままで OK をクリック

TODO: 図16-3「新しいデータベース ダイアログ」を挿入する

  1. ツールバーの 新しいクエリ をクリックして、新しいクエリエディタを開く
  2. 次の SQL を入力する
CREATE DATABASE TrainingDB;
  1. F5 キー または 実行 ボタンで実行

実行が成功すると、メッセージ ウィンドウに 「コマンドは正常に完了しました」 と表示されます。

オブジェクトエクスプローラーの データベース を右クリックして 更新 を選び、TrainingDB がツリーに現れたら成功です。


TrainingDB の中に、departments テーブルと employees テーブルを作ります。

クエリエディタの上部にあるデータベース選択ドロップダウンを、TrainingDB に切り替えます。 これ以降のクエリは TrainingDB の中で実行されます。

TODO: 図16-4「クエリエディタのデータベース選択」を挿入する

または、クエリの先頭に次の 1 行を書いても同じ効果になります。

USE TrainingDB;

新しいクエリエディタに次の SQL を入力して実行します。

CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name NVARCHAR(30) NOT NULL,
manager_id INT
);

各列の意味は次のとおりです。

意味
department_idINT部署 ID(主キー)
department_nameNVARCHAR(30)部署名
manager_idINT部署長の社員 ID(NULL 可)

NVARCHAR とは

日本語などの Unicode 文字を扱える可変長文字列型です。 SQLServer では、日本語データを扱う場合は VARCHAR ではなく NVARCHAR を使うのが推奨です。

続けて、次の SQL を実行します。

CREATE TABLE employees (
employee_id INT PRIMARY KEY IDENTITY(1001, 1),
last_name NVARCHAR(15) NOT NULL,
first_name NVARCHAR(15) NOT NULL,
email NVARCHAR(50) UNIQUE,
hire_date DATE NOT NULL,
salary DECIMAL(10, 2),
department_id INT,
CONSTRAINT FK_employees_departments
FOREIGN KEY (department_id)
REFERENCES departments(department_id)
);

このテーブルには、SQL 研修の Oracle 版にはなかった要素がいくつか含まれています。

要素説明
姓名分離(last_name / first_name)検索や並び替えで使いやすい構造
email NVARCHAR(50) UNIQUEメールアドレスの重複を許さない
salary DECIMAL(10, 2)給与に小数点を持てる型
IDENTITY(1001, 1)1001 から 1 ずつ自動採番
外部キー制約 FK_employees_departments不正な department_id を防ぐ

オブジェクトエクスプローラーの TrainingDBテーブル を右クリックして 更新 を選びます。 dbo.departmentsdbo.employees が現れたら成功です。

dbo は何?

dboschema(スキーマ) の名前で、「データベース所有者」を意味する SQLServer の既定スキーマです。 本研修では深入りせず、「テーブル名の前に付く名前空間のようなもの」と理解しておけば十分です。

products テーブルを作成する(商品・注文系)

Section titled “products テーブルを作成する(商品・注文系)”

続いて、商品・注文系のテーブルを作ります。まず商品マスターの products です。

CREATE TABLE products (
product_id INT PRIMARY KEY IDENTITY(1, 1),
product_name NVARCHAR(30) NOT NULL,
category NVARCHAR(20) NOT NULL,
price INT NOT NULL,
stock INT NOT NULL
);
意味
product_idINT商品 ID(主キー、1 から自動採番)
product_nameNVARCHAR(30)商品名
categoryNVARCHAR(20)カテゴリ(文房具・食器・衣類 など)
priceINT価格(円。本研修では小数を扱わないため INT)
stockINT在庫数

priceINT にしている理由

給与(employees.salary)は小数を持てる DECIMAL にしましたが、商品価格は第 12 章・第 14 章の演習でも整数(円)で扱ってきたため、ここでも INT にそろえています。

注文 1 件を表す orders テーブルを作ります。

CREATE TABLE orders (
order_id INT PRIMARY KEY IDENTITY(1, 1),
customer_name NVARCHAR(30) NOT NULL,
order_date DATE NOT NULL
);
意味
order_idINT注文 ID(主キー、自動採番)
customer_nameNVARCHAR(30)注文した顧客名
order_dateDATE注文日

1 つの注文に含まれる商品の明細を表す order_items テーブルを作ります。 「どの注文(order_id)に、どの商品(product_id)が、いくつ(quantity)含まれるか」を 1 行で表します。

CREATE TABLE order_items (
order_item_id INT PRIMARY KEY IDENTITY(1, 1),
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
CONSTRAINT FK_order_items_orders
FOREIGN KEY (order_id)
REFERENCES orders(order_id),
CONSTRAINT FK_order_items_products
FOREIGN KEY (product_id)
REFERENCES products(product_id)
);

このテーブルには 2 つの外部キー があります。

制約意味
FK_order_items_ordersorder_id は必ず orders に存在する注文を指す
FK_order_items_productsproduct_id は必ず products に存在する商品を指す

明細に価格を持たせていないのはなぜ?

order_items には価格を持たせず、金額は products.price × quantity計算で求める 設計にしています。 こうすると価格を二重に持たずに済みます(第 17 章以降で、JOIN して金額を集計する演習に使います)。 ※ 実務では「注文時点の価格」を明細に保存することもありますが、本研修では単純化しています。

テーブル作成の確認(商品・注文系)

Section titled “テーブル作成の確認(商品・注文系)”

オブジェクトエクスプローラーの テーブル更新 し、dbo.productsdbo.ordersdbo.order_items が現れたら成功です。

作成する順番に注意

外部キーは「参照先のテーブルが先に存在している」必要があります。 order_itemsordersproducts を参照するので、productsordersorder_items の順 に作成してください(順番を間違えると外部キー制約エラーになります)。


16-5 サンプルデータを投入する

Section titled “16-5 サンプルデータを投入する”

作成したテーブルに、研修で使うサンプルデータを入れます。

クエリエディタに次の SQL を入力して実行します。

INSERT INTO departments (department_id, department_name) VALUES
(1, N'総務'),
(2, N'営業'),
(3, N'開発'),
(4, N'マーケティング'),
(5, N'品質管理');

N'...' の N は何?

文字列リテラルの前に N を付けると、Unicode 文字列 として扱われます。 日本語データを NVARCHAR 列に入れる場合は、N'総務' のように N を付けるのが安全です。

続けて、次の SQL を実行します。

INSERT INTO employees (last_name, first_name, email, hire_date, salary, department_id) VALUES
(N'山田', N'二郎', N'yamada.jiro@example.com', '2001-04-01', 500000, 1),
(N'佐藤', N'昭夫', N'sato.akio@example.com', '2002-04-01', 500000, 2),
(N'山口', N'洋子', N'yamaguchi.yoko@example.com', '2003-04-01', 500000, 3),
(N'田中', N'浩介', N'tanaka.kosuke@example.com', '2004-04-01', 500000, 4),
(N'加藤', N'昭彦', N'kato.akihiko@example.com', '2005-04-01', 500000, 5),
(N'佐々木', N'明子', N'sasaki.akiko@example.com', '2006-04-01', 800000, 1),
(N'菊池', N'浩二', N'kikuchi.koji@example.com', '2007-04-01', 800000, 1),
(N'中山', N'大輔', N'nakayama.daisuke@example.com', '2008-04-01', 400000, 1),
(N'星野', N'健一', N'hoshino.kenichi@example.com', '2009-04-01', 400000, 2),
(N'斎藤', N'京子', N'saito.kyoko@example.com', '2010-04-01', 400000, 3);

employee_idIDENTITY(1001, 1) で自動採番されるため、INSERT の列指定からは外しています。 これで、10011010 の 10 件のデータが入ります。

商品マスターに 6 件を投入します。第 12 章・第 14 章の演習で使ったものと同じ商品です。

INSERT INTO products (product_name, category, price, stock) VALUES
(N'ノート', N'文房具', 180, 50),
(N'ボールペン', N'文房具', 120, 100),
(N'サインペン', N'文房具', 200, 40),
(N'マグカップ', N'食器', 800, 20),
(N'タンブラー', N'食器', 1700, 8),
(N'Tシャツ', N'衣類', 2400, 15);

product_idIDENTITY(1, 1) で自動採番されるため、16 が割り当てられます。

注文を 3 件、その明細を 5 件投入します。 明細は product_id で商品を参照するので、上の products を投入した後に実行してください。

INSERT INTO orders (customer_name, order_date) VALUES
(N'田中商店', '2026-05-10'),
(N'佐藤文具', '2026-05-11'),
(N'山田商会', '2026-05-12');
INSERT INTO order_items (order_id, product_id, quantity) VALUES
(1, 1, 3), -- 注文1:ノート × 3
(1, 4, 2), -- 注文1:マグカップ × 2
(2, 2, 5), -- 注文2:ボールペン × 5
(2, 3, 2), -- 注文2:サインペン × 2
(3, 6, 1); -- 注文3:Tシャツ × 1

注文ごとの合計金額(参考)

金額は明細に持たせず products.price × quantity で計算します。上のデータでは次のようになります。

注文顧客内訳合計
1田中商店ノート 180×3 + マグカップ 800×22140 円
2佐藤文具ボールペン 120×5 + サインペン 200×21000 円
3山田商会Tシャツ 2400×12400 円

この「JOIN して金額を集計する」処理は、第 17 章以降の演習で扱います。

次の SQL で件数を確認します。

SELECT COUNT(*) AS dept_count FROM departments;
SELECT COUNT(*) AS emp_count FROM employees;
SELECT COUNT(*) AS product_count FROM products;
SELECT COUNT(*) AS order_count FROM orders;
SELECT COUNT(*) AS item_count FROM order_items;
期待される値
dept_count5
emp_count10
product_count6
order_count3
item_count5

ここまでで TrainingDB の構築は完了です。 SSMS の主な操作を整理しておきます。

クエリエディタで SQL を実行する

Section titled “クエリエディタで SQL を実行する”
  • 新しいクエリ:ツールバーの「新しいクエリ」 をクリック
  • 実行:F5 キー または 実行ボタン
  • 部分実行:選択した範囲だけを実行(複数 SQL を順に試したいときに便利)
  • 結果:下部の 結果 タブと メッセージ タブで確認

SELECT 文の結果は、結果ウィンドウに表形式で並びます。 列見出しの境界をドラッグすると、列幅を調整できます。

SELECT
employee_id,
last_name + N' ' + first_name AS full_name,
department_id,
salary
FROM employees
ORDER BY employee_id;

Oracle の || は SQLServer では +

SQL 研修(Oracle)では文字列の連結に || を使いましたが、SQLServer では + で連結します(上の last_name + N' ' + first_name)。 SQL 研修の感覚で || と書くとエラーになります。Oracle と SQLServer の SQL の細かな違いは、次章の 第 17 章「17-9 Oracle と SQLServer の違い」 に早見表があります。

テーブルを右クリック → 上位 200 行の編集 で、Excel のような画面でデータを編集できます。

TODO: 図16-5「上位 200 行の編集 画面」を挿入する

研修では基本的にクエリで操作しますが、ちょっとした確認・修正には便利です。

クエリエディタの内容は ファイル → 名前を付けて保存.sql ファイルとして保存できます。 この章で書いた CREATE TABLEINSERT の SQL は、setup_training_db.sql などの名前で保存しておくと、再構築時に役立ちます。


次章の C# 接続コードがこの TrainingDB に接続できるよう、ここで接続情報を確認しておきます。

次章(第 17 章)で使う接続文字列を示します。

Server=localhost;Database=TrainingDB;Integrated Security=true;TrustServerCertificate=true;
項目期待される値確認方法
Server=localhostサーバー名 localhost で SSMS が接続できているSSMS の接続ダイアログを再確認
Database=TrainingDBデータベース名 TrainingDB がオブジェクトエクスプローラーに見えるツリーで確認
Integrated Security=trueWindows 統合認証で SSMS が接続できている接続ダイアログの「認証」が「Windows 認証」
TrustServerCertificate=true接続時の証明書警告が出ない次章のコードを実行したときに確認

次章で作る Kd17_01_HelloSqlServer を実行し、employees テーブルの件数:10件 が表示されれば、第17章への準備は完了です。


症状原因対処
SSMS が起動しないインストール失敗、または別バージョンと競合付録 G を参照して再インストール
サーバーに接続できない(Error 53 系)SQLServer サービスが停止しているWindows の「サービス」で SQL Server (MSSQLSERVER) を「実行中」にする
サーバー名 localhost で接続できない名前付きインスタンスでインストールしたlocalhost\SQLEXPRESS などインスタンス名を確認(付録 G 参照)
CREATE DATABASE で「権限がありません」Windows ユーザーが管理者ロールに含まれていないSSMS を「管理者として実行」してみる、または DBA に依頼
日本語が ??? で入るNVARCHAR ではなく VARCHAR を使っている、または N プレフィックスがない列を NVARCHAR に、リテラルを N'...'
外部キー制約エラー(社員系)先に departments を作る前に employees を作ったテーブル作成順を departmentsemployees の順に
外部キー制約エラー(商品・注文系)orders / products より先に order_items を作った、または products 投入前に order_items を投入した作成順は productsordersorder_items、データ投入も同じ順に
IDENTITY の値が予想と違う過去の INSERT 失敗で番号が飛んだDBCC CHECKIDENT('employees', RESEED, 1000) で再シードできる(発展)

この章で学んだ内容をチェックしてください。

  • SSMS で localhost に Windows 統合認証で接続できる
  • SSMS でデータベースを新規作成できる(GUI / SQL の両方)
  • CREATE TABLE で主キー・NOT NULL・UNIQUE・外部キーを指定できる
  • 1 つのテーブルに複数の外部キー(order_items)を指定できる
  • 外部キーがあるテーブルを作る順番・データ投入の順番を説明できる
  • IDENTITY の意味を説明できる
  • NVARCHARVARCHAR の違いを説明できる
  • INSERT INTO ... VALUES で複数行のデータを一括投入できる
  • N'...' の役割を説明できる
  • SSMS のクエリエディタで SELECT を実行して結果を確認できる
  • 1 対多の関係(注文 → 注文明細)を説明できる
  • 次章で使う接続文字列が、この環境に対応していることを説明できる

ペアで以下の質問に答えてみてください。

  1. TrainingDB の中には、どんなテーブルがありますか(社員系・商品注文系)。
  2. IDENTITY(1001, 1) とは何ですか。
  3. NVARCHAR を使うのはどんなときですか。
  4. N'総務' の N は何のためにありますか。
  5. 外部キー制約 FK_employees_departments は何を防いでいますか。
  6. order_items に外部キーが 2 つあるのはなぜですか。
  7. productsordersorder_items を作る順番は、なぜその順でなければならないのですか。
  8. SSMS で SQL を実行するキーは何ですか。
  9. Server=localhostlocalhost は何を指していますか。

この章の作業が完了したか、次の点を確認してください(ペアチェックの観点と合わせて使えます)。

  • TrainingDB データベースが SSMS のオブジェクトエクスプローラーに表示される
  • departments テーブルが 5 件のデータを持っている
  • employees テーブルが 10 件のデータを持っている
  • products テーブルが 6 件のデータを持っている
  • orders テーブルが 3 件、order_items テーブルが 5 件のデータを持っている
  • employeesSELECT して日本語の氏名が正しく表示される(文字化けしていない)
  • 隣の人と画面を見せ合い、テーブルがそろっていることを確認した
  • (推奨)CREATE 文と INSERT 文を setup_training_db.sql などとして手元に保存した
  • 次章(第 17 章)に進んだ後、Kd17_01_HelloSqlServer で件数 10 が返ることを確認できる

テーブルがそろったか確認する(ペアチェック)

Section titled “テーブルがそろったか確認する(ペアチェック)”

この章の成果物は、コードではなく SSMS の中に作られたデータベース です。 そのため、Git への提出は行いません。代わりに、隣の人とお互いの画面を見せ合って、テーブルとデータが正しくそろっているか を確認しましょう。

まず、件数確認の SQL を実行して、次のとおりになっているかを見ます。

SELECT COUNT(*) AS dept_count FROM departments; -- 5
SELECT COUNT(*) AS emp_count FROM employees; -- 10
SELECT COUNT(*) AS product_count FROM products; -- 6
SELECT COUNT(*) AS order_count FROM orders; -- 3
SELECT COUNT(*) AS item_count FROM order_items; -- 5

隣の人と画面を見せ合い、次の 3 点をお互いに確認してください。

  1. オブジェクトエクスプローラーTrainingDB → テーブル に、dbo.departments / dbo.employees / dbo.products / dbo.orders / dbo.order_items5 つ が並んでいる
  2. 上の件数確認 SQL の結果が 5 / 10 / 6 / 3 / 5 になっている
  3. employeesSELECT して、日本語の氏名が ??? などに化けず正しく表示されている

どれかが合っていなければ、この章のどの手順でつまずいたかを一緒に探してみましょう(「よくあるつまずき」表も参照)。 人に説明しながら確認すると、自分の理解も深まります。

.sql ファイルは保存しておくのがおすすめ(提出は不要)

提出は不要ですが、この章で書いた CREATE TABLEINSERTsetup_training_db.sql などの名前で保存しておくと、環境を作り直すときや別の端末で再現するときに一発で復元できます(保存方法は 16-6 参照)。手元に残しておきましょう。


この章では、SQLServer の研修用データベース TrainingDB を自分の手で構築しました。

主な内容は次のとおりです。

  • SSMS で localhost に Windows 統合認証で接続する
  • CREATE DATABASECREATE TABLE でデータベース・テーブルを作る
  • 社員系(departments / employees)と商品・注文系(products / orders / order_items)の 2 グループのテーブルを作る
  • 主キー・NOT NULL・UNIQUE・外部キー・IDENTITY などの制約を SQLServer の書き方で指定する
  • 1 対多の関係(注文 → 注文明細)を、外部キー 2 つを持つテーブルで表現する
  • 外部キーがあるテーブルは、参照先 → 参照元の順に作成・投入する
  • NVARCHARN'...' リテラルで日本語データを安全に扱う
  • INSERT でサンプルデータを投入し、SELECT COUNT(*) で件数を確認する
  • SSMS のクエリエディタの基本操作(実行、結果表示、ファイル保存)

これで、次章で書く C# 接続コードを動かす環境が、自分の手で構築できました。


この章で、研修で使う TrainingDB を自分の手で構築する手順を身に付けました。

次章 第 17 章「C#からデータベースを操作する」 では、今構築した TrainingDB に対して C# のコンソールアプリから接続し、SQL を実行して結果を受け取る基本パターンを学びます。 Microsoft.Data.SqlClient を使った接続コード、SqlConnection / SqlCommand / ExecuteScalar の組み合わせ、SqlException を含む例外処理が中心です。

第 18 章以降の Windows フォーム章でも、ここで作った TrainingDB をそのまま使い続けます。