PostgreSQLのより詳しい仕様や最新バージョンでの変更点については、以下の公式ドキュメントをご参照ください。
PostgreSQL Mode
PostgreSQLモードで
独自の方言を体験しよう
Miria SQL Learningでは、設定を切り替えることで PostgreSQL特有の構文をブラウザ上でそのまま試すことができます。
SQLの基本構文はMySQLやOracleと共通していますが、
SERIAL、RETURNING、ILIKE
など、PostgreSQL環境でしか通らない、あるいはよく目にする
独自の機能や特徴的な記法を実際に書いて体験してみましょう。
01
こんな方言に挑戦できます
PostgreSQLモードでは、他のRDBMSとは少し違う こんな構文の実行結果やエラーを体験できます。
SERIAL(またはIDENTITY)で連番のIDを作る
PostgreSQLでは、自動的に増加する整数IDを定義する方法として、長らく SERIAL という記法(擬似型)が広く使われてきました。
CREATE TABLE items (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price INTEGER NOT NULL
);
PostgreSQL 10以降では、標準SQLに準拠した GENERATED ALWAYS AS IDENTITY などの記述が推奨されています。MySQLの AUTO_INCREMENT と目的は同じですが、RDBMSの歴史とともに推奨される書き方も変化していくことを知っておくと実務で役立ちます。
INSERTした結果をそのまま取得する
PostgreSQLモードでは INSERT などの変更処理に RETURNING を付けて、変更された行の値をすぐに取得できます。
INSERT INTO items (name, price)
VALUES ('Blue Hoodie', 6800)
RETURNING id, name, price;
「新しく登録した商品のID(自動採番された値)をプログラム側ですぐに使いたい」というケースは実務で頻出します。MySQLには RETURNING 句がないため、代わりに LAST_INSERT_ID() 関数などを別途呼び出す必要があります。
ILIKEで大文字・小文字を区別せず検索する
PostgreSQLモードなら、標準の LIKE に加えて
ILIKE を試すことができます。
SELECT *
FROM items
WHERE name ILIKE '%hoodie%';
Hoodie、HOODIE、hoodie といった表記の違いを無視して検索できるか、データを入れて実験してみましょう。
キャスト演算子「::」で型を厳密に変換する
MySQLやSQLiteがデータ型に対して比較的「ゆるい」のに対し、PostgreSQLは型に非常に厳格です。文字列の '100' と数値の 100 を厳密に区別するため、型変換(キャスト)を頻繁に行います。
-- 文字列の'100'を整数(INTEGER)に変換して計算する
SELECT '100'::INTEGER + 50;
標準SQLの CAST('100' AS INTEGER) と書くこともできますが、PostgreSQL環境ではこの :: 演算子が方言として非常に好んで使われます。
EXCEPTで「片方にだけ存在する行」を取得する
2つのSELECT結果を比較し、最初の結果に存在して2つ目には存在しない行を取得したい場合には EXCEPT を利用します。
SELECT customer_id
FROM customers
EXCEPT
SELECT customer_id
FROM orders;
EXCEPT 自体はSQLの標準的な集合演算ですが、実はOracleモード等に切り替えるとエラーになります(Oracleでは MINUS を使うためです)。こうした環境ごとの挙動の違いもアプリ内で体感できます。
Comparison
MySQL・Oracleと比べると?
同じ目的の処理でも、RDBMSモードを切り替えると代表的な書き方が異なります。
| 目的 | PostgreSQL | MySQL | Oracle DB |
|---|---|---|---|
| 自動採番 | SERIAL / IDENTITY |
AUTO_INCREMENT |
IDENTITY / SEQUENCE |
| 大文字・小文字を区別しない検索 | ILIKE |
照合順序などに依存 | 関数・照合設定などを利用 |
| 変更行の値を返す | RETURNING |
PostgreSQLとは異なる方式 | RETURNING INTO |
| 件数制限 | LIMIT 10 |
LIMIT 10 |
FETCH FIRST 10 ROWS ONLY |
| 文字列結合 | a || b |
CONCAT(a, b) |
a || b |
※ 表は学習上の代表例です。アプリ内のバリデーションもこれに沿って判定されます。
Learning Point
「PostgreSQLの書き方」を丸暗記しない。
実務では、ひとつのRDBMSだけを知っていれば十分とは限りません。
たとえば LIMIT を覚えるだけではなく、「これは結果件数を制限するための構文であり、Oracleモードに切り替えたらエラーになる」と体験しておくことで、RDBMSが変わっても対応しやすくなります。
Miria SQL Learningでは、PostgreSQLの構文を覚えることそのものより、共通する考え方とDBごとの差分をセットで理解することを重視しています。
Try PostgreSQL
読んだら、次は
SQLを動かして
みよう!
構文の違いは、説明を読むだけでは意外と
覚えにくいものです。
Miria SQL LearningでPostgreSQLモードを選択して、SQLを
書きながらRDBMSごとの違いを確認してみてください。
Next Guide
他のRDBMSも比較してみる
DATABASE GUIDE
MySQLとは?
AUTO_INCREMENT、CONCAT()、IFNULL()など、MySQLモードでよく使われる構文を解説します。
MySQLガイドへCOMPARISON
PostgreSQL vs MySQL
SQL方言だけでなく、両RDBMSの特徴や考え方の違いを比較します。
比較ガイドへPRACTICE
PostgreSQLを実際に試す
読むだけで終わらせず、ブラウザ上のSQLエディタでPostgreSQLの構文を試します。
学習を始める