ようやく本題のSQL言語にたどり着きましたね。ここから先は、SQLの特徴とその利用方法についての解説がメインになります。
SQL言語は、データベース・マネジメントシステム(DBMS)に命令を送るのがお仕事。DBMSの種類は数多くあるけど、そのほとんどは標準のSQLをサポートしているから、一度おぼえてしまえば、どのDBMSもそれほど怖くはありません。
SQLの概要
SQL言語の概要
SQLは、データベースを操作するためのデータベース言語です。CやPerlのようなプログラミング言語と同じように、文法があります。ただし、SQL言語はデータベースを操作する専門の言語ですので、操作のしやすさを優先し、その文法は1つの文で完結した意味を持つようになっていています。そのような理由から、条件分岐や繰り返し処理といったフロー制御文は含まれていませんでしたが、それも最新のSQLでは部分的に対応がなされるようになってきました。
SQLでデータの検索や更新などの命令をDBMSに発行することを『クエリ(query)』と呼びます。クエリが発行され、結果が返ってくるまでの流れは次のようになります。
クエリの結果が返ってくるまでの流れ
- SQLからクエリが発行される
- DBMSがクエリを解釈し、その内容に応じてデータを処理する
- 処理の結果がユーザやプログラムに返される
標準規格
SQLが誕生した当初は、各DBMSごとに様々な拡張がなされていました。近年になって『ANSI(American National Standards Institute:米国標準化団体)』、『ISO(International Standards Organization: 国際標準化機構)』で標準化が行われており、制定された年ごとにSQL86、SQL89、SQL92、SQL:1999、SQL:2003などの規格があります。
DBMS製品によっては独自の拡張や構文の省略などがありますが、基本的にはSQLの規格に従っているので、一度覚えた知識が無駄になることは少ないはずです。そのため、一度SQLをマスターすれば、どのDBMS製品を扱うことになってもその知識を活かすことができ、他のデータベースへの移行もスムーズに行えます。
SQLの歴史
RDBMSの基礎理論は、1970年に「大型共用データバンク用のデータのリレーショナル・モデル」というタイトルで発表されました。この論文は、カリフォルニア州IBMサンノゼ研究所のE.F.Codd博士が集合理論に基づいたデータ管理手法として発表したものです。当時、Codd博士のモデルは理論だけでソフトウエアとして動くものもなく、あまり注目を集めていませんでした。
Codd博士の論文が発表された後、IBM社のサンノゼ研究所がリレーショナル型データベースシステムのプロトタイプとしてSystem Rを発表します。このSystem Rに実装されていたデータベース言語が、Codd 博士の論文に基づいたSEQUEL(Structured English Query Language)で、これが後にSQLと発展します。1989年にANSI標準化団体によってSQLが標準の規格として認定され、広く認知されるようになりました。1992年のANSI標準は、SQL92としてそれまでの商用製品の独自拡張機能なども取り込み、さらに実用性が高まりました。
第3世代に当たるSQL99はSQL92を基盤としながらも、オブジェクト指向を取り入れ、インターネットやJavaに対応したクライアント/サーバ機能を強化しています。ISOでもSQL99が規格化されています。
SQL処理の分類
SQL言語には様々な命令文がありますが、それらのほとんどはデータを処理するためのものです。理解をより深くするために、命令文をグループに分け、大きな視点からSQL言語を眺めてみましょう。
SQLにはデータの問合せや、挿入、更新、削除などの基本命令文、テーブルの構築など数多くの構文が用意されていますが、本当に必要なものはわずか10種類程度です。その処理内容は大きく分類して3つの種類に区分けすることができます。
データ定義文(DDL=Data Definition Language)
データ定義文には、テーブルの作成・変更・削除などを行うSQLが分類されます。
- CREATE
- データベースオブジェクト(テーブル、インデックス、制約など)を定義します。
- DROP
- データベースオブジェクトを削除します。
- ALTER
- データベースオブジェクトの定義を変更します。
データ制御文(DCL=Data Control Language)
データ制御文には、データの変更を確定したりキャンセルするといったSQLが分類されます。
- GRANT
- 特定のデータベース利用者に、特定の作業を行う権限を与えます。
- REVOKE
- 特定のデータベース利用者から、権限を剥奪します。
- SET TRANSACTION
- トランザクションモードを設定します。
- BEGIN
- トランザクションを開始します。
- COMMIT
- トランザクションを確定します。
- ROLLBACK
- トランザクションを取り消します。
- SAVEPOINT
- 任意にロールバック地点を設定します。
- LOCK
- テーブルなどの資源をロックします。
データ操作文(DML=Data Manipulate Language)
データ操作文は、データの修正、追加、削除、検索などを行うSQLが分類されます。データベース構築後は、ほとんどの処理がこの操作分を使ったものになります。
- INSERT INTO
- レコードを挿入します。
- UPDATE ~ SET
- レコードを更新します。
- DELETE FROM
- レコードを削除します。
- SELECT ~ FROM ~ WHERE
- レコードを検索し、結果集合を取り出します。
SQLの使い方
SQL言語の基本的な操作方法
データベースの主な操作に選択、射影、結合の3つがあります。射影は特定のデータ列の取り出し、選択は特定のデータ行の取り出し、結合は2つ以上のテーブルデータを結び付けます。
射影
データベースからフィールド(列)の値を取り出す操作です。SELECT句の中で取り出したい列名を指定します。
射影SQLの例
SELECT フルネーム FROM 顧客
上記のクエリは、顧客テーブルから[フルネーム]フィールドの値を取り出します。
射影:顧客テーブルから[フルネーム]フィールドの値を取り出す
選択
データベースからレコード(行)の値を取り出す操作です。
選択SQLの例
SELECT * FROM 顧客テーブル WHERE 顧客ID=1 OR 顧客ID=3
上記のクエリは、顧客テーブルから[顧客ID]が1と3のレコードを取り出します。
選択:顧客テーブルから[顧客ID]が1と3のレコードを取り出す
結合
複数のテーブルを外部キーを使ってリレーションを作成します。
結合SQLの例
SELECT * FROM 顧客テーブル LEFT JOIN 会社テーブル ON 顧客テーブル.会社ID = 会社テーブル.会社ID
上記のクエリは、顧客テーブルと会社テーブルに共通するフィールド[会社ID]でリレーションを作成しています。クエリ発行後は、顧客テーブルの[会社ID]フィールドの値と、会社テーブルの[会社ID]が比較され、マッチしたレコードが結合されます。
結合:顧客テーブルと会社テーブルに共通するフィールド[会社ID]でリレーションを作成
SQLの例文紹介
それでは、データ定義文とデータ操作文の代表的な例を見てみましょう。
SQLでテーブルを作成します。まずはテーブルに必要なフィールドを洗い出し、その次にデータ型などを決定していきます。
フィールド名 | 説明 | データ型 |
---|---|---|
id | プライマリキー | mediumint(8) |
title | タイトル | varchar(250) |
detail | 内容 | text |
add_dtime | 登録日 | datetime |
テーブル構成が決まったら、あとはSQL文でDBMSにテーブルを作成するように命令文を発行します。
データ定義のSQL例:テーブルの作成
CREATE TABLE review ( id MEDIUMINT(8) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT, title VARCHAR(250), detail TEXT, add_dtime DATETIME, PRIMARY KEY (id) );
データ操作のSQL例:データの挿入
テーブルを作成したら、次にデータを登録します。データ登録用のSQLはINSERTです。
INSERT review SET title='新感覚のサンダル', detail='', add_dtime='2006-05-01 10:30:11'; INSERT review SET title='オフィシャル鉄道ウォッチ', detail='', add_dtime='2006-05-01 10:48:10'; INSERT review SET title='美しい本', detail='', add_dtime='2006-05-01 12:30:28';
データ操作のSQL例:データの選択
登録したデータを取得するには、次のようにSELECTを使います。
SELECT id, title, add_time FROM review;
上記SQL文は次のような表を出力します。
id | title | add_dtime |
---|---|---|
1 | 新感覚のサンダル | 2006-05-01 10:30:11 |
2 | オフィシャル鉄道ウォッチ | 2006-05-01 10:48:10 |
3 | 美しい本 | 2006-05-01 12:30:28 |