PostgreSQLの使い方

PostgreSQL 8.3.5文書よりActiveObjectsと組み合わせ使う上で知ってた方がよさそうな部分のみ抜粋。
ここ記述は使いながら修正します。

その他追記の際に参考にしたURL:
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/psql_k17.htm

OSコマンドで共通な考え

  • コマンド実行時にユーザ名を指定しないと、OSのログインユーザを使用する。
  • コマンド実行時にデータベース名を指定しないと、ユーザ名を使用する。

データベースを作成する。

$ createdb -U username dbname
注意点
最初にusernameと同じ名前のdatabaseを作る必要がある。

データベースを削除する。

$ drobdb -U username dbname

PostgreSQL対話式端末プログラムを起動する。データベースdbnameがアクティブになる。

$ psql -U username dbname

ユーザ毎にpsqlプロンプトが異なる。

dbname=> … 一般ユーザ
dbname=$ … スーパユーザ
dbname=# … ? ← いまここ

versionのを確認する。

dbname=> SELECT version();

現在時刻を表示する。

dbname=> SELECT current_date;

計算を行う。

dbname=> SELECT 2 + 2;

入力バッファをクリアする

dbname=> \r

各種PostgreSQL SQLコマンドの構文に関するヘルプを表示する。

dbname=> \h

psqlを終了する

dbname=> \q

テーブルを作成する。

CREATE TABLE weather (
    city            varchar(80),
    temp_lo         int,           -- 最低気温
    temp_hi         int,           -- 最高気温
    prcp            real,          -- 降水量
    date            date
);

データベース一覧を表示する。

select datname from pg_database order by datname;

ユーザテーブル一覧を表示する。

select tablename from pg_tables where not ( tablename like 'pg_%' or tablename like 'sql_%' ) order by tablename;

ユーザ一覧を表示する。

select usename from pg_user order by usename;
ポイント
システムテーブルは'pg_'か'sql_'で始まる。

指定したテーブルのカラム情報を表示する。

select
	a.attnum as no,
	a.attname as tablename,
	t.typname as typename,
	case when a.attnotnull then 'YES'
		else 'NO'
	end as "not null"
from
	pg_attribute a, pg_class c, pg_type t
where c.relname = 'tablename'
	and a.attrelid = c.oid
	and t.oid = a.atttypid
	and a.attnum > 0;
ポイント
pg_attribute.attnumは、ユーザ作成の列には正の数が、システムの列には負の数が設定される。

テーブルに行を挿入する。

INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');

大量のデータを平文テキストファイルからロードする。

COPY weather FROM '/home/user/weather.txt';

結合問い合わせ(1)

SELECT weather.city, weather.temp_lo, weather.temp_hi,
       weather.prcp, weather.date, cities.location
    FROM weather, cities
    WHERE cities.name = weather.city;
    

結合問い合わせ(2)

SELECT *
    FROM weather INNER JOIN cities ON (weather.city = cities.name);

左外部結合

SELECT *
    FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);

自己結合

SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,
    W2.city, W2.temp_lo AS low, W2.temp_hi AS high
    FROM weather W1, weather W2
    WHERE W1.temp_lo < W2.temp_lo
    AND W1.temp_hi > W2.temp_hi;

ビューを作成する。

CREATE VIEW myview AS
    SELECT city, temp_lo, temp_hi, prcp, date, location
        FROM weather, cities
        WHERE city = name;

外部キーを作成する

CREATE TABLE cities (
         city     varchar(80) primary key,
 location point
);
CREATE TABLE weather (
city      varchar(80) references cities(city),
temp_lo   int,
temp_hi   int,
prcp      real,
date      date
);

トランザクション(コミット)

BEGIN;
SQL文1;
SQL文2;
・・・
COMMIT;

トランザクション(ロールバック)

BEGIN;
SQL文1;
SQL文2;
・・・
ROLLBAK;

トランザクション(セーブポイントロールバック)

BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Bob';
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Wally';
COMMIT;