MySQL 版と同じ順番で進みますが、PostgreSQL にしかない道具を毎回入れています。DISTINCT ON、= ANY(配列)、FILTER 句、キーセットページネーション、JSONB、SKIP LOCKED、MERGE、そして EXPLAIN の Buffers。全30レッスンで、制約で守れることはアプリで守らない設計まで。
全30レッスンを6つの章に分けています。第1章から順に進めるのがおすすめですが、 いま困っている範囲だけを拾い読みしてもかまいません。 ※ SQL はブラウザ内で実行できません。手元に PostgreSQL 18(16・17 でもほぼ同じ)を入れて、第1回のサンプルデータを読み込んで試してください。
psql で接続し、スキーマとテーブルを作り、INSERT した行を RETURNING でそのまま受け取るところまで。MySQL の「データベース」が、ここでは「スキーマ」であることから始めます。
「カテゴリごとに1件」を1文で書ける DISTINCT ON、IN 句のプレースホルダを作らずに済む = ANY(配列)、NOT IN に NULL が1つ混ざると0件になる話、そして OFFSET をやめる方法。
CASE WHEN で数えるのをやめる FILTER 句から、GROUP BY と HAVING、JOIN の重複、LATERAL、EXISTS、そして WITH が最適化の壁ではなくなった話まで。
ウィンドウ関数のフレーム、timestamptz と BETWEEN の落とし穴、ON CONFLICT による UPSERT と COPY での大量投入、そして TRUNCATE も ROLLBACK できるという話。
分離レベルとアボートしたトランザクション、SKIP LOCKED で足りるジョブキュー、numeric と uuidv7、jsonb には効かないもの、制約と正規化。
インデックスの種類と効く条件、EXPLAIN は時間ではなく Buffers を見る話、VACUUM と統計情報、ロールと権限とバックアップ、そして psycopg でアプリから使うところまで。
全30レッスンを終えたら、同じ題材を MySQL で見る データベース基礎(MySQL)へ。アプリ側から使うなら FastAPI 入門や Django 入門が続きです。メンバーシップで全コースが解放されます。