第1章 SQL概説

SQL言語の概要

2009年8月13日

ようやく本題のSQL言語にたどり着きましたね。ここから先は、SQLの特徴とその利用方法についての解説がメインになります。

SQL言語は、データベース・マネジメントシステム(DBMS)に命令を送るのがお仕事。DBMSの種類は数多くあるけど、そのほとんどは標準のSQLをサポートしているから、一度おぼえてしまえば、どのDBMSもそれほど怖くはありません。

SQLの概要

SQL言語の概要

SQLは、データベースを操作するためのデータベース言語です。CやPerlのようなプログラミング言語と同じように、文法があります。ただし、SQL言語はデータベースを操作する専門の言語ですので、操作のしやすさを優先し、その文法は1つの文で完結した意味を持つようになっていています。そのような理由から、条件分岐や繰り返し処理といったフロー制御文は含まれていませんでしたが、それも最新のSQLでは部分的に対応がなされるようになってきました。

SQLでデータの検索や更新などの命令をDBMSに発行することを『クエリ(query)』と呼びます。クエリが発行され、結果が返ってくるまでの流れは次のようになります。

クエリの結果が返ってくるまでの流れ
  1. SQLからクエリが発行される
  2. DBMSがクエリを解釈し、その内容に応じてデータを処理する
  3. 処理の結果がユーザやプログラムに返される

標準規格

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

Comment

  1. SQL入門者です。
    結合の説明で、結合の結果が会社テーブルと一致してます。

  2. 質問です。

    結合SQLについて、顧客テーブルと会社テーブルにある会社IDを結合すると、
    結果は、内容は全て会社テーブルの表示であり、顧客テーブルの(フルネーム)などは
    表示されなくなるのでしょうか?

コメントを残す

メールアドレスが公開されることはありません。

リズムファクトリーはホームページの制作会社です。
ホームページ制作に関するご要望・ご相談はこちらからどうぞ。