本授業では、RDBMSとしてPostgreSQLを使用する。
PostgreSQLとはRDBMSの1つであり、 オープンソース・ソフトウェアとして提供される データベース管理システム(DBMS)である。 1970年代に、カリフォルニア大学バークレー校で ストーンブレーカー教授らを中心として開発が進められたDBMSである Ingresにルーツを持ち、その後、Postgres、Postgres95と発展し、 現在のPostgreSQLに至る。 PostgreSQLでは、RDBMSとしてSQL92/SQL99に準拠した問い合わせを行うことが出来る。
PostgreSQLは、データベース問い合わせ処理速度などの性能の点で、 他のRDBMSと比較して高いとはいえないが、 RDBMSとして十分な機能を備え、 また、ソースコードが公開されており、誰でもそのプログラムを変更できる点や、 Linuxシステム上やWindowsシステム上に容易にインストールでき、 無料で利用できることなどもあり、 研究分野や非商用分野などで広く利用されている。 他の広く利用されているRDBMSとしては、 ORACLE社のOracleや、IBM社のDB/2、マイクロソフト社のSQL Server、 オープンソースのMySQLやFirebirdなどがある。
工学部電気系では、教育用計算機システムであるUNIXシステム: eiw01〜eiw04上でPostgreSQLを利用することができる。 電気系の大演習室では、前半分の端末がこれらのシステムに接続されているので、 これらの端末を使用するとよい。
ただし、eiw01〜eiw04上のPostgreSQLは、 それぞれ独立のデータベース管理システムとなっており、 データベースも共通ではないため、 一度作成したデータベースを継続して使用したい場合、 同じUNIXシステムを利用する必要がある。 もし、端末が空いていない場合や、演習室以外から利用したい場合には、 sshなどを利用しててリモートログインし、利用すること。
また、教育用計算機システムの利用者であっても、 次節に示すとおり、データベース利用者としての登録が必要となる。 PostgreSQLの利用を予定し、まだ利用登録が済んでいない学生は 三石<takashi@ei...(...は.tohoku.ac.jp)>まで連絡すること。
PostgreSQLなどのDBMSを利用し、データベースの管理を行なうためには、 一般に、DBMSの利用者を登録する必要がある。 この利用者とは、UNIXシステムやWindowsなどの利用者とは異なり、 DBMS毎に自由に作成することができる。
PostgreSQLの利用者を作成するためには、 PostgreSQLの利用者作成権限のある利用者が、 (UNIXやWindowsシステム上の) 利用者作成コマンドであるcreatuserコマンドを使用する。 createuserコマンドの書式は以下のとおりである。
$ createuser [<オプション> ] [<ユーザ名> ] |
(注) 本授業では、あらかじめUNIXシステムと同じユーザ名で 利用者を登録してあるので、この操作の必要はない。
データベースにデータを登録するためには、 先ず、そのデータベースを作成する。 新規データベースを作成するためには、 (UNIXやWindowsシステム上の) createdbコマンドを利用する。 createdbコマンドの書式は以下のとおりである。
$ createdb [<オプション> ...] [<データベース名> ] |
もし、データベース名を省略すると、 その利用者のユーザ名と同じ名前のデータベースが作成される。 例えば、UNIXシステム上のPostgreSQLに 新しく自分のユーザ名と同じ名前のデータベースを作成する場合、 Cシェル等のコマンドラインから以下のように入力する。
$ createdb CREATE DATABASE |
データベースが正しく作成されているか確認するには、 (UNIXやWindowsシステムにおける) PostgreSQLへの問合せコマンドであるpsqlコマンドに "-l"オプションをつけて以下のように入力する。
$ psql -l List of databases Name | Owner | Encoding -----------+----------+---------- takashi | takashi | EUC_JP template0 | postgres | EUC_JP template1 | postgres | EUC_JP (3 rows) |
ただし、作成されたデータベースは、空のデータベースであり、 データベースを作成しただけではデータを登録するテーブルもない。 データベース上にテーブルを生成し、データを登録するために、 後述するSQLによりデータベースへの問い合わせを行なう必要がある。 また、同じDBMS上に同じ名前のデータベースを作成することはできない。
DBMSにアクセスし、データベースを利用するためには、 SQLによる問い合わせを行なう。 PostgreSQLに対してSQLによる問い合わせを行なうには、 (UNIXやWindowsシステム上の) psqlコマンドを利用する。 psqlコマンドの書式は以下のとおりである。
$ psql [<オプション> ...] [<データベース名> [<ユーザ名> ]] |
もし、自分が所有するデータベースにアクセスしたい場合には、 ユーザ名を省略することができる。 また、ユーザ名と同じ名前のデータベースにアクセスする場合には、 データベース名も省略できる。 従って、自分の所有する、ユーザ名と同じデータベースにアクセスする場合は、 引数に何も指定せず、psqlコマンドを実行すればよい。 psqlコマンドを実行すると、以下のように簡単な説明が表示された後、 SQL文を入力するためのコマンドプロンプトとして"=>"が表示される。
$ psql Welcome to psql, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \q to quit => |
リレーショナルデータベースにデータを登録するためには、 先ず、データを登録するためのテーブルを作成する。 SQLによる問合せにより新規テーブルを作成するには、 create table文を利用する。 create table文の書式は、以下のようになる(途中の改行は入れなくてもよい)。
|
例えば、表1に示すスキーマによるテーブル: ei_studentsを作成する場合、 以下のようにSQLを発行する("(>"は、入力継続のためのプロンプトを示す)。
=> create table ei_students ( (> id varchar(8) not null, (> ename varchar(30) not null, (> jname varchar(30), (> age integer, (> gender boolean); |
属性 | 型 | 必須/非必須 | 内容 |
---|---|---|---|
id | 文字列(8文字まで) | 必須 | 学籍番号 |
ename | 文字列(30文字まで) | 必須 | 英文氏名 |
jname | 文字列(30文字まで) | 非必須 | 和文氏名 |
age | 整数 | 非必須 | 年齢 |
gender | 真偽値 | 非必須 | 性別(true: 男性 / false: 女性) |
もし、作成したテーブルを削除したい場合には、drop table 文を利用する。 drop table文の書式は、以下のようになる。
=> drop table <テーブル名>; |
例えば、先に作成したテーブル: ei_studentsを削除する場合、 以下のようにSQLを発行する。
=> drop table ei_students; |
作成したテーブルに対して具体的なデータを登録するには、 SQLのinsert文を使用する。 insert文の書式は以下のようになる。
=> insert into <table-name> values ( <value-1> , <value-2> , ..., <value-n> ); |
例えば、テーブルei_studentsに表2に示すデータを登録するには、 以下のように繰り返しinsert文を実行する。
=> insert into ei_students values ( 'a1fm1001', 'Masayuki Torai', '虎井 正之', 37, true); INSERT 41751 1 => insert into ei_students values ( 'a1fm1002', 'Yuji Tameyama', '為山 雄二', 36, true); INSERT 41752 1 => insert into ei_students values ( 'a1fm1003', 'Yasuto Izumikawa', '泉川 靖人', 35, True); INSERT 41753 1 => insert into ei_students values ( 'a1fm1004', 'Yuichi Ogawa', '小河 雄一', 31, true); INSERT 41754 1 |
テーブルに登録されたデータを参照するには、 select文を使用する。 select文の書式は以下のようになる。
=> select <atributes> from <table-name> [where <condition> ] ; |
例えば、テーブルei_studentsに登録された全てのデータを参照するには select文の属性に"*"を指定し、以下のように入力する。
=> select * from ei_students; id | ename | jname | age | gender ----------+-------------------+-----------+-----+-------- a1fm1001 | Masayuki Torai | 虎井 正之 | 36 | t a1fm1002 | Yuji Tameyama | 為山 雄二 | 35 | t a1fm1003 | Yasuto Izumikawa | 泉川 靖人 | 34 | t a1fm1004 | Yuichi Ogawa | 小河 雄一 | 30 | t (4 rows) |
テーブル中の特定の属性に登録されたデータを参照するには、 select文の属性に、参照したい属性名を","で区切って指定する。 例えば、テーブルei_studentsのjnameとageを参照する場合、以下のように入力する。
=> select jname, age from ei_students; jname | age -----------+----- 虎井 正之 | 36 為山 雄二 | 35 泉川 靖人 | 34 小河 雄一 | 30 (4 rows) |
また、ある条件に一致したデータが含まれる行のデータを参照するには、 whereに続けて条件を指定する。 例えば、テーブルei_studentsにおいて、 属性ageの値が35より大きいデータを含む行を参照する場合、 以下のように入力する。
=> select * from ei_students where age > 35; id | ename | jname | age | gender ----------+-------------------+-----------+-----+-------- a1fm1001 | Masayuki Torai | 虎井 正之 | 36 | t (1 rows) |
登録したデータに間違いやその後の変更があった場合など、 テーブルの内容を変更したい場合には、update文を使用する。 update文の書式は以下のようになる。
=> update <table-name> set <attribute-1> = <value-1>, <attribute-2> = <value-2>, ... where <condition> ; |
例えば、テーブルei_studentsの中のidの値が'a1fm1003'の行において、 ageの値を'35'に変更したい場合には、 以下のように入力する。
=> update ei_students (> set age = '35' (> where id = 'a1fm1003'; UPDATE 1 => select * from ei_students; id | ename | jname | age | gender ----------+-------------------+-----------+-----+-------- a1fm1001 | Masayuki Torai | 虎井 正之 | 36 | t a1fm1002 | Yuji Tameyama | 為山 雄二 | 35 | t a1fm1003 | Yasuto Izumikawa | 泉川 靖人 | 34 | t a1fm1004 | Yuichi Ogawa | 小河 雄一 | 30 | t (4 rows) |
テーブルに登録されているデータを削除する場合、delete文を使用する。 delete文の書式は以下のようになる。
=> delete from <table-name> where <condition> ; |
これにより、指定された条件に一致した行が削除される。 例えば、テーブルei_studentsの中のidの値が'a1fm1004'の行を削除したい場合には、 以下のように入力する。
=> delete from ei_students where id = 'a1fm1004'; DELETE 1 => select * from ei_students; id | ename | jname | age | gender ----------+-------------------+-----------+-----+-------- a1fm1001 | Masayuki Torai | 虎井 正之 | 36 | t a1fm1002 | Yuji Tameyama | 為山 雄二 | 35 | t a1fm1003 | Yasuto Izumikawa | 泉川 靖人 | 34 | t (3 rows) |
psqlコマンドの実行を終了し、PostgreSQLへの問い合わせを終えるには、 以下のように"\q"を入力するか、もしくは、"Ctrl-D"を入力する。
=> \q $ |