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

はじめに

今回はスッキリわかるSQL入門を読んだ感想をまとめてみたいと思います。
この本はSQL初学者の自分でも、簡単に理解でき読み進めることが出来ました!
では、早速感想をまとめていきたいと思います。

各章の感想

第1章 はじめてのSQL

この章で、データベースSQLの概要を知ることが出来ました!

データベース:狭義では、データ管理を目的とした情報そのもの
リレーショナルデータベース:複数の表形式でデータを管理するデータベース
SQL:データベースを操作する専用の言語

またdokoQLを使用して、実際にデータベースを操作することができるので、
よりデータベースやSQLについてイメージしやすくなっている点がいいと感じました!

第2章 基本文法と4大命令

この章で、SQLの4大命令の記述方法知ることが出来ました!

4大命令

内容 命令
データを抽出 SELECT カラム名 FROM テーブル名 WHERE 条件式
データを挿入 INSERT INTO テーブル名 VALUES (データ1 , データ2, データ3 )
データを更新 UPDATE テーブル名 SET カラム名 = データ WHERE 条件式
データを削除 DELETE FROM テーブル名 WHERE 条件式

4大命令の分類や共通点についての説明もあり、各命令の記述方法を混乱せずに覚えることが出来ました!

第3章 操作する行の絞り込み

この章で、SQLの条件式の書き方について知ることができました!

NULLの判定

演算子 意味
IS NULL NULLであることを判定する
IS NOT NULL NULLでないことを判定する

パターンマッチング

式 LIKE 文字列:文字列に一致するか判定する

文字 意味
% 任意の0以上の文字列
_ 任意の1文字

IN,ANY,ALL演算子

演算子 意味
IN 複数の値のいずれかのデータにマッチするか判定する
ANY リストと大小比較し、いずれかが真であるか判定する
ALL リストと大小比較し、全てが真であるか判定する

第4章 検索結果の絞り込み

この章で、検索結果の加工方法やデータの集合方法について知ることができました!

加工内容 内容
DISTINCT 重複行を場外する
ORDER BY 結果を並び替える
OFFSET - FETCH 行を指定して取得する
UNION 和集合をとる
EXCEPT 差集合をとる
INTERSECT 積集合をとる

データベースの種類の違いによって記述方法が異なる点も取り上げられており、
実際使用する際にも役立つ知識を得ることができよかったと感じました!

第5章 式と関数

この章で、データベースの関数について知ることが出来ました!

関数 内容
LENGTH 文字列の長さを取得できる
TRIM 左右の空白を除去した文字列を取得できる
REPLACE 文字列の一部を別の文字列に置換する
SUBSTRING 文字列の一部を抽出する
CONCAT 文字列を連結する
ROUND 指定桁で四捨五入する
TRUNC 指定桁で切り捨てる
POWER べき乗を計算する
COALESCE 最初に登場するNULLでない値を返す

COALESCEはNULLの場合の代替値で使用するといった実践的な内容が載っており、
とても勉強になりました!

第6章 集計とグループ化

この章で、集計関数の使い方とグループ化の方法について知ることが出来ました!

集計関数

関数 内容
SUM データの合計
MAX 最大値を取得
MIN 最小値を取得
AVG データの平均を求める
COUNT 行数をカウントする

グループ化

  • GROUP BYにグループ分けをするカラム名を指定することでグループ別に集計可能
  • HAVING で集計処理を行ったあとの結果表に対して絞り込みを行うことが可能

WHERE句で絞り込みを行える場合は、WHERE句で絞り込んだ方が
パフォーマンスが向上するといった、処理速度に関しての記載もあり、
とても勉強になりました。

第7章 副問い合わせ

この章で、副問い合わせについて知ることが出来ました!

SQL文のネスト

副問い合わせ(サブクエリ)SQL文の中に別のSELECT分を記述すること

副問い合わせの種類

単一行副問い合わせ:副問い合わせの結果が1行1列になるもの
複数行副問い合わせ:副問い合わせの結果がn行1 列になるもの
表形式副問い合わせ:副問い合わせの結果がn行m列の表形式になるもの

第8章 複数テーブルの結合

この章では、テーブルの結合方法を知ることが出来ました!

リレーションシップ

リレーションシップ:2つのテーブルの間に情報として関連がある場合、その関連を指す 外部キー:リレーションシップを結ぶ役割を担う列のこと

テーブルが分割されていた方がデータを安全かつ確実、高速に取り扱いやすい。

結合

結合を使用することで、複数のテーブルに格納された関連データを
1つの結果表として取り出せる

JOIN - ON:テーブルを結合(結合相手がいない場合は消滅)
LEFT JOIN - ON:左表については結合相手が見つからなくても出力してテーブルを結合
RIGHT JOIN - ON:右表については結合相手が見つからなくても出力してテーブルを結合

結合の部分は理解するのが難しいと感じたが、図等の豊富な説明のおかげで、 理解することができました!

第9章 トランザクション

この章で、SQLトランザクションについて知ることが出来ました!

トランザクション

トランザクション:複数のSQL文を不可分な1つ命令として扱うことが可能

原子性

指示 内容
BEGIN 開始の指示
COMMIT 終了の指示。変更を確定する。
ROLLBACK 開始の指示。変更の取り消しをする。

分離性

トランザクションは同時実行中のほかのトランザクションからの影響を受けないよう
分離して実行される。

副作用 内容
ダーティーリード 未確定の変更を他の人が読めてしまう副作用
反復不能読み取り SELECT文を実行した後に他の人がUPDATE文でデータを書き換えると次のSELECT文実行時に検索結果が異なる副作用
ファントムリード 1回目と2回目のSELECT文の間に他の人がINSERT分で行追加をすると1回目と2回目で取得する結果の行数が変わる副作用

ロック

行や表、データベース全体に明示的にロックをかけることが可能
行ロック:SELECT ~ FOR UPDATE (NOWAIT)
表ロック:LOCK TABLE テーブル名 IN モード名 MODE (NOWAIT)

デッドロック:複数のトランザクションが実行されると、トランザクションの処理が
永久に止まってしまう現象

副作用とその対策までしっかりと説明されており、
読んでいてとても理解しやすいと感じました!

第10章 テーブル作成

この章では、テーブルの作成や削除方法について知ることが出来ました!

テーブルの作成と削除

命令 内容
CREATE TABLE 新規テーブルを作成
DROP TABLE テーブルを削除
ALTER TABLE テーブルの定義を変更

制約

テーブル作成時に各列に制約を設定し、
予期しない値が格納されないように安全装置を設けることが可能

制約 内容
NOT NULL NULLの格納を防止
UNIQUE 重複した値の格納を防ぐ
CHECK 格納しようとする値が妥当がどうか確認する
PRIMARY KEY 主キー制約
REFERENCES 外部キー制約

テーブルにNULLが入ると扱いにくくなる点もあるので、
NOT NULL制約やDEFALT設定を用いることで、
NULLが入らないようにテーブル設計できるのは良いと感じました。

第11章 さまざまな支援機能

この章では、ビューやバックアップについて知ることが出来ました!

ビュー

  • SELECT文の結果表を仮想テーブルとして扱うことが可能
  • ビューによりSQL文はシンプルとなるが、実際はSELECT文を実行しているのと同じであるため、負荷の大きさは変わらない

バックアップ

正確なデータ処理にはACID特性が求められる。
データベースの内容だけでなく、ログファイルもバックアップしておくことで、
障害時にロールフォワードによって障害発生直前までのデータを復元することが可能

種類 内容
原子性 処理が中断しても中途半端な状態にならない
一貫性 データの内容が矛盾した状態にならない
分離性 複数の処理を同時実行しても副作用がない
永続性 記録した情報は消滅せず保持され続ける

ロールバックとロールフォワードは名前が似ているが、
処理内容は全く違うので、混同しないよう正しく理解したいと感じました。

第12章 テーブルの設計

この章では、データベース設計方法について知ることが出来ました!

データベース設計の流れ

  1. 概念設計
    取り扱うエンティティとその関連を明示する
  2. 論理設計
    キー設計は正規化などを行いRDB用のモデルに変換する
  3. 物理設計
    採用するDBMS製品に依存した詳細な設計を行う

正規化

  1. 第1正規化
    「1対多」を形成する概念は別テーブルとして設計する
  2. 第2正規化
    複合主キーの一部に関数従属する部分を別テーブルに分割する
  3. 第3正規化
    主キーに対して間接的に関数従属する部分を別テーブルに分割する

データベース設計の手順に関して、具体的な例を用いて説明されており、
とてもわかりやすいと感じました!
また、第2正規化と第3正規化に関しては行うことはあまり大差ないと感じました。

全体の感想

良かったと感じた点

  • 図や具体例を用いて丁寧に解説されており、難しい内容でもスムーズに理解できるよう工夫されていて読みやすかったです
  • dokoQLを用いることで手軽にSQL文を実行できため、イメージが湧きやすいと感じました
  • 問題も豊富にあり、インプットした内容をすぐにアウトプットできるため、記憶に定着しやすいと感じました

改善してほしい点

  • 付録のドリルの解答をつけてほしいと思いました(ネットで見ることは可能だが手間になるため)

難しいと感じた点

  • 複数のテーブルの結合や、副問い合わせが入ってくると複雑になり、少し理解するのに苦労した部分がありました
  • テーブルの設計のモデリングに関しては慣れていないこともあり、難しいと感じました

参考