3秒でわかる
オープンソースのリレーショナルデータベース。標準SQLへの忠実さとJSONや全文検索まで含む機能の広さから、業務システムでも定番になっています。
もう少し詳しく
どういうものか
PostgreSQL は、テーブルと SQL でデータを扱うオープンソースのリレーショナルデータベース管理システムです。読み方は「ポストグレスキューエル」、現場では「ポスグレ」と略されます。1980 年代のカリフォルニア大学バークレー校の POSTGRES が源流で、いまも年 1 回のペースでメジャーバージョンが出ています。
ライセンスは PostgreSQL ライセンスという緩い条件で、商用サービスに組み込んでも費用はかかりません。
なぜ必要か
データを CSV やファイルで持つと、同時に書き込んだときの壊れ方、集計のたびに全件を読む遅さ、不正な値の混入といった問題が一気に出ます。PostgreSQL はトランザクション、インデックス、制約でこれらをまとめて引き受けます。
MySQL と並ぶ選択肢の中で PostgreSQL が選ばれるのは、標準 SQL への準拠が厳しく、ウィンドウ関数や CTE といった集計向けの構文が早くから揃っていた点、そして JSON 型・全文検索・地理情報(PostGIS)まで 1 つのデータベースで賄える点です。
具体例
型と制約を宣言しておくと、おかしなデータはデータベース側で弾かれます。
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
amount NUMERIC(10,2) NOT NULL CHECK (amount >= 0),
detail JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
SELECT user_id, SUM(amount) AS total
FROM orders
WHERE created_at >= now() - INTERVAL '30 days'
GROUP BY user_id
ORDER BY total DESC
LIMIT 10;JSONB 列には構造の決まらないデータをそのまま入れられ、detail->>'coupon' のように SQL から取り出せます。
つまずきやすいところ
CREATE TABLE Users は内部で users に畳まれます。"Users" とダブルクォートで作った場合だけ大文字が保持され、以後も毎回クォートが必要になりますfloat を使う — 誤差が出ます。NUMERIC を使いますVACUUM を知らない — 更新や削除をしても古い行はすぐ消えず、自動 VACUUM が回収します。大量更新のあとテーブルが太るのはこの仕組みが理由ですLIMIT 10, 20 は使えず LIMIT 20 OFFSET 10 と書きます似た用語との違い
| 名前 | 位置づけ |
|---|---|
| PostgreSQL | RDBMS の製品名。サーバーとして動く |
| SQL | データベースを操作する言語。製品ではない |
| MySQL | 別の RDBMS。方言や既定の挙動が異なる |
| SQLite | 1 ファイルで完結する組み込み型。サーバーを立てない |
覚え方
「SQL は言葉、PostgreSQL はその言葉を話す相手」と分けて覚えます。SQL 入門で学んだ構文はそのまま PostgreSQL で通じ、違いが出るのは型名と方言の部分だけです。