next up previous contents
Next: PostgreSQL を CGI で使う Up: WWWでデータベースにチャレンジ!〜PostgreSQLを使って Previous: PostgreSQLのインストール

PostgreSQL の簡単な使い方

では、早速 PostgreSQL を使ってみましょう。まずはデータベースを作り、ユー ザ登録をしなければなりませんが、これはユーザ ``postgres'' で行ないます (または、PostgreSQL をインストールした時に使ったユーザで実行します)。 とりあえず ``test'' という「データベース」を作ってみますgif

% createdb test

次に、``foo'' というユーザを登録します。

% createuser foo
Enter user's postgres ID or RETURN to use unix user ID: 1997
Is user "foo" allowed to create databases (y/n)y
Is user "foo" allowed to add users? (y/n)n
createuser: foo was successfully added

最初の質問は foo というユーザに割り当てる id です。もしもそのユーザ名 が /etc/passwd に存在する場合は、id のデフォルト値として Unix の uid が表示されます。

次の質問は foo というユーザが、自分用のデータベースを作れるかどうかで す。通常は ``y'' と答えておいて下さい。

最後の質問はそのユーザが新たに PostgreSQL のユーザを createuser を使っ て定義できるかどうかです。通常は ``n'' にしておくのが良いでしょう。

準備ができたので、早速テーブルを作ってみましょう。今回はせっかくですか ら PostgreSQL の機能を利用し、簡単な地理データベースを作ることにします。 このテーブルの名前を ``city'' とします。city には、以下のようなカラムが あります。

カラム名 データ型 説明
name char16 都市名(16文字まで)
loc point 本来は xy 座標で示す点ですが、今回は経度、緯度を xy 座標とみなします

本来角度を表す単位である緯度、経度を2次元上の xy 座標とみなすのは相当 無理があるのですが、狭い日本での話しなので目をつむって下さい。

ここから先は、SQL インタプリタである psql を使います。さきほど登録した ユーザになって、psql を起動して下さい。引数はデータベース名です。 なお、

test=>
は psql のプロンプトです。

% psql test
Welcome to the POSTGRES95 interactive sql monitor:
  Please read the file COPYRIGHT for copyright terms of POSTGRES95

   type \? for help on slash commands
   type \q to quit
   type \g or terminate with semicolon to execute query
 You are currently connected to the database: testdb

test=> create table city (name char16, loc point);
CREATE

次に、データを入力しますgif

test=> insert into city values ('横浜','(139.39,35.26)');
INSERT 410426
test=> insert into city values ('新潟','(139.3,37.55)');
INSERT 410427
test=> insert into city values ('東京','(139.46,35.42)');
INSERT 410428
test=> insert into city values ('青森','(140.46,40.49)');
INSERT 410429
test=> insert into city values ('福岡',(130.23,33.55)');
INSERT 410430
test=>

結果を確認しましょう。

test=> select * from city;
name|loc           
----+--------------
横浜|(139.39,35.26)
新潟|(139.3,37.55) 
東京|(139.46,35.42)
青森|(140.46,40.49)
福岡|(130.23,33.55)
(5 rows)

次のようにすれば横浜の座標のみを表示することができます。

test=> select * from city where city.name = '横浜';
name|loc           
----+--------------
横浜|(139.39,35.26)
(1 row)

これだけだとあまり面白くないので、地理データベースらしい使い方をしてみ ましょう。例えば、東京より北にある都市を問い合わせる場合は、 ``!^'' 演算 子を使って、以下のようになります。

(現在(6.3.2)では ``>^''演算子になっています。)

test=> select c1.* from city c1, city c2 where c2.name = '東京' and c1.loc !^ c2.loc;
name|loc           
----+--------------
新潟|(139.3,37.55) 
青森|(140.46,40.49)
(2 rows)

もちろん、北の他に、南(!|)東(!>)西(!<)なども問い合わせることができま す。

(現在(6.3.2)では、南(<^)東(>>)西(<<)になっています。)

PostgreSQL では、関数を使うことができます。ユーザは関数を SQL や C 言 語で記述することができます。また、システム組み込み関数もいくつか用意さ れています。その中の一つ、point_distance という関数は、与えられた2つの point 型データを2 次元平面上の座標と見做し、それらの間の「距離」を計算 します。これを使って、データベース中の都市間の距離を求めることができま す(当然のことながら、ここで言う「距離」と現実世界での距離は一致しませ ん)。

select c1.name,c2.name,point_distance(c1.loc,c2.loc) from city c1, city c2 where c1.name > c2.name;

name|name|   point_distance
----+----+-----------------
新潟|横浜| 2.29176787655294
東京|横浜|0.174642491965742
青森|横浜| 5.33833307316058
福岡|横浜| 9.31824554301935
東京|新潟| 2.13600093632938
青森|新潟| 3.16056956892267
福岡|新潟| 9.91286537788143
福岡|東京| 9.41752621445783
東京|青森| 5.16767839556604
福岡|青森| 12.3618971036003
(10 rows)



Tatsuo Ishii
1998年07月06日(月) 14時34分03秒 JST