「ゼロからはじめるデータベース操作」を読んでみた

なぜ読んだか

過去の記事にも書いた通り、2023年2月よりデータサイエンス職として働きます。 詳細な分析環境についてはまだイメージしきれていないものの、「SQLは自由に書けるようにしておいてほしい。」と先方から伝えられています。

現職は分析用のデータマート構築が業務の1つであったため、SQLに関しては抵抗感はないものの、SQLに関する知識は実務で学びながら付けていったところが多く、体系的に学んだ経験がなく...。 また分析業務を行う際も、ETLツールを使うことが主だったため、素早くSQLが書けるかと問われると自信に欠けるところもあり...。

地をしっかりと固めることを目的にSQLの入門書である本書を読むことにしました。

本書の内容(振り返り用メモ)

  • 第1章 データベースとSQL
    • データベースとは何か
    • データベースの構成
    • SQLの概要
    • テーブルの作成
    • テーブルの削除と変更

第1章はデータベースやSQLに関する概要説明。記載されている内容は基本情報処理技術者試験相当のものが多く、既に理解できているものが多かった。

後半はDDLに関する説明もあり、その中でカラム型などに関する説明もある。 本書では詳細に取り扱われていないが、CHAR型とVARCHAR型の細かい挙動の違いやメリデメ*1についてはよく忘れてしまう。

第2章はSELECT句とWHERE句に関する説明。こちらも記載されている内容については既に理解できていたものが多かった。

以下、自分用メモ。

  • SELECT句ではAS句を使って定数を出力できる*2
  • DISTINCT句で指定した列にNULLが含まれている場合、NULLも1種類のデータとして取り扱われる
  • DISTINCT句では複数列をキーに指定し、重複削除できる*3
  • 計算式にNULLを含むと、結果もNULLとなる
  • NULLの比較はIS NULLで行う

  • 第3章 集約と並べ替え
    • テーブルを集約して検索する
    • テーブルをグループに切り分ける
    • 集約した結果に条件を指定する
    • 検索結果を並べ替える

第3章はGROUP BY句と集約関数に関する説明。後半にはORDER BY句の説明もある。この辺りはETLツールでは問題なく処理できるが、いざSQLを書けとなると詰まる部分...。

以下、自分用メモ。

  • GROUP BY句で集約したキーにNULLが含まれる場合、NULLも1つのグループとして分類される
  • GROUP BY句で集約した場合、SELECT句にかけるのは定数、集約関数、集約キーのみ
  • 集約関数の結果を抽出条件とする場合、HAVING句を利用する*4
  • COUNT(*)はNULLを含む行数を、COUNT(列名)はNULLを含まない行数を返す
  • 値の重複を除いた行数を数える場合、COUNT(DISTINCT 列名)とする*5
  • AVGはNULLを除外した上で、平均値を算出する
  • GROUP BY句、HAVING句、ORDER BY句を含むSQLの記述順序は、SELECT句→FROM句→WHERE句→GROUP BY句→HAVING句→ORDER BY句
  • GROUP BY句、HAVING句、ORDER BY句を含むSQLの実行順序は、FROM句→WHERE句→GROUP BY句→HAVING句→SELECT句→ORDER BY句

  • 第4章 データの操作
    • データの登録(INSERT文の使い方)
    • データの削除(DELETE文の使い方)
    • データの更新(UPDATE文の使い方)
    • トランザクション

第4章はINSERT句やUPDATE句など、データ更新に関する説明。こちらも記載されている内容については既に理解できていたものが多かった。

以下、自分用メモ。

  • DEFAULT制約されているカラムについても、明示的にデフォルト値を挿入すべき
  • INSERT句はVALUES句で具体的なデータを指定する以外に、SELECT句で他テーブルのデータを選択することもできる、データコピーなどに利用できる*6
  • DELETE句で削除できるのは行のみ(≠テーブル、セル)
  • UPDATE句では複数の列を一度に更新することもできる*7
  • ワンセットで行われるべき更新の集合は、必ずトランザクションとして一纏めに行う

  • 第5章 複雑な問い合わせ
    • ビュー
    • サブクエリ
    • 相関サブクエリ

第5章はビューやサブクエリに関する説明。特に相関サブクエリについてはお恥ずかしながら全く無知だった...。

以下、自分用メモ。

  • ビューを作るメリットは容量を節約できることと、よく使うSELECT文を保存できること
  • ビューからビューを重ねて作ることもできるが、パフォーマンス低下につながるので避けるべき
  • 特定の条件下(元テーブルのカラム制約を準拠している、単一のテーブルのみに影響を及ぼすなど)では、ビューから元テーブルに対してINSERT句を発行できる*8
  • サブクエリは使い捨てのビューをFROM句で発行するイメージ
  • 単一の値になるサブクエリをスカラ・サブクエリとよび、抽出条件などにも活用できる*9
  • 集約したグループ単位ごとに比較をしたい場合、相関サブクエリを使う*10

  • 第6章 関数、述語、CASE式
  • いろいろな関数
  • 述語
  • CASE式

第6章は関数や述語、CASE式に関する説明。細かい文法はさておき、ETLツールで活用している機能と相違ないものが多かった。使いながら調べつつ覚えていく部分という認識。

以下、自分用メモ。

  • COALESCEを使いNULLを別の値へ変換することができる、NULLを含む演算を行う際に便利*11
  • INを使うことでORでの条件記載を省略できる、INの中身ではサブクエリを発行することもできる*12
  • NOT INの中身にNULLを含めると、真偽値が常にFALSEになってしまう*13
  • EXISTSを使うことで「ある条件に合致するレコードの存在有無」を調べることができる*14
  • CASEを使うことで縦横変換ができる*15

  • 第7章 集合演算
    • テーブルの足し算と引き算
    • 結合(テーブルを列方向に連結する)

第7章はテーブル同士の演算に関する説明。結合に関しては理解できていたが、重複行が含まれるUNIONの挙動などは知らなかった。

以下、自分用メモ。

  • UNION句は重複行を削除したうえで和集合を求める、UNION ALL句では重複行が削除されない
  • INTERSECT句は積集合を求める
  • EXCEPT句は差集合を求める
  • JOIN句はINNER JOIN句と同等
  • 3つのテーブルを結合する場合は、2つずつ結合していく*16

  • 第8章 SQLによる高度な処理

第8章はウィンドウ関数(OLAP関数)やGROUPING演算子*17に関する説明。ウィンドウ関数についてはデータマート構築の実務でも使ったことがあるが、GROUPING演算子は全く無知だった。ただGROUPING演算子については実務でどこまで活用されているのか若干疑問視。この辺りはSQLとプログラムの役割分担が実務でどのようになっているのか気になる。

  • 第9章 アプリケーションからデータベースへ接続する
    • データベースの世界とアプリケーションの世界をつなぐ
    • Javaの基本知識
    • JavaからPostgreSQLへ接続する

第9章はアプリケーションとデータベースを実際に通信してみる内容。JJDBCを使ったWebアプリケーションは研修でも作ったことがあったのでサラッと読み飛ばし。

読んでみて

「ETLツールだとこう処理するけど、SQLだとどう書くんだ...?」となっていた部分が、かなりクリアになりました。 というか、SQL(特に集約やサブクエリ回り)を全然理解できていなかったなと本書を読みながら痛感しました...。(入社までに読んでおいてよかった。)

使わないとすぐ忘れていってしまうと思うので、Pandasの勉強と合わせてデータサイエンス100本ノック(構造化データ加工編)でアウトプットしてみようと思います。

インプット過多にならないようにしつつ、以下の本も(いずれ)読みます。