銀河鉄道

集合で考えるSQL|結果を宣言すればエンジンが動く宣言型 Think in Sets

サムネイル
Think in SetsSQL文は「集合」論
Think in sets.
セットで考えよ

セット?

「集合」という数学の概念が
SQLのベースなの

SQLはset-based techniques|集合ベースのテクニック


ingrained procedural reflexes can often prevent us from seeing simpler set-based techniques.
(通常は)「手続き」に慣れすぎていて、集合ベースが理解しづらい

SQL for Smarties: Advanced SQL Programming

「手続き」ってなんだっけ?

procedural(手続き)と
declarative(宣言型)の違い

手続き|procedural

  • 1行ごとの手続き処理
  • 順次処理
    • ひとつひとつ順番
  • フロー制御|flow control
    • ループやifのあわせ技

なんか安心

宣言型|declarative(デクララティブ)

  • 「何をしたいか」を記述する
  • 集合単位で処理する
    • セットベース

「集合単位」が意味不明

卵焼きの例で見てみよう

手続き|手順をひとつひとつ書く

  1. フライパンを熱する
  2. 油をひく
  3. 卵を割る
  4. 流し込んで巻く

これぞ卵焼き!

procedural
  • 「どうやるか」を細かく指示する
    • How
  • ひとつひとつの手順を命令する
  • 書く量が多くなるけど、細かい制御ができる

declarative「何が欲しいか」だけを伝える

  1. 卵焼き作って!

以上。

procedural
  • 「何がほしいか」を伝える
    • Query
  • コンピュータ(エンジン)がやり方を考えてくれる
  • 書くのがシンプルで、エラーも少ない

なぜ「卵焼き作って」だけで
伝わるの?

実は、裏には
実行部隊が隠れているからよ

SQLを実行する「SQLエンジン」


Thinking procedurally means you don’t trust the engine.
「手続き」を考えるのは、エンジンを信用してないから

SQL for Smarties: Advanced SQL Programming

隠れて仕事をするのが
エンジン

SQLエンジン
  1. SQL文(命令書)を受け取り、
  2. 裏でガシガシ操作し、
    • どう処理するのが最速かを考えつつ操作している
  3. 結果を返す

なんで隠れてるの?

SQLに限らず
隠したいのは常の欲求

処理はなるべく隠したい|そのほうが安全だから

人間が知る必要のないものは知らせない
  • object-oriented (オブジェクト指向)
    • 「どうやるか」をクラスに隠したい(encapsulation)
  • SQL (set-oriented)
    • 「どうやるか」すら書かせない
    • エンジンがすべてやる

全部やってくれるエンジン、
すごい…

そもそもは
エンジンを作る人がエンジニアなのよ

エンジンを信用せよ(自分がやるのではなく)

誰かが作ってくれた、
エンジンのうえで運転する

エンジンを信用しないと無駄が増える
  • 「これお願い」で済むことを、
  • 余計なおせっかいで
  • 細かいところまで指示を出してしまう
  • 結果的に遅くなる

任せる = 信頼
あるいはエンジンへの知識

だから
エンジンが何をしているか
という知識が必要になる

Sets change all at once|集合は一斉に変化する


all the rows of the result set are created at the same time.
すべての行の結果は、同時に発生する

SQL for Smarties: Advanced SQL Programming

同時?

一括操作ってことよ

SQLは「一括操作」|all at once

  • Sets of data are manipulated as complete units of work
    • 作業単位で処理をする
  • not row-by-row processing.
    • 一行一行ではない

でも、本当の意味での
一括操作は無理なの

順次実行の果てに、結果を一括で出す

エンジンは地味に操作する

終了のホイッスルで一斉変化
  • エンジンは、ひとつひとつ処理をする
  • 結果が出たら
  • 一斉に変化させる

人間の視点からは
一括に見えてるだけ

だから考え方を変えないと
SQLが書けないの

SQLを書くコツ|The key to make SQL databases perform well

Rethink|そもそもから考え直す

SQL文を書くには
  • to take a break from the keyboard
    • まず、キーボードから離れること
  • rethink the way of approaching the problem
    • そもそもの考えを見直す必要がある
  • rethink in terms of a set-based declarative approach
    • 集合ベースの宣言型アプローチで考え直す必要がある

キーボードから離れるの?

いきなりパソコン画面に向かうと
ひとつひとつ書きがちだから

パソコンを離れ、全体をイメージする

紙で書いたほうがいい場合も
  • 複雑なSQLをコーディングする前に
  • 全体像を紙に書いてみる

全体像?

「どうやろう?」を捨てるの

実装を急ぐな、設計を見直せ

  • まず自分の考えを捨てる
    • あれやって、これやって…は手続き →NG!
    • ループやifのチカラ技を捨てる
    • ひとつずつの処理を考えない
  • 新しい考えを取り入れる
    • 「何をしたいか」に切り替える
    • 「全体の集合に対して何をすべきか」に変える
    • 個別の行ではなく、集合全体を対象にする

補足)rethink と reconsider の違い

単語ニュアンス
rethinkゼロベースで根本的に考え直す
reconsider一度考えたことを再検討する

「そもそも」から考え直し?

ゴールを宣言するのよ

ゴールの宣言から始める

Think in sets. Declare the goal.
  • Don’t think row by row. Think in sets.
    • 一行ずつ考えるな、集合で考えよ
  • Don’t trace the flow—declare the goal.
    • 過程を忘れ、ゴールを宣言せよ

どうしよう?は忘れていい
ゴールだけ宣言すればいい

つまり手段を捨てて
ちゃんとお願いするの

SQLはお願いする( = Query) 言語

そもそも Query とは
お願いするって意味

Tell the engine what, not how.

  • 人間のすることは、“何がほしいか”を明確にすることだけ
  • 手順は教えなくていい
  • 結果を語れ
SQL文は“願いごと”
  • Say what you want.
    • 欲しいものを言えばいい
  • Let the engine figure out how.
    • あとはエンジンにまかせよう

SQLエンジンって秘書みたい

AIの考え方にも似てるかも

何が欲しいか
明確にすれば
答えは出る

参考文献

  • Joe Celko’s SQL for Smarties: Advanced SQL Programming 
  • 達人に学ぶ SQL徹底指南書(ミック)
  • 達人に学ぶDB設計徹底指南書(ミック)

To be continued…

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。