| [ホーム] -> [Aache + PHP + PostgreSQL 実験室] |
PostgreSQL は、オブジェクト指向の RDBMS です。奥が深いので、すべてを理解するのは非常に困難ですので(私も良く分かってないし)、簡単な部分から説明していきたいと思います。私の説明では、分からない部分、もっと深く知りたい部分などは、付属のドキュメントや、オンラインマニュアルなどを参考にしてください。
インストールの説明と重複しますが、まず、PostgreSQL を使用するユーザを作成しなければなりません。作成と言っても、UNIX に新たなユーザを作るわけではありません(まあ、必要があれば作ってください)。インストールした直後のPostgreSQL には、PostgreSQL のスーパーユーザ以外は使用できないようになっています。したがって、UNIX システムに登録されているユーザが、PostgreSQL を使えるように、PostgreSQL 内にユーザ登録をしなければならないのです。
まず、PostgreSQL のスーパーユーザでログインして下さい。ユーザを登録するには、createuser と言うコマンドを使います。このコマンドを起動すると、どのユーザを登録するか聞いてきます。ここに、UNIX システムのユーザ名を入力します。たとえば、普段使用している自分のユーザ名が「jibun」というユーザ名だったら、ここに「jibun」と入力します。次に、この登録するユーザが、データベースを作ることができるかを聞いてきます。普通は、作れる必要があるので、「y」と入力し、リターンキーを押します。最後に、このユーザが、新しいユーザを作れる(PostgreSQL に登録できる)かを聞いてきますので、好きな方を選んでリターンキーを押してください(y を選ぶと PostgreSQL のスーパーユーザと同じ権限になるので、なるべく n を選択した方がよいでしょう)。これで、作成したユーザが、PostgreSQL に接続できるようになります。
> createuser Enter name of user to add: jibun Shall the new user be allowed to create databases? (y/n) y Shall the new user be allowed to create more new users? (y/n) n CREATE USER
まず、自分のデータベースをつくらなければなりません。それには、createdb と言うコマンドを使います。単に、createdb と入力すると、自分のユーザ名と同じ名前のデータベースができます。もし、他の名前にしたければ、引数で、作る名前を与えなければなりません。また、データベースで使用する文字コードも指定することができます。ここでは、日本語 EUC コードでデータベースを作成します。なお、ユーザの作成で、データベースを作れるかどうかに、「y」と指定したユーザでしか、データベースをつくれないのに注意してください。
> createdb -E EUC_JP wwwdb CREATE DATABASE
と入力すれば、「wwwdb」と言う名で、データベース内部で日本語を EUC で管理するデータベースが作成されます。EUC で管理しているからと言って、Shift_JIS などが使えないわけではなく、Shift_JIS で入出力したい場合は、後述のクライアントの自動変換機能が利用できるので、心配しないでください。もし中国語や、韓国語など複数の言語を同時にサポートしたい場合は、「UNICODE」や、「MULE_INTERNAL」を指定すると良いでしょう。
PostgreSQL には、最初から template0, template1 という二つのデータベースが存在しますが、このデータベースはいじってはいけません。その名の通り、新しいデータベースを作ったときのテンプレートとなるデータベースです。ユーザが利用するデータベースは、上記の作業通り新しく作る必要があります。
PostgreSQL は、他のデータベースの例にもれず、SQL 文を解釈します。SQL と言う言葉を初めて聞く人もいるでしょうから、簡単に説明します。SQL とは、単純に、言語です。C 言語や、Perl などと同じで、一連の命令を持っています。その手の本を読めば、いろいろ書いてありますが、データベースにデータを登録するには、「insert」と言う命令を使いますし、登録されているデータを取り出すには、「select」と言う命令を使います。PostgreSQL には、この SQL 文をデータベースに伝えるためのツールを用意してあります。それが、psql と言うユーティリティです。
コマンドラインから、psql と入力してください。もし、データベースをつくる段階で、引数を渡して違う名前のデータベースを作ったのなら、同じように、psql にその名前を与えてください。上の例のように、「wwwdb」と言う名のデータベースに接続したい場合は、
> psql wwwdb
とすれば、wwwdb に接続されます。うまく接続できたでしょうか。「データベース名=> 」というのが出たら成功です(スーパーユーザの場合は データベース名=#)。データベース名のところには、接続したデータベースの名前が入ります。上の例では、「wwwdb=>」となります。これが、SQL 文を打つためのコマンドプロンプトとなります。SQL 文以外でも、psql 自体に命令を与えることができます。先頭がバックスラッシュ「\」の文は、SQL 文ではなく、psql に対する命令だと解釈されます。たとえば、「\q」は psql を終了させます。また、「\?」は、psql が理解する命令の一覧を表示してくれます。
もし、自分が、文字コードとして Shift_JIS コードを使っているのなら、次のコマンドを打つことで、Shift_JIS の入出力が可能となります。これにより、ユーザからの入力、画面への表示が Shift_JIS となります。ただし、実際のデータベースには、createdb を実行した時に指定した、文字コードに変換されて格納されます。
=> \encoding SJIS
次に、テーブルを作り、データの追加、変更、削除等の説明を行いますが、他のデータベース等を利用したことがあり、SQL 文を知っている方は、psql の便利なコマンドに進んでください。PostgreSQL 固有の説明はほとんどしていないからです。
まず、データを格納するためのテーブルを作成しなければ行けません。PostgreSQL では、テーブルのことを、クラスと言う場合があります。ここらへんは、オブジェクト指向をうたっているので、当然かも知れません。と、いうのは、「継承」が行えるからです。まあ、そうは言っても、ここでは、テーブルを新規に作成します。簡単なテーブルがいいので、名前と、歳と、住所の3つのカラムを持ったテーブルを作ります。テーブルの作成には create table 文を使います。
=> create table meibo ( -> name varchar(30) not null, -> age integer, -> address varchar(80)); CREATE
この意味の解説の前に、SQL 文について少し。普通一つの SQL 文は、必ず最後はセミコロン「;」で終了します。その間改行しても構いません。スペースの入れられるところならどこでも改行することができます(セミコロンを入力するまで、psql のコマンドプロンプトの表示が変わります)。
テーブルを作るときは、こんな感じの SQL 文を発行します。テーブル名、カラム名にも日本語が使えるので、わざわざ、英語にする必要はないかも知れません(どちらがいいかは宗教的な問題です(^_^;)。この SQL 文は 「create table テーブル名 (カラム);」と、指定します。カラムの部分には、カラム名と、属性(型)の組合わせを、カンマ「,」で区切って、1つ以上指定することができます。上の例では、name、age、address の3つのカラムを、指定しています。
それぞれの属性は、30 バイトの varchar と、4 バイトの数値型、80 バイトの varchar です。integer は 4 バイトで表せる符号付き整数(-2147483648 から +2147483647)で、varchar と言うのは、指定されたバイト数以下の、可変長の文字列です。似たような文字型に char 型がありますが、これは指定バイトより、格納するデータの文字が少ない場合は、後ろにスペースが付けられます。
「not null」と言うのは、「null」を許さない、と言う意味です。null と言うのは、C 言語などで言う null 文字「\0」のことではなく、「データが格納されていない状態」のことです。これは、0 バイトの文字のこととは違います。0 バイトの文字は、長さが 0 の文字と言うデータが格納されるのです。もうちょっと説明が進めば分かると思うのですが・・・。
テーブル名、カラム名に、大文字を使っていますが、内部的には大文字/小文字の区別はありません。見易さのために大文字にしているだけです。これを、psql から実行すると、成功すれば CREATE と表示されます。テーブルを作るときは、こんな感じの SQL 文を発行します。
新規に作ったテーブルには、当然データが存在しません。したがって、このテーブルにデータを追加する必要があります。追加には、SQLの「insert into」文を使う必要があります。
=> insert into meibo values ( -> 'Atsuzaki Hizuya', -> 23, -> 'Tokyo dokoka 1-2-3'); INSERT 16564 1
データを入れるときは、こんな感じの SQL 文を発行します。「insert into テーブル名 values (カラムに入れるデータ);」と、します。カラムに入れるデータは、この書式の場合は、カラムに対応する値をすべて指定する必要があります。つまり、name に対応するのが 'Atsuzaki Hizuya'、age に対応するのが 23、address に対応するのが 'Tokyo dokoka 1-2-3' です。varchar の様な、文字列型の場合は、シングルクォーテーションで囲む必要がありますが、数値型の場合は囲みません。
これを、psql から実行すると、成功すれば INSERT 137968 1 という感じで表示されます。真ん中の数値の部分は、環境によって違ってきます。始めのうちは、この値はたいして気にしないでください。こうして、データの値の部分を変えることによって、どんどんデータを追加することができます。いろいろなデータを追加してみてください。例えば、カラムに指定したデータ長より長いデータを入れてみるとか。
テーブルにデータを追加したら、表示してみたくなります。当然です。それには SQL の「select」文を使います。
=> select * from meibo;
name | age | address
-----------------+-----+--------------------
Atsuzaki Hizuya | 23 | Tokyo dokoka 1-2-3
(1 row)
上の例のように、「select カラム名 from テーブル名;」と指定します。アスタリスク「*」は、指定されたテーブルの、すべてのカラムを対象とします。ここに、直接カラム名を指定することができます。
=> select name from meibo;
name
-----------------
Atsuzaki Hizuya
(1 row)
=> select name, age from meibo;
name | age
-----------------+-----
Atsuzaki Hizuya | 23
(1 row)
上側の例では、name カラムだけを表示します。下側の例は、name と、age のカラムを表示します。このように、複数指定する場合は、カンマ「,」で区切ればいいのです。
さて、データ量が少ないうちはこれでいいのですが、データが増えた場合どうすればいいのでしょうか。数百件あるデータから目的のものを探すのは大変です。目で探していたら、せっかくのデータベースの意味がありません。そこで、select 文に、「where 句」と言うのをつけます。例えば、age が 31 のデータだけを表示したい場合の例をあげます。
=> insert into meibo values (
-> 'Ryouma Sakamoto',
-> 31,
-> 'Kouchi Tosa');
INSERT 16565 1
=> select * from meibo
-> where age = 31;
name | age | address
-----------------+-----+-------------
Ryouma Sakamoto | 31 | Kouchi Tosa
(1 row)
つまり、where の後に、条件式が書けるのです。name が、A で始まっているデータだけを表示したい場合は、次のようになります。
=> select * from meibo -> where name like 'A%';
これは、前方一致検索をしているのですが、この場合は like を使い、ワイルドカードの文字として、パーセント「%」を使うのです。もちろん、これらは、and や、or を使い、複数の条件を設定することも可能です。name に a を含み、age が 23 のデータを表示したい場合は、次のようになります。
=> select * from meibo
-> where name like '%a%'
-> and age = 23;
name | age | address
-----------------+-----+--------------------
Atsuzaki Hizuya | 23 | Tokyo dokoka 1-2-3
(1 row)
すでに登録されているデータを変更したくなることがあります。たとえば、name が 'Atsuzaki Hizuya' さんの住所が変わったとしましょう。次の文で、変更できます。
=> update meibo set
-> address = 'Osaka dokoka 9-8-7'
-> where name = 'Atsuzaki Hizuya';
UPDATE 1
=> select * from meibo;
name | age | address
-----------------+-----+--------------------
Ryouma Sakamoto | 31 | Kouchi Tosa
Atsuzaki Hizuya | 23 | Osaka dokoka 9-8-7
(2 rows)
変更する場合は、「変更するカラム = 新しい値」と指定します。そして、必ず変更するデータを、where 句で指定する必要があります。もし、where 句に何も指定しないと、全てのデータが変更されます。
次のように、複数のカラムを、一度に変更することもできます。複数のカラムを指定するときは、間をカンマ「,」で区切ります。
=> update meibo set
-> age = 24 ,
-> address = 'Nagoya 5-5-5'
-> where name = 'Atsuzaki Hizuya';
UPDATE 1
=> select * from meibo;
name | age | address
-----------------+-----+--------------
Ryouma Sakamoto | 31 | Kouchi Tosa
Atsuzaki Hizuya | 24 | Nagoya 5-5-5
(2 rows)
登録されているデータを削除することもできます。
=> delete from meibo
-> where name = 'Atsuzaki Hizuya';
DELETE 1
=> select * from meibo;
name | age | address
-----------------+-----+-------------
Ryouma Sakamoto | 31 | Kouchi Tosa
(1 row)
必ず削除するデータを、where 句で指定する必要があります。もし、where 句に何も指定しないと、全てのデータが削除されます。気をつけましょう。
時として、テーブルごと削除したくなるときがあります。カラム名を間違えてしまったときとか、カラムが足らなかったときとか。もちろん削除せずに、カラムの追加等を行うことも出来ますが、結構、削除してからテーブルをつくり直すことも多いのです。
=> drop table meibo; DROP
これで、meibo テーブルが削除されます。なお、当然のことながら、テーブル内にあるデータも削除されます。これは、取り返しの付かない操作ですので、気をつけて行ってください。
psql で使える、便利なコマンドをあげます。
| コマンド | 説明 |
|---|---|
| \? | ヘルプを表示します。 |
| \h |
SQL 文の簡単なヘルプを表示します。単に「\h」と打つと、表示することができる SQL の一覧が出ます。「\h コマンド」と打てば、その SQL コマンドの書式が表示されます。例えば「\h select」とすると、select 文の構文が表示されます。
|
| \q |
psql を終了します。
|
| \g |
SQL 文を実行します。SQL 文の最後に、セミコロン「;」を書くと、その SQL 文が実行されますが、セミコロンを書かずに、最後に「\g」と書いても、同じように実行されます。
|
| \i |
他のファイルに書かれている内容を取り込みます。一連の SQL 文を、事前にファイルに書いて作成しておき、「\i ファイル名」とすることにより、一度にSQL 文を実行することが可能となります。Oracle の SQL*Plus で、頭にアットマーク「@」をつけて外部のファイルを実行するのと同じことです。
|
| \d |
データベースの内容を表示します。ただ、「\d」と打てば、現在のデータベース内のオブジェクト(テーブルとか、ビューとか)を表示します。\d のあとに、オブジェクト名を指定すると、そのオブジェクトのカラムや、カラムの型などが表示されます。Oracle の SQL*Plus の、desc コマンドと似ています。
|
| \e |
直前に発行した SQL 文の編集をエディタを使って行います。たぶん、環境変数 EDITOR に設定されている、エディタが使われていると思います。編集を終了すると、その SQL 文が実行されます。
|