スッキリわかるSQL入門を読んだ感想

# はじめに
今回スッキリわかるSQL入門を読んでみた感想をアウトプットしていこうと思います。
項目は①良かったこと ②学んだこと ③難しかったことの順に書いていきます。

## ①良かったこと
ストーリー形式に書かれていて、登場人物ともに学ぶことができたこと

章の最後に練習問題がありインプットだけではなくアウトプットもできること

## ②学んだこと

### １、データベースの概念

データベースとは、管理や分析を目的として様々なデータを蓄積したものを指し、データベースはデータベース管理システム（DBMS)によって管理されます。

複数のテーブルの形式がデータを管理するものをリレーショナルデータベースといういいます。

### 2、SQLの体系

SELECT,UPDATE、DELETE、INSERTの4つの命令を利用されます。

#### SELECT
```
一つ目がSELECT（取得）

SELECT 列名 ＊列名を取得しなさい

FROM テーブル名 ＊テーブルから

WHERE ＊修飾
```
``` 
例 SELECT 費目

   FROM 家計簿

   WHERE 費目＝’給料’ 
```

#### UPDATE

```
二つ目がUPDATE（更新）

UPDATE テーブル名 ＊このテーブルの情報を更新しなさい

SET 列名１＝値１、列名＝値２ ＊更新の詳細
```
```
 例 UPDATE 家計簿

 SET 入金額 ＝ ‘999’
```
#### DELETE
```
三つ目がDELETE（削除）

DELETE   ＊削除しなさい

FROM テーブル名 ＊テーブルから
```
```
例 DELETE FROM 家計簿
```
#### INSERT
```
四つ目がINSERT（データの追加）

INSERT INTO テーブル名　＊このテーブルに

（列名１、列名２、列名３）＊この列に

VALUES (値１、値２、値３）＊このデータを追加しなさい
```
```
例 INSERT INTO 家計簿

（費目、日付、出金額）

VALUES （’通信費’、’2002-02-20,6200) ＊二行目に対応している
```
#### ４大命令の分類方法
大きく二つに分類される

検索系：SELECT

更新系：UPDATE,DELETE ,INSERT




### ３、主キーと外部キーを用いてリレーションシップを構成する

本格的にデータベースを活用するには通常データは複数のテーブルに分けて格納しています。

なぜなら一つのテーブルにまとめると同じような内容を繰り返し登録した無駄の多い表になってしまうからです。

主キーと外部キーを使うことによって複数のテーブルにリレーションシップを持たせることができるようになります。


### 4、データベースが備えるべき四つの特性ACID特性

#### ①原子性

DBMSには原子性を保つように一塊のSQL文を扱うことをトランザクション制御と言います。

コミットでトランザクション中のすべての処理が確定するということであり、具体的にはロールバックでトランザクション中のすべての処理がキャンセルされる機能を備えています。このことによって原子性を保つことができています。





トランザクション
DBMSが一塊のsql文を扱うことをトランザクション制御といいトランザクションの原子性や分離性を保つように制御を行う

具体的にはコミットでトランザクション中のすべての処理が確定するということ

ロールバックでトランザクション中のすべての処理がキャンセルされるため原子性を保つことができる

#### ②分離性

分離性を維持するために内部でロックという仕組みが使われています。

ロックとはあるトランザクションが現在読み書きしている行に鍵をかけ、他の人のトランザクションからは読み書きできないようにすることです。

多くのDBMSではどの程度厳密にトランザクションを分離するかをトランザクション分離レベルとして指定することができるようになっています。



#### ③一貫性

一貫性を保つためにテーブル作成時に各列に制約を設定し、予期しない値が格納されないように安全装置を設けることができます。

具体的には　NOT NULL制約、UNIQUE制約などがあります。

制約があることによって人為的ミスに対応できるようになっています。


#### ④永続性

永続性を保つためにはバックアップを使います。

データのバックアップは時間がかかる処理であり、高頻度に行うにはできません。

しかし、データベースのバックアップとログファイルのバックアップを組み合わせることで効率的にもれなくバックアップをとることができます。

ログファイルを高い頻度でバックアップしておくとデータ消失時にも消日直前の時点までデータを復元することができます。

データベースの内容は低頻度（日次など）
ログファイルの内容は高頻度（数分ごと）


### 5、４種類のSQL命令

#### DML（データ操作言語）

データの格納や取り出し、更新m、削除などの命令

#### DDL（データ定義言語）

テーブルなどの作成や削除、各種設定などの命令

#### TLC（トランザクション制御言語）

トランザクションの開始や終了の命令

#### DCL（データ制御言語）

DMLやDDLの利用に関する許可や禁止を設定する命令

### 6、制約

テーブル作成時に各列に制約を設定し、予期しない値が格納されないように安全装置を設けることができます。
#### NOT NULL制約
NOT NULL制約はNULLの格納を防ぐことができます。

#### UNIQUE制約
UNIQUE制約は重複した値の格納を防ぐことができます。

#### CHECK制約
CHECK制約は格納しようとする値が妥当かどうかをチェックできます。

#### 主キー制約
主キーとして取り扱いたい列には主キー制約を設定します。

#### 外部キー制約
データの更新や削除によって外部キーによる参照整合性が崩れることがないように外部キー制約を設定します。

### 7、インデックス

目的のレコードを効率よく取得するための「索引」のことです。

テーブル内の特定の列を識別できる値（キー値）と、キー値によって特定された列のデータが格納されている位置を示すポインタで構成されていて、テーブルの列に対して、牽引情報を生成することができます。

インデックスが存在知る列に対する検索は、多くの場合は高速になります。

しかし、すべての検索でインデックスが使われるわけではなく、インデックスは書き込み性能の低下を招く可能性もあるため乱用は禁物

### 8、ビュー

ビューの実体は「SELECT文」です。
ビューにアクセスする際、定義されたSELECT文が実行され、抽出されたデータの塊を参照することで、仮想テーブルのように扱うことが可能となっています。
ビューを使うことでSQL文はシンプルになるが、その実体は単なるSELECT文のため、DBMSの負荷は変わりません。





## ③難しかったこと


サブクエリは直感的に分かりづらく、複雑に感じました。
しかし、サブクエリをうまく活用できるようになることでできることの範囲がグッと広がると思いました。

また、日本語を正しく理解してそれをもとに作成することの難しさを感じ、自由度が高く個人の解釈によって回答が複数生まれると思いました。