小市民ブログ

KelloggってMBAを出てアメリカで移民サバイバル生活をしています。サウナが好きです

書評:Learning SQL(初めてのSQL)

久しぶりの書評です。同僚に薦められて買ったSQL本ですが、良書でした。Codeなんてググれば答えあるんだから本読む必要あるのかと思ってましたが、体系的に考え方を学ぶのも大事だなと改心させられました。一通りのQueryは書けるけど、人の書いた長文コードを読むのに苦労したり、自在にデータハンドリングが出来ない人にぴったりの本で、初心者を実務で一応戦えるレベルに引き上げてくれる本、といった感じでしょうか。

例によって、サマリーになってないサマリーを書いておきます。

RDBとは

この概念、色んなところで「RDBとは」は学べるのですが、RDB以外を知らないが故にピンと来ない、みたいな部分があると思います。こちらの本では、RDB以外のデータベースとの比較から、RDBの有用性の輪郭を描いてみせてくれて、理解が深まりました。

RDB以前は、ヒエラルキー型やネットワーク型のデータベースがあった様ですが、Primary keyとForeign keyという複数テーブルで重複するキーでテーブルを関連づけることで、多量のデータを効率良く探せるデータベースになったという歴史がある様です。Primary keyはそのテーブル各列を定義するユニークなキー、Foreign keyは他のテーブルと関連づける為のキーですね。

キー以外の情報については、複数テーブルで同じものを持たないことが重要です(片方だけアップデートされると、データの整合性が保たれなくなるリスクがある)。

My SQLはフリーで使えるSQL環境でとても便利。

主なデータの種類
  • char()数が決まった文字列。()が最大
  • Varchar()数が決まっていない文字列
  • Text 数が決まっていない長い文字列
  • INT()整数
  • FLOAT() 少数
  • 数値データを定義する時、UNSIGNEDとしておくと、正の数だけに絞れる。
SELECT文の基本
  • AND/ORで、WHERE内の条件を連結可能。沢山条件がある場合、括弧を使って、AND/ORが指定する範囲を明確にする。
  • WHERE文で複数条件の内一つでも該当すれば良い時は、WHERE IN(,)を使う(逆はNOT IN)
  • Wildcardの条件も有用。WHERE… LIKE ‘ ‘が基本形式。_が一文字、%が0を含む任意の文字列。’%aaa%’なら、aaaを含む任意の文字列という意味。もっと複雑な定義をしたいなら、REGEXP正規表現を使える。
  • nullはIS NULL/IS NOT NULLで条件をかける必要がある。null同士はイコールとはならない。
  • HAVINGは、GROUP BYで集計された後の結果を条件として使うときに有効。
  • 日付の範囲指定はWHEREでもいいけど、BETWEEN ANDも有用。
  • SIGN()で、数値の正負を確認できる。
JOIN/UNION
  • キーを指定しないで2つのテーブルをJOINすると、x列*y列の、あり得る組み合わせが全て表示されてしまう(Cartesian productと言うらしい)。
  • 普通にJOINと書くのはInner Join。だけど分かりづらいからINNER JOINと書くのがベストプラクティス。Left/Right JOINは文字通り。
  • Sub queryとJOINするのも可能。Self JOINなる、そのテーブル自身を繋いで他の列をキーに使う、という技も可能。
  • UNIONは同じ行を持ったデータセットを縦に繋げる処理。
GROUP BY
  • GROUP BY + ROLLUPで、集計行を表示。CUBEで、細かい小計も。
  • COUNT(DISTINCT …)でユニークな値の数をカウントできる。
Sub Query 
  • subqueryの出力結果が複数になる場合は=で繋げないので、INを使う。WHERE … IN (SELECT …)みたいな。
  • WHERE EXISTS(SELECT 1 FROM …)で、条件をみたす列が存在するかをチェックできる。1じゃなくても良いけど、1を入れるのが通例(逆はNOT EXISTS)
  • CASE文の中でSubquery使うことも可能。CASE WHEN … = ‘’ THEN (SELECT… )みたいな。

ボルチモアのUNDER ARMOUR本社内のジムを激写