スッキリわかるSQL入門を読んで

# はじめに
スッキリわかるSQL入門を読んで、良かったところ、学んだこと、難しかったことをまとめていこうと思います。

# 良かったところ
・ストーリー形式で読み進められるので具体的にわかりやすい
・図が多く解説がわかりやすい
・章ごとにま練習問題があり、復習しながら練習問題を解くことができる
・専用のサイトを使って実際にSQLを練習することができる


# 学んだこと
#### 第1章
##### データベースの概要
管理や分析を目的として様々なデータを蓄積したものをデータベースという。
データベースはデータベース管理システム（DBMS）によって管理される。

##### SQLの概要
・3命令の動作
SELECT : ある条件を満たす行を探す　→ その行の内容を取得する
UPDATE : ある条件を満たす行を探す　→ その行の内容を書き換える
DELETE : ある条件を満たす行を探す　→ その行を削除する

#### 第2章
##### 基本文法と４大命令
・型とデータ型
データベースの中には複数のテーブルがあり、テーブルは行と列から成り立っている。
それぞれの列には名前がついていて、それに加えて列ごとに格納できるデータの種類を表すデータ型を定める。

・4つの重要なSQL文
ほとんどのデータ操作は、SELECT,UPDATE,DELETE,INSERTの４つの命令で実現できる。
これらの4つのSQL命令は、DML（Data Manipulation Language）と言う。
これらを４大命令と呼ぶ。

#### 第3章
##### 操作する行の絞り込み
・WHERE句
WHERE句は、SELECT,UPDATE,DELETE文で使うことができ、対象データを絞り込むことができる。

・演算子
条件式には様々な演算子を記述でき、比較演算子、論理演算子を使うことができる。

・NULL
NULLは値が不明または無意味であるためにデータが格納されていない状態を表す。
NULLを判定するための条件式では、IS NULLとIS　NOT NULLを使用することができる。

・主キー
主キーによって、テーブル内の1つひとつの行が識別可能になり、主キーとなる列には、重複しない値が必ず格納されている必要がある。
複数の列を組み合わせて複合主キーを構成し、行を識別するために用いることができる。


#### 第4章
##### 検索結果の加工
・SELECT文にだけに可能な修飾
SELECT文で取得したデータは、様々な形に加工することができる。
DISTINCT…重複行を除外する
ORDER BY…結果を並び替える
OFFSET -FETCH…行を限定して取得する
UNION, EXCEPT/MINUS, INTERSECT…結果を集合演算する

#### 第5章
##### 式と関数
・計算式
列やリテラルを使った式で、結果が真または偽にならないものを計算式と呼ぶ。
計算式はSELECT文の選択列リスト、INSERT文やUPDATE文のテーブルに格納する値やその他の修復句など、
さまざまな場所で使用することができる。

・関数
関数は、引数に対して決められた処理を行い、戻り値に変換すること。
処理の内容や戻り値に応じて、文字列関数、算術関数、日付関数、変換関数などに分類される。


#### 第6章
##### 集計とグループ化
・集計
集計関数を用いてデータを集計することができる。
集計関数は、まとめたグループごとに1つの結果を算出し、SELECT文でのみ使用できる。

・グループ化
GROUP BY句にグループ分けの基準となる列を指定することで、グループ別に集計を行うことができる。
GROUP BY句を用いない集計では、検索結果の全件を1つのグループとして扱う。
集計値を元に特定のグループのみを抽出するには、HAVING句を用いる。

・集計関数
SUM…データを合計する　　数値
MAX…最も大きい値を求める　　数値、日付と時刻、文字列
MIN…最も小さい値を求める　　数値、日付と時刻、文字列
AVG…データを平均する　　数値
COUNT…行数をカウントする　　すべてのデータ型


#### 第7章
##### 副問い合わせ
・SQL文のネスト
SQL文の中に別のSELECT文を記述することができる。
副問い合わせは、より内側にあるものから外側に向かって順に評価されていく。

・副問い合わせのパターン
単一行副問い合わせ…結果が1行1列になるもの
複数行副問い合わせ…結果がn行1列になるもの
表形式となる副問い合わせ…n行m列の表になるもの

####　第8章
##### 複数テーブルの結合
・リレーションシップ
データベースを活用するには、データは複数のテーブルに分けて格納する。
他のテーブルの行と関連付けるために、外部キーを利用してリレーションシップを構成する。

・結合
結合を用いることで複数のテーブルに格納された関連データを1つの結果表にまとめることができる。
結合を行う相手テーブルを指定するためにJOIN句、結合条件を指定するためにON句を記述する。
外部結合を用いると、結合相手がない行も結果表に出力することができる。

・結合構文のバリエーション
３テーブル以上の結合も、順に1つずつ処理される。
副問い合わせの結果表と結合することができる。


#### 第9章
##### トランザクション
・トランザクション
複数のSQL文を不可分な1つの命令として扱うことができる
DBMSは、トランザクションの原子性や分離性を保つよう制御を行う。

・原子性
トランザクションに含まれる複数のSQL文は、すべて実行されたか、１つも実行されていないかの状態になることが、DBMSにより保証される。
コミットでトランザクション中のすべての処理が確定する。
ロールバックでトランザクション中のすべての処理がキャンセルされる。
DBMSに付属する多くのSQLクライアントは、デフォルトで自動コミットモードになっている。

・分離性
トランザクションは、同時実行中のほかのトランザクションから影響を受けないように、分離して実行される
代表的な副作用には「ダーティリード」「反復不能読み取り」「ファントムリード」がある
トランザクション分離レベルで、性能と分離のバランスを選ぶことができる

・ロック
行や表、データベース全体に、明示的にロックをかけることができる。
複数の対象に異なる順番でロックをかけようとする複数のトランザクションは、デッドロックに陥ることがあるために注意が必要

#### 第１０章
##### テーブルの作成
・4種類のSQL命令
データを格納したり取り出したりする場合は、DMLに属する命令を使う。
データを格納するテーブル全体を作成したり削除したりする場合は、DDLに属する命令を使う。
トランザクションの開始や終了を指示する場合は、TCLに属する命令を使う。
DMLやDDLに関する許可や禁止を設定する場合は、DCLに属する命令を使う。

・テーブルの作成と削除
CREATE TABLE文を用いて、新規のテーブルを作成する。
テーブル作成時に、列にデフォルト値を指定できる。
DROP TABLE文でテーブルを削除できる。
ALTER TABLE文でテーブル定義を変更できる。

・制約
テーブル作成時に各列に制約を設定し、予期しない値が格納されないように安全装置を設けることができる。
NOT NULL制約は、NULLの格納を防ぐことができる。
UNIQUE制約は、重複した値の格納を防ぐことができる。
CHECK制約は、格納しようとする値が妥当かどうかをチェックできる。
主キーとして取り扱い列には、主キー制約を設定する。
データの更新や削除によって外部キーによる参照整合性が崩れることがないように、外部キー制約を設定する。


#### 第11章
##### 支援機能
・インデックス
テーブルの列に対して、索引情報を生成することができる。
インデックスが存在する列に対する検索は、多くの場合、高速になる。
すべての検索でインデクスが使われるわけではない。
インデックスは書き込み性能の低下を招くこともあるため乱用は禁物。

・ビュー
SELECT文の結果表を仮想的なテーブルとして扱うことができる。
ビューを使うことでSQL文はシンプルになるが、その実体は単なるSELECT文のためDBMSの負荷は変わらない。

・採番とシーケンス
連番を作成する列定義やシーケンスを使って、連番を簡単に取得できる。
数字と記号を組み合わせたような複雑な採番を行う場合は、採番テーブルを作るなどして自力で実装する必要がある。

・バックアップ
正確なデータ処理には、原子性、一貫性、分離性に永続性を加えた４特性（ACID特性）が求められる。
記憶媒体が障害を起こした場合に備え、定期的にバックアップを取得する。
データベースの内容だけでなく、ログファイルもバックアップしておくことで、障害時にはロールフォワードによって障害発生直前の状態までデータを復元できる。


#### 第12章
##### テーブルの設計
・データベース設計
お客様から聴取した要件は、概念設計、論理設計、物理設計を経て、DDLやDBMSの各種設定に落とし込む。
概念設計では取り扱うエンティティとその関連を明らかにする。
論理設計では、キー設計や正規化などを行いRDB用のモデルに変換する。
物理設計では、採用するDBMS製品に依存しった詳細な設計に落とし込む。

・エンティティの関係
エンティティ同士の多重度には「1対1」「1対多」「多対多」がある。
ER図を用いてエンティティの関係を図示できる。

・論理モデルと正規化
「多対多」の関係は、中間テーブルを使って「1対多」に変換する。
主キーが存在しないテーブルには、人工キーを追加する。
「1対多」を形成する概念は別テーブルとして設計する（第1正規形）
複合主キーの一部に関数従属する部分を別テーブルに分割する（第2正規形）
主キーに対して間接的に関数従属する部分を別テーブルに分割する（第3正規形）
論理モデルには、見落としがないことが重要である
お客様の理想を起点とするトップダンアプローチと、お客様の現実を起点とするボトムアップアプローチを組み合わせてもれを防ぐ


# 難しかったこと
単順なSQL文はすらすらと書いていくことができたけど少しずつ複雑な条件になってくると日本語で書かれた文を理解してSQL文を作成すると言うことが難しいと思った。
グループ化や副問い合わせ、テーブル設計などが難しく、特にテーブル設計は重要な部分だけど1から自分で作成して正規化まで行うことが難しいと思いました。

難しいと感じた部分を復習して少しでも理解を深めていって、しっかりとSQLを使いこなせるようにしたいと思いました。


# 参考文献
[スッキリわかるSQL入門　第３版](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BSQL%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%83%89%E3%83%AA%E3%83%AB256%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1/dp/4295013390/ref=sr_1_1?adgrpid=51361540737&hvadid=658841395612&hvdev=c&hvlocphy=9162130&hvnetw=g&hvqmt=e&hvrand=16054762148403698574&hvtargid=kwd-333587866250&hydadcr=27265_14678545&jp-ad-ap=0&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8Bsql%E5%85%A5%E9%96%80&qid=1689765619&sr=8-1)