1.SQL

詳細な説明は下記のリンクを参照してください。

1.1.SQLの歴史

E.F.Codd 氏がリレーショナル型データベースの概念を提唱して以来、実用に耐えうるリレーショナル型データベースシステムの開発が急ピッチで進められました。そして、1970年代に入って間もなく、IBM 社の SanJose 研究所 (現 Almaden 研究所) は初のリレーショナル型データベースシステムのプロトタイプとして System R を発表することになります。この System R に実装されていたデータベース言語こそが、SQL の元となる SEQUEL (Structured English Query Language) です。

「構造化英文問合せ言語」とも訳される SEQUEL は、その名の示す通り、関係代数や関係理論に基づくリレーショナル型データベースを、英文的記述によって誰もが容易に操作できるようにした画期的なものでした。

SEQUEL は、その後の 1976年に SEQUEL2 へとバージョンアップされますが、この名前が他社の登録商標であったことから、SQL と改名されます。

SQL を用いたリレーショナル型データベースは、操作性の優秀さを評価され、その仕様に準拠した製品がいろんなベンダからリリースされることになり、1970年代には、リレーショナル型データベースの事実上の標準と位置づけられるようになりました。

1980年代には ISO や JIS などで規格化されたことにより、さらに普及が進みました。現在の DBMS は、そのほとんどがリレーショナル型を採用しています。したがって、SQL を理解することで、多くのデータベースシステムを利用することができるのです。

年代
1960年代
1970年代 ●E.F.Codd 氏 リレーショナル型データモデル発表 (1970) ●IBM 社 SanJose 研究所 リレーショナル型データベースプロトタイプ SystemR のデータベース言語 SEQUEL2 発表 (1976)●Oracle をはじめとして多くの RDBMS が開発リリースされはじめる (1979〜) リレーショナルの概念が提唱されて以降、リレーショナル型データベースの研究開発が行なわれ始めた。データベス言語として、SEQUEL が開発される。
1980年代 ●ISO、JIS による SQL87 の規格化 (1987)●ISO、JIS による SQL89 の規格化 (1989〜 1990) 商品 RDBMS が多く登場し始める。ただし、ほとんどの RDBMS がメインフレームやミニコン対応。SQL を実装する RDBMS も登場。
1990年代 ●ISO、JIS による SQL92 の規格化 (1992〜 1995)●ISO/IEC SQL マルチメディアプロジェクトの設置 (1993)●ISO による SQL99 の規格化 (1999)●SQL3〜 4、SQL/MM など、さらなる SQL を追加 SQL の規格化 SQL は急速にその機能を拡張し始める。RDBMS はワークステーションや PC に移植される。
2000年代 マルチメディア他によるオブジェクト指向

上の表からも分かるように、SQL 規格の流れは SQL87 にはじまり、SQL99 まで規格化されています。最新の規格は SQL99 ですが、現在のところ、ほとんどの商用リレーショナル型データベース製品は SQL92 に準拠しています。ここでは SQL92 に準拠して説明しています。   各規格は次のように変更・改良されています。

SQL历史
SQL87 既に発表されていた多くのベンダの商用リレーショナル型データベースに実装されていた SQL の中でも、共通の基本部分だけに限定された最小限の規格。
SQL89 外部キーリレーションシップを適用するメカニズムのサポートが追加された。
SQL92 埋め込み SQL や動的 SQL などをはじめとする多様な機能が追加された。
SQL99 オブジェクト指向のアプローチによる統合や、プログラミングの拡張といった機能が盛り込まれている。

1.2. SQL とは

SQL とは Structured Query Language(構造化問合せ言語--结构化查询语言) のことで、データベースの定義や操作などを実現するためのデータベース言語の一つです。リレーショナル型データベースに対応したデータベース言語として ISO 及び JIS において規格化されており、現在ではリレーショナル型データベースの事実上の標準として位置づけられています。

1.3. SQL の機能

SQL を実装した商用リレーショナル型データベースが普及し、これが規格化されたのは,SQL が機能的で使いやすかったからです。  本来データベースを管理しているのは RDBMS(relational database management system-关系型数据库管理系统)ですが、RDBMS 自体はユーザからの指示に従って管理を行ないます。このとき、ユーザはデータベース言語を使用して RDBMS を制御し、データベースを管理するのです。このデータベース言語が SQL であり、その制御機能として大まかに以下の 3 点の機能があります。

制御機能 詳細
データベース定義(数据定义语言 (DDL)) データを格納すべき表の定義
複数の表を関連づけるための規約や制約
データベースに必要な機密保護の宣言
データベース操作(数据操作语言 (DML)) 表に対するデータの登録・修正・削除
複数の表の結合、ビュー表の作成などの集合操作
表中のデータを検索
トランザクション管理 回復や同時実行のための最小単位として保障される一連の処理の操作

1.4. SQL の利用方法

SQL を用いて RDBMS を操作する方法は幾つか存在します。
●モジュール呼び出し
  C 言語などの言語から SQL 文によって作成されたモジュールを呼び出すことでデータベース操作を実現します。モジュール呼び出しは、通常 CALL 命令によって親言語から呼び出すことが可能であるため、それぞれのモジュールを独立した形で作成することが可能です。
●静的SQL
 親言語側のソースプログラムに直接 SQL を記述する方法で、埋め込み SQL の一種です。親言語プログラム側の SQL 構文を用いることで実現します。この方式は現在では多くの RDBMS で実現可能ですが、一度親バイナリへ埋め込んでしまえば、その SQL には変化がないことから静的 SQL と呼ばれています。
●動的SQL
 上の静的 SQL に対して動的 SQL は、親言語の実行時に SQL を生成する方法で、用途に応じた SQL をその都度生成できることから、静的 SQL に比べると汎用性があります。
●直接呼び出し
 直接ユーザが命令として発行することで RDBMS の操作を行なう方法です。

実際に直接 SQL を RDBMS に発行するには、RDBMS に付属するコマンドラインツールなどのソフトを使用します。コマンドラインツールは、一般にはテキストエディタに似たウィンドウが開き、このウィンドウ内に SQL を入力します。

コマンドラインツールはこれを解析し、翻訳するとともに、この情報を RDBMS へと引き渡します。一方、RDBMS 側では指示された命令に応じたデータベース操作を行ない、その結果を通知します。コマンドラインツールでは、これらを同画面上に表示することで対話的操作を実現しています。

1.5. SQL によるデータベース操作

1.5.1. 基本的なデータ型

リレーショナル型データベースの場合、複数の列によって表が構成されます。列という単位には同様の形式の情報が入ることになります。これはたとえば氏名や住所などの文字情報の場合もありますし、金額などの整数の場合もあります。また確率のように小数点付きの情報、日付情報などなど、それぞれは列という概念において同一の形式の情報が集合化されているわけです。

このような、それ以上は論理的に分割されることはない情報の値の集合が列であり、この値の入るべき情報の形式をデータ型というわけです。

データ型は各製品に実装される SQL によって若干の差はあるので注意が必要です。公式には基本的なデータ型として次の 7つが定義されています。
CHARACTER STRING
  使用される文字セットにかかわりなく、テキストを表す全てのデータ型である。固定長と可変長があり、可変長の場合は CHARACTER VARYING と定義される。引数として固定長の場合は、その文字数をとり、可変長の場合は文字数の最大値をとる。CHARACTER は CHAR、CHARACTER VARYING は CHAR VARYING や VARCHAR と省略することも可能である。
NATIONAL CHARACTER
  文字セットが実装時に定義され、もっとも一般的に使用される言語に対応することを除けば、実質的には CHARACTER STRING 型と同じである。NATIONAL CHAR または NCHAR と省略することが可能である。
BIT STRING
  BIT 文字列はバイナリ数で、0 と 1 のシーケンスで構成される。固定長と可変長があり、可変長の場合は BIT VARYING と定義される。引数として、固定長の場合はその文字列を、可変長の場合は文字数の最大値をとる
EXACT NUMERIC
  精度とスケールを指定または暗示する。厳密な数を表す数字で次の 4つがある。
NUMERIC
    指定された桁数と小数点位置をもつ数値を定義する。
DECIMAL
    NUMERIC と非常に似ているが、実装によっては定義されているものより大きな精度が選択されるという、わずかな違いがある。NUMERIC が実際の精度を指定するのに対し、DECIMALは最小の精度を指定す
INTEGER
    小数点を持たない精度の整数値を定義する。
SMALLINT
    精度が INTGER よりも低いことを除けば、INTEGER と同じ。
APPROXIMATE NUMERIC
  精度を持つがスケールといったものはない。APPROXIMATE NUMERIC は次のとおりである。
FLOAT
    指定される精度の値以上の 2 進数精度を持つ。
REAL
    この型の精度は 10 進数で、実装時に定義される。
DOUBLE PRECISION
    この型の精度も 10 進数で実装時に定義されるが REAL の精度よりも高い。
DATETIME
  日付または時刻を示す表現の様々な部分を表す。次の3つのデータ型がある。
DATE
    YEAR、MONTH、DAY という 3つの整数フィールドの集合の型である。
TIME
    これも HOUR、MINUTE、SECOND という 3つの数値フィールドの集合の型である。
TIMESTAMP
    DATE と TIME の組合せの型である。
INTERVAL
  様々な日付や時刻間の間隔で、時間の量を示すデータ型である。
補充:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
CREATE TABLE TEST(  
a VARCHAR(10),
b NVARCHAR(15),
c TEXT,  
d INTEGER,
e FLOAT,
f BOOLEAN,  
g CLOB,  
h BLOB,  
i TIMESTAMP,
j NUMERIC(10,5),
k VARYINGCHARACTER(24),  
l NATIONALVARYINGCHARACTER(16)
);

1.5.2. テーブルの作成

リレーショナルデータベースには、データの“入れ物”が必要です。この入れ物のことをテーブルと呼びます。ここでは、テーブルの作成方法について簡単に説明します。詳細な説明は後述します。

表を作成するときには、CREATE TABLE 文を使用します。CREATE TABLE の後に続ける名称が表の名称となります。また、その後ろの部分でカッコで囲んでフィールド名称、つまり列名とデータ型やその桁数などを設定します。 ) 仮に下のような商品表、得意先表、受注表の 3つの表を作成するとします。

上の 3つの表は、次の SQL により定義します。

1
2
3
4
5
6
7
/* 商品表の定義 */
CREATE TABLE 商品表(
商品コード   CHAR(4),
商品名       CHAR(16),
単価         INTEGER,
PRIMARY KEY(商品コード)
);
1
2
3
4
5
6
/* 得意先表の定義 */
CREATE TABLE 得意先表(
得意先コード CHAR(5),
得意先名     CHAR(16),
PRIMARY KEY(得意先コード)
);
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
/* 受注表の定義 */
CREATE TABLE 受注表(
受注番号     INTEGER,
得意先コード CHAR(5),
商品コード   CHAR(4),
受注個数     INTEGER,
納品日       CHAR(8),
PRIMARY KEY(受注番号),
FOREIGN KEY(得意先コード) REFERENCES 得意先表(得意先コード),
FOREIGN KEY(商品コード) REFERENCES 商品表(商品コード)
);

説明:

PRIMARY KEY 文で主キーが何であるのかを定義しています。商品表では商品コード、得意先表では得意先コード、受注表では受注番号を示しています。また、受注表では外部キーを持っているため、これを FOREIGN KEY 文によって定義しています。
  "FOREIGN KEY (得意先コード) REFERENCES 得意先表 (得意先コード)"の部分では、「受注表の得意先コードを外部キーとして定義し、得意先表の得意先コードという列を参照するものとする」ということを宣言しているわけです。   これらの文を実行することによって、それぞれの表はデータベース上に実際に確保されることになるのです。

1.5.3. データの取り出し

登録されたデータを参照したい場合は、SELECT 文によって行います。通常、表を取り出して参照する場合には、SELECT に続けて参照したい列名、さらにそれに続けて FROM と参照すべき列の存在する表名を記述します。

1
2
/* 商品表の前列を参照する。*/
SELECT * FROM 商品表;

上記のように、SELECT 文を使用することで表中のデータを参照することが出来ます。ただし、これだけでは帳簿を眺めるだけのことと同じで、他の表との関係については全く分からず、リレーショナル型データベースの利点を生かしていると言えません。
他の表との関係や、必要なデータだけ取り出したり、ソートして表示することも、条件を付け加えることで SELECT 文から行なえます。詳細については後述します。