銀行員からのRailsエンジニア

銀行員からのRailsエンジニア

銀行員から転身したサービス作りが大好きなRailsエンジニアのブログです。個人で開発したサービスをいくつか運営しており、今も新しいサービスを開発しています。転職して日々感じていること、個人開発サービス運営のことなどを等身大で書いていきます。

【技術書メモ】SQL 第2版 ゼロからはじめるデータベース操作 〜毎週アウトプットチャレンジ⑦〜

毎週 1冊技術書を読んでブログでアウトプットするチャレンジの第7弾ですー!

今回は、SQL 第2版 ゼロからはじめるデータベース操作 を読みました。

データベース・SQLについて、とても分かりやすく書かれた入門書です。 

SQL 第2版 ゼロからはじめるデータベース操作

SQL 第2版 ゼロからはじめるデータベース操作

 

f:id:ysk_pro:20180902101951j:plain

第1章 データベースとSQL

  • SQLは、RDBMSに与える命令の種類により、次の3つに分類される
    • DDL(Data Definition Language):データベースやテーブルを作成、削除などをする。(CREATE、DROPなど)
    • DML(Data Manipulation Language):テーブルの行を検索、変更などをする。(SELECT、INSERTなど)
    • DCL(Data Control Language):データベースに対して行った変更を確定、取消などをする。(COMMIT、ROLLBACKなど)
  • データ型
    • CHAR型:文字列を入れる型。CHAR(10)のように、入れることの出来る最長の長さを()で指定する。CHAR型は、固定長文字列という形式でデータが格納され、文字列の長さが最大長に満たない場合は、満たない分を文字の後に半角スペースを入れて埋める。
    • VARCHAR型:CHAR型と同じく文字列を入れる型。違いは、VARCHAR型は可変長文字列という形式で、文字数が最大長に満たない場合も半角スペースで埋めない点。
 

第2章 検索の基本

  • SELECTを使った検索で結果から重複を省く場合は、SELECTの後に「DISTINCT」をつける。DISTINCTを使った場合、NULLも1種類のデータとして扱われ、複数の行にNULLがある場合は、1つにまとめられる。
  • NULLを含んだ計算の結果は、問答無用でNULLになる。NULLを0で割る場合もエラーとならずNULLとなる。
 

第3章 集約と並び替え

  • COUNT関数は基本的にNULLを除外するが、COUNT(*)とすればNULLを含めた全行を数えることができる。
  • COUNT(*)以外の集約関数はNULLを除外して算出する。(0としても扱わない)
  • WHERE句には行に対する条件を書き、HAVING句にはグループに対する条件を書く。どちらにも書くことが出来る条件をWHERE句に書くべき理由は、可読性と実行速度。
  • ORDER BYでのソートキーにNULLが含まれる場合は、先頭か末尾にまとめられる。
  • ORDER BY句はSELECT句よりも実行されるのが後なので、SELECT句でつけた別名を使用できる。
 

第4章 データの更新

  • テーブルからデータを削除する方法として、DELETE文だけでなく、「TRUNCATE」というコマンドがある。TRUNCATEは必ずテーブルを全行削除し、DELETEよりも処理が高速という特徴がある。
  • DBMSトランザクションは、ACID特性と呼ばれる4つの特性がある。
    • 原子性(Atomicity):トランザクションが終わったとき、そこに含まれていた更新処理は、全て実行される or 全て実行されない状態で終わることを保証すること。
    • 一貫性(Consistency):トランザクションに含まれる処理は、データベースにあらかじめ設定された制約を満たすこと。
    • 独立性(Isolation):トランザクション同士が互いに干渉を受けないことを保証すること。トランザクション同士は入れ子になることはない。
    • 永続性(Durability):トランザクションが終了したら、その時点でのデータの状態が保存されることを保証すること。
 

第5章 複雑な問い合わせ

  • ビューとは、テーブルと同じように扱われる。違いは、テーブルの中には実際のデータが保存され、ビューの中にはSELECT文が保存されていること。
  • ビューのメリット
    • データを保存しないため、記憶装置の容量を節約できること。
    • 頻繁に使うSELECT文を、ビューとして保存することで、使い回せること。
  • サブクエリとは使い捨てのビューであり、SELECT文の実行終了後に消去される。
  • スカラ・サブクエリとは、戻り値が単一の値になるサブクエリであり、WHERE句などで使われる。
 

第6章 関数、述語、CASE式

  • 関数
    • ||:文字列連結
    • REPLACE:文字列中のある一部分を、別の文字列に置き換える
    • CURRENT_TIMESTAMP:現在の日時(CURRENT_DATE + CURRENT_TIME)
    • EXTRACT:日付データからその一部分(年や月)を、数値型として切り出す
    • CAST:型変換を行う
    • COALESCE:可変数の引数を取り、最初にNULLでない値を返す。NULLを別の値に変えて扱いたい場合などに使われる。
  • 述語:戻り値が真理値になる関数
    • IS NULL:ある列がNULLの行を選択する場合に、=は使うことができず、IS NULLを使う必要がある。反対にNULL以外の行を選択する場合は、IS NOT NULLを使う。
    • IN:ORの便利な省略形。反対はNOT IN。INは引数にサブクエリを指定する使い方もされる。
    • EXISTS:ある条件に合致するレコードの存在有無を調べる。INによってほぼ代用できる。
  • CASE式:場合分けを記述する時に使用する。ELSE NULLは省略可能であるが、可読性の観点から省略しない方がよい。
 

第7章 集合演算

  • 集合演算子は重複行を排除する。ALLを追加すれば重複行は排除されない。
  • UNION:レコードの足し算を行う。
  • INTERSECT:2つのレコードの共通部分を選択する。
  • EXCEPT:レコードの引き算を行う。
  • 結合(JOIN)は、別のテーブルから列を持ってきて、列を増やす集合演算。UNIONがテーブル同士を行方向(縦方向)に連結するのに対し、結合は列方向(横方向)に連結する。
  • 内部結合(INNER JOIN)は2つのテーブルの両方に存在する情報だけを選択するのに対して、外部結合(OUTER JOIN)はどちらか一方のテーブル(LEFT or RIGHTで指定する)に存在しているならば、そのテーブル情報が欠けることなく出力される。
 

第8章 SQLで高度な処理を行う

  • ウィンドウ関数は、ランキング、連番生成など通常の集約関数ではできない高度な操作を行う
  • GROUPING演算子は、GROUP BY句と集約関数ではできなかった小計・合計を同時に求めることができる

 

おわりに

ここまで読んでいただきありがとうございます。

Railsから入ったりすると、DB・SQLの学習は後回しになりがちですが、大規模なDBを扱う実務ではDBの知識はめちゃくちゃ重要です。

本書は基本的なところから書かれているので、とても分かりやすくスッと読むことができ他ので、DB・SQLに自信がない方にもオススメです!

SQL 第2版 ゼロからはじめるデータベース操作

SQL 第2版 ゼロからはじめるデータベース操作

 

 次はDBについてのもう少し高度な本を読む予定です。

来週も頑張ります!