はじめに
この連載では、これまでC言語やPerl、Javaなどの手続き型言語(またそれに基礎を持つ言語)を主に使用してきたプログラマやエンジニア(要するに、私たちのほとんど全員、ということになるでしょうが)を対象に、データベースという特有の世界―集合論と述語論理のロジックが支配する世界―について、ケーススタディを交えながらわかりやすく解説していくことを目的としています。
「手続き型プログラマの視点から初めて集合指向(setoriented)の世界を見た場合」を想定して、多くの方にとっては馴染みの薄い集合や述語といった概念を、なるべく慣れ親しんだ手続き型の考え方にひきつけて解き明かしてみせよう、というわけです。もちろん、SQL初心者だけではなく、プロフェッショナルなDBエンジニアにも楽しんでもらえるトピックを盛り込んでいこうと考えています。どうぞよろしくお付き合いください。
SQLと連番
さて、第1回のテーマはSQLにおける「連番」の扱い方です。SQLでは伝統的に連番を扱うための機能が存在しませんでした。連番とは、1(または0)から始まって2、3、……と1つずつ値がカウントアップされていく自然数列のことです。SQLが連番に対する機能をサポートしていない理由は「エンティティの属性とはみなせないから」という、主に関係モデルの理論上の要請によるところが大きいのですが、実務においては、適当な行集合に対して連番を振ることが必要になるケースが多くあります。最近ではそうした実務的な要求にも応えるべく、標準SQLにも連番を扱うための機能が追加されるようになりました[1]。
「集合指向」と「手続き型」
連番をSQL上で扱えるようになったということは、データの「順序」を意識したコーディングが可能となったということを意味します。それはつまり、伝統的に集合指向的な原理に基づいていたデータベースの世界に手続き型的な原理がミックスされた、ということです。本稿では、1つの問題を解く際にも、「集合指向」と「手続き型」という2つの異なるアプローチによってどのように考え方が変わるか、という点に注目しながら、SQLの考え方を説明します。
なお、稼働環境は次のものを対象としています。
- Oracle 9i以降
- PostgreSQL
- MySQL 5.0以降
実際に動作確認を行った環境は「Oracle10.2.0.1」、「PostgreSQL 8.3」、「MySQL 5.0」です。ただし、本稿のSQLは標準SQLに準拠しているため、DB2およびSQLServerでも動作すると思われます。