データベース入門

もくじ

データベースって?

データの格納とデータのハンドリングを 行うためのツール群をデータベースと呼んでいます. データはテーブルの形式で格納され, データが格納された複数のテーブルの集合を データベースと呼んでいます.

テーブルの「1 行」に何でもデータを入れられるわけではなく, まず始めにどのようなデータを格納するか宣言する必要があります. Fortran と同じように, 「この行には文字列が入る」, 「これ列には整数が入る」 と宣言する必要があります.

今回の座学編では, データベースの簡単な使い方を実演したいと思います.

データベースをいじるには

データベース言語として SQL というものがあります. データベースの内容を いじる時には, SQL のインタプリタである psql を用いるのが一般的です. 以下では簡単な使い方を見ていきます. (既に hogehoge という名前のデータベースが作成されているものとします).

テーブルの作成


$ psql hogehoge;   (データベースの起動)

hogehoge => CREATE TABLE shinamono (hinmei TEXT, nedan INTEGER); 
ここで, 大文字で書かれた部分は SQL の構文上のキーワード, 小文字で書かれた部分はユーザ定義の構文上の要素とします. この作業を行うことによって, データベース内には,
shinamono
hinmei nedan
TEXT(文字列) INTEGER(整数)
というテーブルが作成されます.

データの登録

テーブルにデータを登録します. データを登録するには INSERET を使います.


hogehoge => INSERT INTO shinamono VALUES ('みかん', '50'); 
hogehoge => INSERT INTO shinamono VALUES ('リンゴ', '150'); 
hogehoge => INSERT INTO shinamono VALUES ('梨', '100'); 
hogehoge => INSERT INTO shinamono VALUES ('メロン', '1000'); 
この操作によって, テーブルにデータが入力されます.
shinamono
hinmei nedan
みかん 50
リンゴ 150
100
メロン 1000
という具合にデータが入力されます.

データの抽出

テーブルを表示させるには,


hogehoge => SELECT * FROM shinamono;         (全部一覧される)
hogehoge => SELECT hinmei FROM shinamono;    (品名の項だけが一覧される)
とします. これを応用すると検索エンジンが簡単にできます. 例えば以下の通り.

hogehoge => SELECT * FROM shinamono WHERE nedan = 50;  (価格が 20 なものを出力)
hogehoge => SELECT hinmei FROM shinamono WHERE hinmei ~ 'mi' ;  (品名に 'mi' の含まれる項の部分検索)
hogehoge => SELECT hinmei FROM shinamono WHERE hinmei LIKE 'mi' ;  (品名が 'mi' のものの検索)
その他にも並びをソートしたり, 数字を * 倍することも簡単に行えます.

SELECT を用いることによって, 簡単な検索ができるようになります. PostgreSQL を用いた検索システムを作る場合には, 内部で SQL 文を作成し, それをデータベースに渡してあげれば良いことになります.

Web からデータベースを扱うには

perl, Tcl, Ruby, C, Java 等には PostgreSQL を扱うための インターフェイスが用意されています. これらを使うことで 様々なアプリケーションから PostgreSQL を使うことができるようになります.

今回は Web からデータベースを扱う例を示します. perl で CGI を作る 方法もありますが, 今回は PHP を用いる方法を示します. これは HTML に 埋め込んで使えるスクリプト言語で, CGI と同等の機能を提供します.

まず, テーブルを作成します. これは予め作成しておく必要があります. 以下は「カヌー入山届」の例です.


-- カヌー「入山届け」システム データベース ==========================
-- 2001/07/08 杉山耕一朗 ============================================
-- $ psql -e -d canoe -f database.sql --


-- 消去用 SQL 文 ====================================================
drop table main;

-- メインテーブル ===================================================
create table main (
       id               int primary key,       -- 入山予定日
       date_in          date,                   -- 入山予定日
       date_out         date,                   -- 下山予定日
       river            text,                   -- 川 or 湖 or 海名
       name             text,                   -- 代表者氏名
       phone            text,                   -- 代表者連絡先
       num              int,                    -- 人数
       club             text,                   -- 所属カヌークラブ
       info             text                    -- 備考
);

-- シーケンス作成====================================================
create sequence canoe_id ;

-- ユーザ www-data がテーブルの内容を参照できるようにする ===========
grant all on main to "www-data";
grant all on canoe_id to "www-data";

データの受渡しですが, これはユーザが入力した内容を元に内部で SQL 文を 作成し, データベースに渡しています.

$sql = "INSERT INTO $tablename VALUES(
        nextval('canoe_id'),
        '$date_in', '$date_out', 
	'$river', '$name', 
	'$phone_new', $num_new, 
	'$club', '$info'
        )"; 
$result = @pg_exec($sql);

データ検索も, ユーザが入力した内容を元に内部で SQL 文を 作成し, データベースに渡しています. その戻り値を HTML のテーブルに 変換しています.

日付の選択の場合
$sql = "SELECT * from $tablename 
        WHERE date_in >= '$date'  
	AND date_in <= '$date_max' 
        order by date_in ";
$result->doSelect($sql);


名前の選択の場合
$sql = "SELECT * FROM $tablename 
        WHERE name ~ '$name'
        order by date_in "; 
$result->doSelect($sql);


last update is 2001-10-18 by sugiyama@gfd-dennou.org