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