スッキリわかるSQL入門を読んで

初めに

今回は、スッキリわかるSQL入門を読んでの感想を書いていきます。

読む前の自分の知識レベルとしては

  • 業務でPostgreSQLを使用しているが、単純なSQLで取得したいものは得られ、複雑な部分はアプリケーションサイドで処理していた
  • 4大命令は使える
  • 結合や副問い合わせも知識としては持っている
  • SQLのどういった処理が高負荷かなどはあまり気にしてこなかった
  • 絞り込みや加工、集計やトランザクションも調べつつ使用はできる

といったなんとなくは使えるものの浅い部分はかなり浅い理解のまま使っていました。

知らないがために、よりシンプルにSQLで処理できたシーンをアプリケーション側でやってしまっていたなと思う点が読んでいて多々ありました。 とはいえ、SQL、アプリケーションごちゃ混ぜになるよりは良いんですが…

良かった点

まず良かった点ですが、

  • Webで調べつつ使用するでは、本来セットで学べているだろう知識に穴のある部分に気づくことができた
  • 期待した結果は得られているが、なんとなくの理解で過ごしていた部分を理解できた
  • dokoQLを使って、本書内のSQLを実際に実行して結果を見ることができ、またそこでどう変えればどう結果が変わるかを見ることができる

など、他にもありますが主な部分はこの辺りになります。

学んだこと

Webで調べつつ使用するでは、本来セットで学べているだろう知識に穴のある部分に気づくことができた

先述した通り、アプリケーションサイドで処理していたことで知らなかった(必要とすることもなかった)ことが多くありました。

OFFSET - FETCH

limitで事足りていたので、何レコード目から何レコード目みたいな取得方法を調べたことすらなかったのです….

自分がいつも使っているPostgreSQLだと'limit offset みたいに書けるので、fetch`は使わなくても良さそうです。

TRIM / SUBSTRING / COALESCE

きっとwhereでの絞り込み処理もアプリケーションサイドでやってしまっていたので辿り着かなかったのでしょう…

アプリ内でどうこうより、DBからコンソールにクエリを打って検索したい時に幅が広がるので知れて良かったと思います。

count(*)とcount(列)でNULLの扱いが異なる

クエリを打って検索する際にこの違いを知らなければ混乱or誤った数で進んでしまうところですね。

ANY / ALL / IN演算子

PythonのDataframeが便利すぎて…. これを知ってる知ってないでは書けるクエリの幅が全然違いますよね。

相関副問い合わせ

ぱっと見、違和感のある書き方ですが、便利ですね。
高負荷であることは覚えておかなければいけないですが、単純に調べごとをする際に利用機会が多そうです。

自動コミットモードの解除

普段PostgreSQL+アプリケーション(Python)では、pythonのpsycopg2ライブラリを使ってDBを操作しているのですが、ここでは自動コミットは働かないので大丈夫でした。
今まで偶然大丈夫だっただけなので、今回知れてよかったと思います。

ロックエスカレーション

使用するDBMSによっては、内部的に自動で行われることで実はボトルネックになっていたり、デッドロックの原因になったりがあり得るということなので、知っておく必要のある知識と感じました。

DDLについてはDBMSによってはロールバックできない

作業前のバックアップは何にしろ取っておくのが吉というのは当たり前なのですが、こういった仕様のものがやはりあるので、より大切だと認識しました。

部分一致検索 / 後方一致検索ではインデックスは使用されない

知らないと、インデックスつけたし高速になってるはず!
…あれ?となっていたことでしょう。

今の所、インデックスをつける必要がない程度のデータ量しか扱っていないですが…

マテリアライズドビュー

実務でPostgreSQLGUIから見るのにa5m2を使用しており、そこでマテリアライズドビューという単語は見ていたのですがなんだろう?と思っていました。(一つも作られてはいませんでしたが)

トップダウンアプローチ / ボトムアップアプローチ

理想・要件から設計していく視点と、現状から設計していく視点、どちらも必要であり、片方では過不足が発生しやすくなる。

期待した結果は得られているが、なんとなくの理解で過ごしていた部分を理解できた

where句に書くか、having句に書くか曖昧

各句がどの順番で処理されていくかをしっかりと理解できていなかったので、なんとなく書き移して期待通りに得られた!で済ましていたように思います。
where句に書くのが正しい処理もhaving句に移しているケースもきっとあっただろうなぁ。

トランザクション分離

漠然と大切だという認識は持っていましたが、本書で紹介されている副作用について、それぞれ実際のケースが頭に入っていなかったです。

こはちょっと…と感じたところ

例題のカラム名も日本語

実務でカラム名は大抵日本語を避けると思うので。
また、入力時も入力切り替えしないといけないのでちょっとめんどくさく感じてしまいました….

参考書内はわかりやすくするため日本語になっているのは良いと思うのですが、実際にSQLを書く演習では英単語になってると良いなと。

dokoQLはちょっと使いづらい

SQLの実行回数制限がある(上限に達するとリセットしないとならない).

日本語入力すると見えてるカーソル位置と実際のカーソル位置がズレる不具合があった。
(自分だけかも知れないですが)

読了した後でも難しいと感じる部分

トレードオフを理解して採用する必要があること

経験を積むしかないことではあると思うのですが、実際自分が設計する場面を思い浮かべるとかなり苦戦するのだろうなと感じています。
設計する際にまた読み返しつつ、繰り返して身につけていきたいと思います。

複雑な副問い合わせや結合

当本を読む前よりはかなり理解しやすく感じますし、自分でSQLを書くのもスムーズになったようには思うのですが、難しさはまだ感じます。

最後に

今回はスッキリわかるSQL入門を読ませていただきました。

1度で全て理解できるわけではないので、あれ?と思うたびに読み返したいと思います。 次回は、達人に学ぶDB設計徹底指南書を読んでの感想を書く予定です!