DBMSについての雑記

# データベース操作について

### メモ

- 階層型データベース

　階層型データベースは、データを階層構造で組織化するデータモデルの一種です。データは木構造のように階層的に組織化され、親子関係を持ったデータを表現することができます。このデータモデルは、1960年代から1970年代にかけて、主にIBMのIMS（Information Management System）で使用されました。しかし、現在では関係データベースが主流であるため、階層型データベースはあまり使用されていません。

---

- リレーショナルデータベース(RDB)

　リレーショナルデータベース（RDB）は、表形式のデータを管理するデータベースです。RDBでは、データを複数の関連するテーブルに分割し、それらを関係（リレーション）で結びつけます。テーブルは行と列から成り、行は各データレコードを表し、列はデータの属性（フィールド）を表します。RDBはSQL（Structured Query Language）と呼ばれる言語を使用してデータを操作します。RDBは、一般的にビジネスアプリケーションやWebアプリケーションなどで使用されています。主要なRDB製品には、Oracle、MySQL、Microsoft SQL Server、PostgreSQLなどがあります。

---

- オブジェクト指向データベース

 オブジェクト指向データベース（OODB）は、オブジェクト指向プログラミングの概念をデータベースに適用したものです。OODBでは、データをオブジェクトとして表現します。オブジェクトは、属性（データフィールド）とメソッド（操作）から構成されます。また、オブジェクト同士の関係を表現することができます。OODBは、オブジェクト指向プログラミング言語との親和性が高く、プログラム内でオブジェクトを操作する際に、データベースにアクセスする必要がなくなるため、開発効率が向上するとされています。主なOODB製品には、ObjectStore、Versant Object Database、ZODB（Zope Object Database）などがあります。ただし、OODBはリレーショナルデータベースと比較して、規模が大きくなるとパフォーマンスの問題が発生する場合があるため、使用する際には注意が必要です。

---

- XMLデータベース

XMLデータベースは、XML文書を格納・管理するために特別に設計されたデータベースです。XMLは、タグを用いてデータを階層的に表現することができるため、XMLデータベースは、階層構造を持つデータを管理するのに適しています。XMLデータベースでは、XML文書をフィールドに持つテーブルを作成することができます。また、XPathやXQueryといったXMLのクエリ言語を使用して、XMLデータベース内のデータを検索することができます。XMLデータベースは、特に文書管理やWebアプリケーション開発などの分野で使用されます。代表的なXMLデータベース製品には、eXist、MarkLogic、Taminoなどがあります

---

- キー・バリュー型データストア

 キー・バリュー型データストアは、データをキーと値のペア（バリュー）で管理するデータストアです。データをキーとともに保存するため、高速にアクセスできます。また、分散環境での使用にも適しています。キー・バリュー型データストアは、単純で柔軟な構造を持ち、データモデルがシンプルなため、スケーラビリティが高く、可用性が高い特徴があります。一般的な用途としては、キャッシュやセッションストア、セッションマネージャー、カウンター、ログデータなどが挙げられます。代表的なキー・バリュー型データストアとしては、Redis、Memcached、Amazon DynamoDB、Apache Cassandra、Riakなどがあります。

---

- 行単位でデータを読み書きする
- 1つのセルには1つのデータしか入れられない
- SQLは機能により3種類に分けられるが、最も使われるのはDML
- セミコロン;で終わる
- 大文字小文字は区別されない

---

- DDL データ定義言語

DDLは、データ定義言語（Data Definition Language）の略で、データベースの構造（スキーマ）を定義するための言語です。DDLには、以下のようなコマンドがあります。

- CREATE: テーブル、インデックス、ビュー、ストアドプロシージャなどのデータベースオブジェクトを作成します。
- ALTER: 既存のデータベースオブジェクトの構造を変更します。例えば、テーブルに新しい列を追加するなどの変更が可能です。
- DROP: データベースオブジェクトを削除します。
- TRUNCATE: テーブルのデータを全て削除しますが、テーブル自体は削除しません。
- COMMENT: データベースオブジェクトにコメントを追加します。

DDLは、データベース設計の重要な要素であり、データベースオブジェクトの構造を変更する場合にも使用されます。また、DDLコマンドを使用するには、データベース管理者の権限が必要です。

---

- DMLデータ操作言語

DMLは、データ操作言語（Data Manipulation Language）の略で、データベースのレコードを操作するための言語です。DMLには、以下のようなコマンドがあります。

- SELECT: データベースからレコードを抽出するために使用します。
- INSERT: 新しいレコードをデータベースに挿入します。
- UPDATE: データベース内の既存のレコードを更新します。
- DELETE: データベース内のレコードを削除します。

これらのDMLコマンドを使用することで、データベース内のデータを検索、追加、変更、削除することができます。DMLは、SQL（Structured Query Language）によって実行され、データベースアプリケーションの中核的な要素となっています。DMLコマンドを実行するには、データベースのテーブルやビューにアクセスするための権限が必要です。

---

- DCLは、データ制御言語

DCLは、データ制御言語（Data Control Language）の略で、データベースのセキュリティとアクセス権限を管理するための言語です。DCLには、以下のようなコマンドがあります。

- GRANT: 特定のユーザーに、データベースオブジェクト（テーブル、ビュー、ストアドプロシージャなど）へのアクセス権を与えます。
- REVOKE: 特定のユーザーから、データベースオブジェクトへのアクセス権を取り消します。

これらのDCLコマンドを使用することで、データベース管理者は、ユーザーアカウントを作成し、必要な権限を設定することができます。また、不正なアクセスや不正な操作からデータベースを保護することもできます。DCLコマンドを実行するには、データベース管理者の権限が必要です。

---

SQLでテーブルを作成するための基本的な構文

```sql

CREATE TABLE テーブル名 (
   カラム1 データ型 制約,
   カラム2 データ型 制約,
   ...
   カラムn データ型 制約
);
```

例えば、**`employees`**というテーブルを作成する場合は、以下のようになります。

```sql
CREATE TABLE employees (
   id INT PRIMARY KEY,
   name VARCHAR(255) NOT NULL,
   age INT,
   gender VARCHAR(10),
   salary DECIMAL(10, 2)
);
```

この例では、**`employees`**というテーブルが作成され、**`id`**、**`name`**、**`age`**、**`gender`**、**`salary`**という5つのカラムが定義されています。**`id`**カラムは主キーであり、**`name`**カラムはNULLを許容しない制約が設定されています。**`age`**、**`gender`**、**`salary`**カラムには制約がないため、NULL値が許容されます。

テーブルを作成する際に、カラムのデータ型や制約はデータベースによって異なります。また、オプションの構文やキーワードもあります。必要に応じて、データベースのドキュメントを確認する必要があります。

---

標準SQLの命名ルールについて

標準SQLでは、次のような命名ルールがあります。

1. オブジェクト名の長さは、最大で128文字までとする。
2. オブジェクト名は、アルファベット、数字、アンダースコア(_)を使用できる。
3. オブジェクト名の先頭は、アルファベットでなければならない。
4. オブジェクト名は、大文字と小文字を区別する。
5. オブジェクト名には、予約語を使用できない。

具体的には、以下のようなオブジェクトについての命名ルールがあります。

- テーブル名：テーブル名は、主キーのカラム名と区別するため、主キーのカラム名と同じ名前を使用しないことが推奨されます。また、複数の単語を含む場合は、単語の間にアンダースコアを使用するか、キャメルケースを使用することが一般的です。
- カラム名：カラム名は、テーブル内で一意である必要があります。複数の単語を含む場合は、単語の間にアンダースコアを使用するか、キャメルケースを使用することが一般的です。
- 制約名：制約名は、制約がどのカラムに関連しているかを示すため、通常はカラム名を含めることが推奨されます。複数の単語を含む場合は、単語の間にアンダースコアを使用するか、キャメルケースを使用することが一般的です。
- ビュー名：ビュー名は、ビューの内容や意味を表す名前を付けることが推奨されます。
- ストアドプロシージャ名：ストアドプロシージャ名は、ストアドプロシージャの目的や機能を表す名前を付けることが推奨されます。

---

命名の禁止事項について

標準SQLでは、次のような命名の禁止事項があります。

1. 予約語を使用しないこと：予約語は、SQLの構文で特別な意味を持つキーワードであり、オブジェクト名に使用することはできません。例えば、SELECT、FROM、WHEREなどが予約語にあたります。
2. 数字から始まる名前を使用しないこと：オブジェクト名の先頭に数字を使用することはできません。
3. 特殊文字を使用しないこと：オブジェクト名には、アルファベット、数字、アンダースコア(_)以外の特殊文字（スペース、ハイフン、ドット、カンマなど）を使用することはできません。
4. 重複した名前を使用しないこと：同じデータベース内で、テーブル名やカラム名、制約名などを重複して使用することはできません。

これらの禁止事項を遵守することで、SQLの命名規則を正しく守り、オブジェクト名の一意性を保証することができます。

---

データ型とは、データの種類を表すための定義で、データベース管理システムにおいて重要な役割を担っています。以下に代表的なデータ型をいくつか紹介します。

1. 文字列型：文字列を格納するためのデータ型で、一般的にはVARCHAR、CHAR、TEXTなどがあります。
2. 数値型：数値を格納するためのデータ型で、一般的にはINTEGER、FLOAT、DOUBLE PRECISIONなどがあります。
3. 日付/時刻型：日付や時刻を格納するためのデータ型で、一般的にはDATE、TIME、TIMESTAMPなどがあります。
4. ブール型：真偽値を格納するためのデータ型で、一般的にはBOOLEANなどがあります。
5. バイナリ型：バイナリデータを格納するためのデータ型で、一般的にはBINARY、VARBINARY、BLOBなどがあります。

データ型は、データベースに格納される値の種類や大きさ、範囲などを定義するために使用されます。データ型の選択は、データの正確性やパフォーマンスに大きく影響するため、慎重に行う必要があります。

---

データベースには、データの正確性や整合性を保証するために「制約」と呼ばれる仕組みがあります。主要な制約の種類を以下に説明します。

1. 主キー制約：テーブル内の各レコードを一意に識別するためのキーを定義します。主キーは重複した値を持つことができず、NULL値を持つこともできません。
2. 外部キー制約：異なるテーブル間のデータ整合性を保つために使用されます。外部キーは、参照元のテーブルの主キーに対応する列に定義され、参照先のテーブルの主キーと関連付けられます。
3. チェック制約：データが特定の条件を満たすかどうかを確認するために使用されます。例えば、数値列において正の値のみを許可するなどの条件を定義できます。
4. NOT NULL制約：列にNULL値が入らないようにします。つまり、その列には必ず値が入るように制限します。
5. ユニーク制約：重複した値を持たないようにするために使用されます。つまり、その列に格納される値は一意であることが保証されます。

制約は、テーブルを作成する際に定義され、列レベルやテーブルレベルで設定されることがあります。これにより、データベースに正確な情報が格納され、データの整合性が保たれることが保証されます。

---

テーブルの削除と変更について説明します。

- DROP (ドロップ)

テーブルの削除には、DROP文を使用します。以下は、テーブルの削除を行う例です。

```sql
DROP TABLE テーブル名;
```

このコマンドを実行すると、指定したテーブルが削除されます。ただし、削除されたテーブルは復元できなくなるため、慎重に実行する必要があります。

- ALTER (アルター)

テーブルの変更には、ALTER文を使用します。以下は、テーブルの変更を行う例です。

```sql

ALTER TABLE テーブル名 ADD 列名 データ型;
```

このコマンドを実行すると、指定したテーブルに新しい列を追加します。他にも、既存の列のデータ型や制約の変更を行うこともできます。ただし、テーブルの変更はデータベースに影響を与えるため、慎重に実行する必要があります。

なお、一部のRDBMSでは、テーブルの変更に対して制限がある場合があります。例えば、Oracle Databaseでは、テーブルに対して変更を行う場合、データベースに対するロックが必要になるため、変更中は他のセッションからのアクセスができなくなります。また、変更によって既存のデータに影響を与える場合があるため、慎重に実行する必要があります。

---

- RENAME(リネーム)

RENAMEは、データベースにおいて、テーブルや列などの名前を変更するためのSQL文です。一部のデータベースでは、RENAME文はALTER文の一部として扱われます。

RENAME文を使用すると、以下のようにテーブル名や列名を変更することができます。

```sql
-- テーブル名を変更する例
RENAME TABLE 旧テーブル名 TO 新テーブル名;

-- 列名を変更する例
ALTER TABLE テーブル名 RENAME COLUMN 旧列名 TO 新列名;
```

RENAME文によって変更した名前は、その後のSQL文から新しい名前で参照することができます。ただし、RENAME文を使用する際には、データベースによっては注意点があります。例えば、一部のデータベースでは、RENAME文で変更した名前が他のオブジェクトと重複する場合にエラーが発生する場合があります。

また、RENAME文によって変更した名前は、トランザクション処理が必要な場合には、トランザクション内で完了する必要があることがあります。

---