集合で考えるSQL|結果を宣言すればエンジンが動く宣言型 Think in Sets
作成日:2025-05-05
更新日:2025-05-06

セットで考えよ

セット?

「集合」という数学の概念が
SQLのベースなの
SQLはset-based techniques|集合ベースのテクニック
SQL for Smarties: Advanced SQL Programming
ingrained procedural reflexes can often prevent us from seeing simpler set-based techniques.
(通常は)「手続き」に慣れすぎていて、集合ベースが理解しづらい

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

procedural(手続き)と
declarative(宣言型)の違い
手続き|procedural
- 1行ごとの手続き処理
- 順次処理
- ひとつひとつ順番
- フロー制御|flow control
- ループやifのあわせ技

なんか安心
宣言型|declarative(デクララティブ)
- 「何をしたいか」を記述する
- 集合単位で処理する
- セットベース

「集合単位」が意味不明

卵焼きの例で見てみよう
手続き|手順をひとつひとつ書く
- フライパンを熱する
- 油をひく
- 卵を割る
- 流し込んで巻く
これぞ卵焼き!
- 「どうやるか」を細かく指示する
- How
- ひとつひとつの手順を命令する
- 書く量が多くなるけど、細かい制御ができる
declarative|「何が欲しいか」だけを伝える
- 卵焼き作って!
以上。
- 「何がほしいか」を伝える
- Query
- コンピュータ(エンジン)がやり方を考えてくれる
- 書くのがシンプルで、エラーも少ない

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

実は、裏には
実行部隊が隠れているからよ
SQLを実行する「SQLエンジン」
SQL for Smarties: Advanced SQL Programming
Thinking procedurally means you don’t trust the engine.
「手続き」を考えるのは、エンジンを信用してないから

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

なんで隠れてるの?

SQLに限らず
隠したいのは常の欲求
処理はなるべく隠したい|そのほうが安全だから
- object-oriented (オブジェクト指向)
- 「どうやるか」をクラスに隠したい(encapsulation)
- SQL (set-oriented)
- 「どうやるか」すら書かせない
- エンジンがすべてやる

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

そもそもは
エンジンを作る人がエンジニアなのよ
エンジンを信用せよ(自分がやるのではなく)

誰かが作ってくれた、
エンジンのうえで運転する
- 「これお願い」で済むことを、
- 余計なおせっかいで
- 細かいところまで指示を出してしまう
- 結果的に遅くなる

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

だから
エンジンが何をしているか
という知識が必要になる
Sets change all at once|集合は一斉に変化する
SQL for Smarties: Advanced SQL Programming
all the rows of the result set are created at the same time.
すべての行の結果は、同時に発生する

同時?

一括操作ってことよ
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|そもそもから考え直す
- 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 | 一度考えたことを再検討する |

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

ゴールを宣言するのよ
ゴールの宣言から始める
- 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.
- 人間のすることは、“何がほしいか”を明確にすることだけ
- 手順は教えなくていい
- 結果を語れ
- 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…
2025-05-05
編集後記:
この記事の内容がベストではないかもしれません。