SQL再入門3 SQL Server テーブルの更新

# SELECTばかりだとつらいので、データーの編集をしてみよう。

## 前段
とはいえ、条件文や、プライマリーキーや制約付きのインデックスについての知識が必要です。
軽く説明しますが、ここではそんなものがあるのでという程度

データ編集時に特に注意すべき点は、プライマリーキーと制約付きのインデックスです。これらの概念と、データ編集時に考慮すべきポイントについて初心者向けに説明します。

### プライマリーキー (Primary Key)

プライマリーキーは、テーブル内の各行を一意に識別するためのカラム（またはカラムの組み合わせ）です。

#### 注意点:
- **一意性**: プライマリーキーの値はテーブル内で重複することはできません。
- **NULL不許容**: プライマリーキーのカラムにはNULLを設定することはできません。
- **不変性**: 一度設定されたプライマリーキーの値は変更すべきではありません。変更すると、参照整合性が損なわれる可能性があります。

### 制約付きインデックス (Constrained Indexes)

インデックスは、データの検索を高速化するために使用されるデータ構造です。インデックスに制約を追加することで、データの整合性を保ちます。

#### 注意点:
- **ユニークインデックス**: ユニークインデックスは、インデックスが適用されたカラムの値が一意であることを保証します。
- **外部キー制約**: 他のテーブルのカラムを参照するカラムに設定され、参照されるデータの整合性を保ちます。
- **チェック制約**: カラムに入力されるデータが特定の条件を満たすように制約をかけることができます。

### データ編集時の一般的な注意点

1. **プライマリーキーの変更**: プライマリーキーを変更する場合は、そのキーを外部キーとして使用している他のテーブルにも影響が出る可能性があるので注意が必要です。

2. **外部キー制約の考慮**: 外部キー制約があるカラムを編集する場合、参照しているテーブルの値と一致する必要があります。

3. **ユニーク制約の遵守**: ユニーク制約があるカラムには、重複しない値を挿入する必要があります。

4. **トランザクションの使用**: データの整合性を保つために、編集作業はトランザクションとして実行し、問題が発生した場合にはロールバック（変更前の状態に戻す）ができるようにします。

5. **バックアップの取得**: 大規模な更新や削除を行う前には、データベースのバックアップを取得しておくことをお勧めします。

### まとめ

データ編集時は、プライマリーキーと制約付きインデックスを尊重する必要があります。これらの制約はデータの整合性を保つために重要であり、無視するとデータの矛盾や整合性の問題を引き起こす可能性があります。編集作業は慎重に行い、必要に応じてトランザクション管理を利用してください。

## まずは新規登録

 T-SQLにおけるINSERT文の使い方

## INSERT文とは？
INSERT文は、SQL Serverのデータベースに新しい行を追加するために使用されるT-SQLコマンドです。

## 基本的な構文

### 特定のカラムに値を挿入する
```sql
INSERT INTO テーブル名 (カラム1, カラム2, カラム3, ...)
VALUES (値1, 値2, 値3, ...);
```

- `テーブル名`: データを挿入するテーブルの名前。
- `カラム1, カラム2, ...`: 値を挿入するカラムの名前。
- `値1, 値2, ...`: 各カラムに挿入するデータの値。

### すべてのカラムに値を挿入する
```sql
INSERT INTO テーブル名
VALUES (値1, 値2, 値3, ...);
```

- この方法を使用する場合、テーブルのすべてのカラムに対して値を順番に指定します。

## 使用例

### 例1: 特定のカラムにデータを挿入
```sql
INSERT INTO students (name, age, email)
VALUES ('山田太郎', 20, 'taro@example.com');
```

### 例2: すべてのカラムにデータを挿入
```sql
INSERT INTO students
VALUES (1, '山田太郎', 20, 'taro@example.com');
```
- この場合、最初の値`1`は学生のIDであると仮定しています。

## 注意点

- 値はカラムのデータ型と一致している必要があります。
- プライマリーキーなどのユニーク制約があるカラムには、重複しない値を挿入する必要があります。
- NULLを許容しないカラムには値を指定しなければなりません。
- 外部キー制約があるカラムに値を挿入する場合、その値は参照先のテーブルに存在している必要があります。

## まとめ

INSERT文は、新しいデータをテーブルに追加する際に使用します。挿入するデータはテーブルのカラムのデータ型と制約に適合している必要があります。慎重にデータを挿入し、データの整合性を保ちましょう。



# T-SQLにおけるUPDATE文の使い方

## UPDATE文とは？
UPDATE文は、SQL Serverのデータベース内の既存のデータを変更するために使用されるT-SQLコマンドです。

## 基本的な構文

```sql
UPDATE テーブル名
SET カラム1 = 値1, カラム2 = 値2, ...
WHERE 条件;
```

- `テーブル名`: 更新するデータが含まれるテーブルの名前。
- `SET`: 更新するカラムとその新しい値を指定します。
- `WHERE`: どの行を更新するかを特定する条件を指定します（これがないと、テーブルの全行が更新されます）。

## 使用例

### 例: 特定のレコードを更新する
`students`テーブルの`student_id`が`1`の学生のメールアドレスを更新する場合は以下のようになります。

```sql
UPDATE students
SET email = 'newemail@example.com'
WHERE student_id = 1;
```

## 注意点

- `WHERE`句を省略すると、テーブル内の全てのレコードが更新されるため、非常に注意が必要です。
- 更新するデータはカラムのデータ型と一致している必要があります。
- ユニーク制約や外部キー制約などのデータベースの制約に違反しないようにしなければなりません。
- 更新が影響を与える行の数が多い場合は、パフォーマンスに影響を及ぼす可能性があります。

## まとめ

UPDATE文は、データベース内の既存のデータを変更する際に使用します。更新作業は慎重に行い、意図しないデータ変更を避けるために`WHERE`句を正しく使用してください。また、データベースの整合性を保つために、制約に注意して更新を行うことが重要です。


# T-SQLにおけるMERGE文の使い方

## MERGE文とは？
MERGE文は、SQL Serverでソース（入力）テーブルとターゲット（目的）テーブルのデータを組み合わせて、挿入、更新、または削除を一つの文で行うためのT-SQLコマンドです。

## 基本的な構文

```sql
MERGE INTO ターゲットテーブル AS Target
USING ソーステーブル AS Source
ON (マージ条件)
WHEN MATCHED THEN
    UPDATE SET Target.カラム1 = Source.カラム1, ...
WHEN NOT MATCHED BY TARGET THEN
    INSERT (カラム1, カラム2, ...) VALUES (Source.カラム1, Source.カラム2, ...)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;
```

- `ターゲットテーブル`: 更新されるデータが含まれるテーブル。
- `ソーステーブル`: 新しいデータが含まれるテーブルまたはクエリ。
- `マージ条件`: ソースとターゲットのレコードをどのように一致させるかの条件。
- `WHEN MATCHED`: ターゲットとソースの条件が一致した場合の操作を指定。
- `WHEN NOT MATCHED BY TARGET`: ソースには存在するがターゲットには存在しない場合の操作を指定。
- `WHEN NOT MATCHED BY SOURCE`: ターゲットには存在するがソースには存在しない場合の操作を指定。

## 使用例

### 例: ターゲットテーブルをソーステーブルのデータで更新する
以下の例では、`employees`テーブルを`new_employees`データで更新します。

```sql
MERGE INTO employees AS Target
USING new_employees AS Source
ON Target.employee_id = Source.employee_id
WHEN MATCHED THEN
    UPDATE SET Target.name = Source.name, Target.salary = Source.salary
WHEN NOT MATCHED BY TARGET THEN
    INSERT (employee_id, name, salary) VALUES (Source.employee_id, Source.name, Source.salary)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;
```

## 注意点

- `MERGE`文は非常に強力で、一つの文で複数の操作を実行できますが、複雑なロジックを持つため、使用には慎重さが求められます。
- トランザクション内で実行することを検討し、必要に応じてロールバックできるようにしてください。
- `MERGE`文を使用する前には、十分なテストを行い、意図しないデータの損失や不整合が発生しないようにしてください。

## まとめ

MERGE文は、複数のデータベース操作を効率的に一つの文で行うために使用されます。ただし、その強力な機能性ゆえに、慎重な使用とテストが必要です。データの整合性を保ち、意図しない結果を避けるためにも、その使用法をよく理解し、適切なテストを行うことが重要です。

# T-SQLにおけるMERGE文の例題

## MERGE文とは？
MERGE文は、SQL Serverでソーステーブル（入力データ）とターゲットテーブル（更新対象）のデータを組み合わせ、一つの文で挿入、更新、または削除を行うT-SQLコマンドです。

## 例題: 社員データの更新
以下の例では、`Employees`テーブル（ターゲットテーブル）を`NewEmployees`テーブル（ソーステーブル）のデータで更新します。

### ターゲットテーブル（Employees）
| EmployeeID | Name | Department |
|------------|------|------------|
| 1          | John | Sales      |
| 2          | Jane | Marketing  |

### ソーステーブル（NewEmployees）
| EmployeeID | Name | Department |
|------------|------|------------|
| 1          | John | Marketing  |
| 3          | Mike | Sales      |

### MERGE文の使用
```sql
MERGE INTO Employees AS Target
USING NewEmployees AS Source
ON Target.EmployeeID = Source.EmployeeID
WHEN MATCHED THEN
    UPDATE SET Target.Department = Source.Department
WHEN NOT MATCHED BY TARGET THEN
    INSERT (EmployeeID, Name, Department)
    VALUES (Source.EmployeeID, Source.Name, Source.Department)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;
```

### 結果
このMERGE文により、以下の操作が実行されます：
- `EmployeeID`が1のJohnの部署は`Marketing`に更新されます。
- `EmployeeID`が2のJaneは`NewEmployees`に存在しないため、削除されます。
- `EmployeeID`が3のMikeは`Employees`に存在しない新しいレコードとして挿入されます。


## サンプルデータの作成

### 1. Employees テーブルの作成と初期データの挿入
```sql
-- Employees テーブルの作成
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Name VARCHAR(50),
    Department VARCHAR(50)
);

-- 初期データの挿入
INSERT INTO Employees (EmployeeID, Name, Department) 
VALUES 
(1, 'John', 'Sales'),
(2, 'Jane', 'Marketing');
```

### 2. NewEmployees テーブルの作成と初期データの挿入
```sql
-- NewEmployees テーブルの作成
CREATE TABLE NewEmployees (
    EmployeeID INT PRIMARY KEY,
    Name VARCHAR(50),
    Department VARCHAR(50)
);

-- 初期データの挿入
INSERT INTO NewEmployees (EmployeeID, Name, Department) 
VALUES 
(1, 'John', 'Marketing'),
(3, 'Mike', 'Sales');
```

これらのステップで、例題で使用する2つのテーブルと初期データが用意されます。`Employees`テーブルは既存の社員データを、`NewEmployees`テーブルは新しいまたは更新される社員データを表しています。

---

これらのテーブルが作成され、データが挿入された後、MERGE文の例を使用して、データの更新、挿入、削除の操作を行うことができます。このプロセスを通じて、MERGE文の動作を実際に理解し、経験することができます。

# プライマリーキーについて

## プライマリーキー（Primary Key）とは？
プライマリーキーは、データベースのテーブル内の各行（レコード）を一意に識別するためのカラム（またはカラムの組み合わせ）です。これにより、各レコードが独自の識別子を持ち、データの整合性が保たれます。

### 特徴
- **一意性**: 各レコードはユニークなプライマリーキーの値を持つ必要があります。
- **NULL不許容**: プライマリーキーのカラムにはNULL値を設定できません。

## プライマリーキーがない場合の問題
プライマリーキーが設定されていない場合、以下の問題が生じる可能性があります。

### レコードの重複
プライマリーキーがないと、同じデータを持つレコードが複数存在することがあります。これにより、データの一貫性や整合性が損なわれ、データ管理が複雑になります。

### データの更新や削除の困難さ
特定のレコードを一意に識別できないため、データの更新や削除が困難になります。

## 例題: プライマリーキーの作成と重複問題

### SQL例: プライマリーキーの設定
```sql
CREATE TABLE Students (
    StudentID INT PRIMARY KEY,
    Name VARCHAR(50),
    Age INT
);
```
この例では、`StudentID`をプライマリーキーとして`Students`テーブルを作成しています。

### SQL例: プライマリーキーがない場合の重複
```sql
CREATE TABLE Students (
    Name VARCHAR(50),
    Age INT
);

INSERT INTO Students (Name, Age) VALUES ('山田太郎', 20);
INSERT INTO Students (Name, Age) VALUES ('山田太郎', 20);
```
この場合、`Students`テーブルには同じ名前と年齢のデータを持つレコードが2つ存在することになります。

## まとめ
プライマリーキーはテーブル内でレコードを一意に識別するために非常に重要です。適切なプライマリーキーの設定により、データの重複や管理上の問題を防ぐことができます。