毎週 1冊技術書を読んでブログでアウトプットするチャレンジの第7弾ですー!
今回は、SQL 第2版 ゼロからはじめるデータベース操作 を読みました。
データベース・SQLについて、とても分かりやすく書かれた入門書です。
- 第1章 データベースとSQL
- 第2章 検索の基本
- 第3章 集約と並び替え
- 第4章 データの更新
- 第5章 複雑な問い合わせ
- 第6章 関数、述語、CASE式
- 第7章 集合演算
- 第8章 SQLで高度な処理を行う
- おわりに
第1章 データベースとSQL
-
-
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よりも処理が高速という特徴がある。
第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に自信がない方にもオススメです!
次はDBについてのもう少し高度な本を読む予定です。
来週も頑張ります!