データベースに関する情報を調べていると「SQL92」という言葉を目にしたことがある方も多いのではないでしょうか。
SQLには定められた年代によって、「SQL86」から「SQL92」「SQL99」などの節目を経て、最新版の「SQL:2016」まで様々な規格が存在します。
本記事では、SQL規格のメジャーバージョンである「SQL92」と多くの改訂が実施された「SQL99」をメインテーマとしながら、SQL規格についてご紹介していきたいと思います。
目次
SQL92って何?
SQL92は、名前の通り、1992年に制定されたSQL規格のことを指します。
SQL規格は1986年に統一標準規格が発表され、ANSI/ISOによって言語仕様の標準化が実施されています。
SQL規格一覧
SQL規格は、数年に一度改訂が行われており、2020年11月現在の最新版は「SQL:2016」です。
- SQL86(1986年)
- SQL89(1989年)
- SQL92(1992年)
- SQL/CLI(1995年)
- SQL/PSM(1996年)
- SQL99(1999年)
- SQL:2003(2003年)
- SQL:2008(2008年)
- SQL:2011(2011年)
- SQL:2016(2016年)
SQL92がデータベース言語としての基盤
SQL92は、データベースを操作するための言語として、一種の完成型を目指し制定されました。
1986年の統一標準規格発表以前は、各種データベースのベンダー毎に操作方法が異なる状態でした。
SQL92以前のバージョンでは、少しずつ標準化への対応を進めていましたが、マイナーバージョンと呼ばれており、SQL規格のメジャーバージョンとして最初にリリースされたのがSQL92となります。
適合性レベル
SQL92では、適合性レベルを初級・中級・上級の3段階で段階的に準拠出来るような仕組みで設定されました。
しかし、実際にはほとんどのSQL製品で初級レベルの準拠しかされていないそうです。
理由としては、SQL規格が目指すデータベース操作言語としての完成形と、利用者の要望が実用的な部分で一致しなかったことにあると言われています。
SQL92で定義された機能
ではSQL92で定義された機能については、Wikipediaから引用してご紹介していきます。
- 直交性の改善 (表式)
- データ型の拡張 (可変長文字列、ビット、文字集合、日付・時刻・時間間隔 (DATE、TIME、TIMESTAMP、INTERVAL))
- 外部結合 (OUTER JOIN)
- 定義域 (DOMAIN)
- 表明(ASSERTION)
- 一時表 (TEMPORARY TABLE: 永続化しないデータを格納)
- DDL仕様追加 (DROP文、ALTER文)
- 動的SQL仕様
- 前方・後方スクロール可能なカーソルサポート
- クライアント/サーバシステムのためのCONNECT/DISCONNECT文
SQL92からSQL99の間で何が変わった?!
SQL92と同様に、SQL規格として頻繁に話題に上がる「SQL99」についても確認しておきたいと思います。
SQL99は、名前の通り1999年に公開されたバージョンで「SQL:1999」とも呼ばれます。
SQL92規格を基盤としながら、さらなる機能拡張を目指した規格です。
SQL99で抑えておきたいポイントとしては、オブジェクト指向の考え方をSQLに取り入れる方針で標準化作業が進められていった点にあります。
SQL99で定義された機能
SQL99で新たに定義された機能についても、Wikipediaから引用してご紹介していきたいと思います。
- 正規表現による値照合
- 共通表式(WITH句)
- 再帰クエリ
- OLAP (ROLLUP、CUBE、GROUPING SETS)
- ユニオン (UNION)・結合経由の更新
- カーソル操作の機能強化 (トランザクション完了後のオープン状態保持)・ユーザ定義権限 (ROLE)・トランザクション管理の新機能 (SAVEPOINT)
- SQL/PSM強化 (制御構文 (IF、WHILEなど) サポートなど)
- SQLJ (Javaを親言語とする埋め込みSQL規格)
- データベーストリガ
- ユーザ定義関数 (ストアドファンクション)
- 非スカラー型の新しいデータ型: 真理値 (BOOLEAN) 型と配列 (ARRAY) 型、LOB (Large Object)、ユーザ定義型、構造型
- 上位表と下位表 (スーパーテーブルとサブテーブル)
- オブジェクト指向の考え方を取り入れたオブジェクト関係データベース技術 (ORDB)。配列型やユーザ定義型、ユーザ定義関数と上位表/下位表仕様により実現されている。
SQL92の規格では全622ページにより、仕様が定義されたそうですが、SQL99では約3倍の1,700ページ以上の標準化仕様が定義されているそうです。
SQL92規格のSQL文は全てのデータベースで利用出来る?!
SQL標準規格として、SQL92・SQL99に準拠するデータベースが多いわけですが、全てのデータベースで標準仕様のSQLを実行出来るわけではありません。
SQL標準規格は、各ベンダーから提供されるデーターベースが規格に沿っていないといけない強制力のあるものではなく、あくまで基準としての役割を果たしているだけです。
標準SQLと独自SQLを知ろう
標準SQLとは、上述しているようにSQL標準規格に沿って記述されたSQL文のことを指します。
- SELECT
- INSERT
- UPDATE
- DELETE
- CREATE
- DROP
- ALTER
上記一覧で挙げたようなSQL文は、基本的にはどのデータベースでも動く標準SQLです。
一方で、下記のような独自SQLもデータベース毎に利用することが可能です。
- Transact-SQLT-SQL):Microsoft
- PL/SQL: ORACLE
- PL/pgSQL: PostgreSQL
これらの独自SQLで記述されたSQL文は、他のデータベースでそのまま実行しても動かすことが出来ません。
データベース毎に、記述方法が異なるため、データベース移行時などは、移行先のデータベース仕様に沿って定義しなおす必要があります。
各ベンダー毎のSQL規格準拠情報はほとんどない
各ベンダーが提供するデータベース毎にSQL規格の準拠情報が公開されているのかというと、残念ながらほとんど有益な情報は公開されていません。
PostgreSQLに関してだけは、SQLへの準拠というページ内で公開されているようです。
SQL規格はあくまで目安として考えた上で、実際にSQL文を実行出来るかどうかは、各データベース毎に試してみないと分からないのが実状です。
さいごに:SQL92規格が現在に到るSQL定義の根幹
本記事では、SQL92とSQL99を中心に、SQL規格についての情報をご紹介してきました。
一般的に業務アプリやWebシステム開発者の方が、利用するSQL文がSQL92規格に準じているか・否かを意識する場面はほとんどないと考えてもらって良いでしょう。
知識として、SQL規格は数年おきに改訂されており、1992年に公開された「SQL92」と1999年に公開された「SQL99」が節目となっていることを把握しておいてください。
また、SQL規格に沿った「標準SQL」とベンダー毎の「独自SQL」2種類が存在することを理解しておきましょう。