集合指向と手続き型
本稿では、OLAP関数の使い方を解説してきました。ここで話をまとめておくと、OLAP関数とは、カット(PARTITION BY)と順序付き走査(ORDER BY)という2つの処理を一度に行う機能です。このうち、カットはGROUP BYとほぼ同じ機能のため、集合指向的なSQLの伝統を引き継いでいますが、一方の順序付き走査のほうは明らかにこれまでのSQLの方向性とは一線を画しています。
SQLは長らく、レコードの順序というものを意識しない言語でした。その理由は、SQLの基礎になっている集合論が集合内の要素の順序を意識しないからです。しかし、OLAP関数の導入により、SQLは手続き型の考え方を初めて明示的に取り入れました。
ここで、SQLの基本原理である集合指向と、C言語/Javaなどの基本原理である手続き型の対比を表にまとめてみましょう(図9)。
図9 集合指向と手続き型の対比
| 集合指向 | 手続き型 |
処理単位 | レコードの集合(テーブル) | レコード |
行の順序 | 意識しない | 意識する |
ソート | 明示的には行わない | コード上で行う |
OLAP関数は、この表の右側(手続き型)に属します。「ソート」に関して補足しておくと、ORDER BY句があることで、OLAP関数は必ずソートを行います(そうしないとレコードのランキングなどは計算できません)。SQLも、集約関数や集合演算子など、暗黙にソートを行う機能はこれまでも持っていましたが、明示的にソートを記述する機能はありませんでした(例外はSELECT文の最後に付けるORDER BY句ですが、これは厳密にはSQLの演算子ではなくカーソル定義の一部とされてきました)。
このようにOLAP関数というのは、集合指向と手続き型の考えをミックスした機能だと言うことができます。おそらく、今後もSQLは手続き型やオブジェクト指向の良いところを積極的に取り入れて、より高度で使いやすい言語へ進化を遂げていくことでしょう。
終わりに
最後に、OLAP関数のポイントをもう一度まとめておきましょう。
- OLAP関数はSQLの難点だった行間比較を簡単、高速に実行するために導入された
- OLAP関数は見た目上、集約関数のように見えるが、実はまったく集約機能は持っていない
- その理由は、OLAP関数がSELECT句で実行される関数だから
- OLAP関数を使うときは常に横(PARTITION BY)と縦(ORDER BY)の2軸を考えること
- PARTITION BY句でウィンドウを作ったあと、さらに内部でフレームという範囲制限もできる
さて、長らくお付き合いいただいたこのアカデミーも、今回をもっていったんの区切りとなります。みなさんのSQLとリレーショナルデータベースへの理解を多少でも助けることができたならば幸いです。
終わりといっても実は次号から、今度はSQLに限らずリレーショナルデータベース全体に話を広げた新しい講座が始まります。
こちらも引き続き受講していただければ幸いです。それでは、また次号でお会いしましょう。
参考資料
- J.セルコ『SQLパズル 第2版』
(翔泳社, 2007)
OLAP関数の練習問題としては、「パズル15 現在の給料と昇給前の給料」「パズル29 最頻値を求める」「パズル35 在庫調整」「パズル38 記録の更新」などがお勧めです。
- ミック「SQLアタマ養成講座」第2章「SQL流行間比較」
OLAP関数と相関サブクエリ、双方で同じことをやろうとした場合にどういう違いが出るか、という観点で解説を行っています。特にOLAP関数を持たないMy SQLユーザの方には有用でしょう。