SQL Dialect Cheat Sheet

PostgreSQL・MySQL・Oracle・SQLite
SQL方言早見表

「これ、別のDBではどう書く?」をすぐ確認。 やりたいことを軸に、4つのRDBMSの代表構文を横並びで比較できます。 実務の確認、DB移行、SQL学習の手元リファレンスとして使える早見表です。

  • 32項目を目的別に比較
  • 公式リファレンスへの出典付き
  • 検索・カテゴリ絞り込み・コピー対応
やりたいこと 上位10件を取得
PostgreSQL
LIMIT 10
MySQL
LIMIT 10
Oracle DB
FETCH FIRST 10 ROWS ONLY
SQLite
LIMIT 10

How to Read

「完全互換表」ではなく、迷ったときの入口として。

このページは、各RDBMSでよく使われる代表的な構文を比較するための早見表です。 同じ機能でも複数の書き方が存在する場合や、バージョン・SQLモード・照合順序・設定によって挙動が変わる場合があります。

2026年9月4日時点の公式ドキュメントを確認し、 PostgreSQL 18、MySQL 8.4 LTS、Oracle Database 26aiを中心に整理しています。 SQLiteは現行の公式ドキュメントを参照し、バージョン差が重要な項目には注記しています。

Quick Compare

構文の違いが出やすい代表的な4項目

各RDBMSごとの方言(違い)がとくに目立つ代表例です。下の早見表では、さらに28項目を網羅して比較しています。

件数制限

LIMIT / FETCH FIRST

PostgreSQL / MySQL / SQLite LIMIT 10
Oracle FETCH FIRST 10 ROWS ONLY
詳しく比較

NULL置換

COALESCE / IFNULL / NVL

PostgreSQL COALESCE(price, 0)
Oracle NVL(price, 0)
詳しく比較

自動採番

IDENTITY / AUTO_INCREMENT

PostgreSQL GENERATED ... AS IDENTITY
MySQL AUTO_INCREMENT
詳しく比較

Cheat Sheet

目的別 SQL方言早見表

キーワード検索やカテゴリ絞り込みを利用して、目的の構文を探すことができます。コード横の「コピー」ボタンから代表構文をクリップボードに保存できます。

32項目を表示中

Category 01

SELECT・文字列・日付

取得件数、文字列、NULL、検索、日付演算など、SELECTで頻繁に迷う違い。

SELECT・文字列・日付:PostgreSQL・MySQL・Oracle Database・SQLiteの代表構文比較
やりたいこと PostgreSQL MySQL Oracle DB SQLite
# 上位N件を取得 LIMIT / FETCH FIRST

取得件数を10件に制限する代表構文。安定した結果にするにはORDER BYと組み合わせます。

公式リファレンス
LIMIT 10

LIMIT / OFFSETを使用。

LIMIT 10

LIMIT row_countを使用。

FETCH FIRST 10 ROWS ONLY

12c以降で利用できる代表的な書き方。

LIMIT 10

LIMIT句を使用。

# 20件飛ばして10件取得 OFFSET / ページング

ページネーションでよく使うOFFSET付きの例です。

公式リファレンス
LIMIT 10 OFFSET 20

OFFSETで先頭行を読み飛ばします。

LIMIT 10 OFFSET 20

LIMIT 20, 10という書き方も可能。

OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY

row limiting clauseを使用。

LIMIT 10 OFFSET 20

LIMITとOFFSETを組み合わせます。

# 文字列を結合 CONCAT / ||

NULLを含む場合の挙動は関数・演算子ごとに異なるため注意してください。

公式リファレンス
first_name || ' ' || last_name

|| が標準的。concat()も利用可能。

CONCAT(first_name, ' ', last_name)

|| は通常は論理OR。PIPES_AS_CONCAT設定では挙動が変わります。

first_name || ' ' || last_name

|| が代表的。CONCAT()も利用可能。

first_name || ' ' || last_name

|| が広く使えます。concat()も現行SQLiteで利用可能。

# NULLを別の値に置換 COALESCE / IFNULL / NVL

移植性を重視する場合は標準SQLのCOALESCEが使いやすい選択肢です。

公式リファレンス
COALESCE(price, 0)

COALESCEを利用。

IFNULL(price, 0)

COALESCEも利用可能。

NVL(price, 0)

COALESCEも利用可能。

IFNULL(price, 0)

COALESCEも利用可能。

# 大文字・小文字を無視して検索 ILIKE / LIKE / UPPER

照合順序(collation)や文字種によって結果が変わる項目です。

公式リファレンス
name ILIKE '%miria%'

ILIKEはPostgreSQL固有の大小文字無視LIKE。

name LIKE '%miria%'

大小文字を区別するかは主に列のcollationに依存。_ciはcase-insensitive。

UPPER(name) LIKE UPPER('%miria%')

関数で両辺を揃える代表例。NLS設定も考慮が必要です。

name LIKE '%miria%'

既定のLIKEはASCIIの大小文字を区別しません。Unicodeでは注意。

# 文字列の一部を取り出す SUBSTRING / SUBSTR

先頭から3文字を取得する例です。

公式リファレンス
SUBSTRING(name FROM 1 FOR 3)

SQL標準に近いキーワード構文。

SUBSTRING(name, 1, 3)

SUBSTR()も別名として利用可能。

SUBSTR(name, 1, 3)

SUBSTRを使用。

substr(name, 1, 3)

substr() / substring()を利用できます。

# 文字数を数える CHAR_LENGTH / LENGTH

バイト数ではなく文字数を数える代表例です。

公式リファレンス
CHAR_LENGTH(name)

character_length()も同義。

CHAR_LENGTH(name)

LENGTH()はバイト数なのでマルチバイト文字では差が出ます。

LENGTH(name)

文字数を返します。

length(name)

文字列の文字数を返します。

# 現在日時を取得 CURRENT_TIMESTAMP

同じ名前でもタイムゾーンや返却型の扱いに違いがあります。

公式リファレンス
CURRENT_TIMESTAMP

トランザクション開始時刻を基準とする点にも注意。

CURRENT_TIMESTAMP

NOW()の同義語。セッションタイムゾーンを使用。

CURRENT_TIMESTAMP

セッションタイムゾーンのTIMESTAMP WITH TIME ZONE。

CURRENT_TIMESTAMP

UTCの日時文字列を返します。

# 日付に7日を加算 INTERVAL / DATE_ADD / 修飾子

日付演算はRDBMS差が目立つ代表例です。

公式リファレンス
CURRENT_DATE + INTERVAL '7 days'

INTERVAL値を加算。

DATE_ADD(CURRENT_DATE, INTERVAL 7 DAY)

DATE_ADD()を使用。

CURRENT_DATE + 7

DATEへ数値を加えると日数として扱えます。

date('now', '+7 days')

date/time関数のmodifierを使用。

# 日付を文字列として整形 TO_CHAR / DATE_FORMAT / strftime

日付の表示形式をYYYY-MM-DDへ揃える例。書式指定子はRDBMSごとに異なります。

公式リファレンス
TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD')

TO_CHAR()のテンプレートを使用。

DATE_FORMAT(CURRENT_DATE, '%Y-%m-%d')

DATE_FORMAT()は%付きの書式指定子を使用。

TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD')

TO_CHAR()と日時書式モデルを使用。

strftime('%Y-%m-%d', 'now')

strftime()で日時文字列を整形。

# 複数行の文字列を1つに連結 STRING_AGG / GROUP_CONCAT / LISTAGG

GROUP BYと組み合わせて、複数行の値を区切り文字付きで1つの文字列へ集約する代表例。

公式リファレンス
STRING_AGG(name, ',' ORDER BY name)

STRING_AGG()を使用。集約内でORDER BYを指定できます。

GROUP_CONCAT(name ORDER BY name SEPARATOR ',')

GROUP_CONCAT()を使用。group_concat_max_lenにも注意。

LISTAGG(name, ',') WITHIN GROUP (ORDER BY name)

LISTAGG()とWITHIN GROUPを使用。

group_concat(name, ',')

group_concat()を使用。現行SQLiteではstring_agg()も別名として利用可能。

# 文字列を整数へ型変換 CAST / ::

CAST自体は共通性が高い一方、指定する型名やPostgreSQLの省略記法に違いがあります。

公式リファレンス
CAST('123' AS INTEGER)

'123'::INTEGERというPostgreSQL固有の省略記法もあります。

CAST('123' AS SIGNED)

整数変換ではSIGNED / UNSIGNEDを指定できます。

CAST('123' AS NUMBER)

数値型としてNUMBERを指定する代表例。

CAST('123' AS INTEGER)

SQLiteのstorage class / affinityの考え方にも注意。

# JSONからnameを文字列として取り出す ->> / JSON_VALUE / json_extract

JSONオブジェクトのスカラー値をSQLの文字列として取得する代表例です。

公式リファレンス
data ->> 'name'

->> はJSON/JSONBのフィールドをtextとして返します。

data ->> '$.name'

->> はJSON_UNQUOTE(JSON_EXTRACT())相当。

JSON_VALUE(data, '$.name')

JSON_VALUE()でSQLスカラー値を取得。

json_extract(data, '$.name')

JSON1のjson_extract()を使用。現行SQLiteでは-> / ->>演算子も利用可能。

Category 02

DDL・データ型

自動採番、BOOLEAN、日時型、ALTER TABLE、一時テーブルなどの定義差。

DDL・データ型:PostgreSQL・MySQL・Oracle Database・SQLiteの代表構文比較
やりたいこと PostgreSQL MySQL Oracle DB SQLite
# 連番を自動採番 IDENTITY / AUTO_INCREMENT / ROWID

新規設計では各DBの現行推奨を確認してください。

公式リファレンス
id BIGINT GENERATED BY DEFAULT AS IDENTITY

現行の標準的な方式。SERIALも既存コードで広く利用されています。

id BIGINT AUTO_INCREMENT

AUTO_INCREMENT属性を使用。

id NUMBER GENERATED BY DEFAULT AS IDENTITY

IDENTITY列を使用。SEQUENCEも利用できます。

id INTEGER PRIMARY KEY

ROWIDの別名となり自動採番されます。AUTOINCREMENTは再利用防止が必要な場合のみ。

# 真偽値を保存 BOOLEAN

BOOLEANという名前が同じでも内部表現や対応バージョンが異なります。

公式リファレンス
is_active BOOLEAN

ネイティブBOOLEAN型。

is_active BOOLEAN

BOOLEAN / BOOLはTINYINTへマッピングされます。

is_active BOOLEAN

SQLのBOOLEAN列は23ai以降。古いOracleでは設計を変える必要があります。

is_active INTEGER

独立したBoolean storage classはなく、一般に0/1を使用。TRUE/FALSEは1/0の別表記。

# 可変長文字列を定義 VARCHAR / VARCHAR2 / TEXT

長さ上限や文字数・バイト数の扱いは各DBの仕様を確認してください。

公式リファレンス
name VARCHAR(100)

TEXTもよく利用されます。

name VARCHAR(100)

TEXT系も用途に応じて利用。

name VARCHAR2(100)

OracleではVARCHAR2が代表的。

name TEXT

型親和性に基づく柔軟な型システム。

# 日時を保存 TIMESTAMP / DATETIME

タイムゾーンを保持するかどうかまで含めて型を選びます。

公式リファレンス
created_at TIMESTAMP WITH TIME ZONE

TIMESTAMP WITHOUT TIME ZONEもあります。

created_at DATETIME

TIMESTAMPとの範囲・タイムゾーン変換の違いに注意。

created_at TIMESTAMP WITH TIME ZONE

DATEとTIMESTAMPの意味もMySQL等とは異なります。

created_at TEXT

専用の日時storage classはなく、TEXT / REAL / INTEGERで保存できます。

# カラムを追加 ALTER TABLE ... ADD

Oracleだけ括弧付きの書き方を見かけることが多い項目です。

公式リファレンス
ALTER TABLE users ADD COLUMN age INT;

ADD COLUMNを使用。

ALTER TABLE users ADD COLUMN age INT;

COLUMNは省略可能。

ALTER TABLE users ADD (age NUMBER);

ADD句で列定義を追加。

ALTER TABLE users ADD COLUMN age INTEGER;

SQLiteのALTER TABLEは対応範囲に制限があります。

# カラム名を変更 RENAME COLUMN

現在の主要バージョンでは似た構文ですが、古いバージョンでは差があります。

公式リファレンス
ALTER TABLE users RENAME COLUMN old TO new;

RENAME COLUMNを使用。

ALTER TABLE users RENAME COLUMN old TO new;

MySQL 8.0以降の代表構文。

ALTER TABLE users RENAME COLUMN old TO new;

RENAME COLUMNを使用。

ALTER TABLE users RENAME COLUMN old TO new;

SQLite 3.25.0以降。

# カラムを削除 DROP COLUMN

依存する制約・インデックス等がある場合の制限はRDBMSごとに異なります。

公式リファレンス
ALTER TABLE users DROP COLUMN age;

依存関係に注意。

ALTER TABLE users DROP COLUMN age;

ALTER TABLEで削除。

ALTER TABLE users DROP COLUMN age;

ALTER TABLEで削除。

ALTER TABLE users DROP COLUMN age;

SQLite 3.35.0以降。スキーマ依存関係による制限があります。

# 一時テーブルを作る TEMP / TEMPORARY

スコープや定義の寿命は各RDBMSで異なります。

公式リファレンス
CREATE TEMP TABLE tmp_items (...);

セッションごとの一時テーブル。

CREATE TEMPORARY TABLE tmp_items (...);

セッション終了時に自動削除。

CREATE GLOBAL TEMPORARY TABLE tmp_items (...) ON COMMIT PRESERVE ROWS;

定義は永続、データはセッション/トランザクション単位。

CREATE TEMP TABLE tmp_items (...);

tempスキーマに作成されます。

# 予約語などを識別子として囲う 識別子の引用符

可搬性を高めるなら予約語をオブジェクト名に使わないのが基本です。

公式リファレンス
SELECT "order" FROM sales;

ダブルクォート。未引用識別子は小文字へ折り畳まれます。

SELECT `order` FROM sales;

既定はバッククォート。ANSI_QUOTES有効時はダブルクォートも識別子。

SELECT "order" FROM sales;

ダブルクォート。未引用識別子は大文字として扱われます。

SELECT "order" FROM sales;

ダブルクォート推奨。互換目的で他の引用も受け付けます。

# 計算結果を生成列として定義 GENERATED COLUMN / VIRTUAL / STORED

他の列から計算される列を定義する例。VIRTUAL / STOREDの対応や既定値はRDBMSごとに異なります。

公式リファレンス
total NUMERIC GENERATED ALWAYS AS (price * qty) STORED

PostgreSQL 18ではVIRTUAL / STOREDを選択でき、VIRTUALが既定です。

total DECIMAL(10,2) GENERATED ALWAYS AS (price * qty) STORED

VIRTUAL / STOREDの生成列を利用できます。

total NUMBER GENERATED ALWAYS AS (price * qty) VIRTUAL

仮想列(virtual column)として定義する代表例。

total REAL GENERATED ALWAYS AS (price * qty) STORED

VIRTUAL / STOREDを利用可能。VIRTUALが既定です。

Category 03

DML

UPSERT、RETURNING、TRUNCATEなど、データ更新で差が出やすい構文。

DML:PostgreSQL・MySQL・Oracle Database・SQLiteの代表構文比較
やりたいこと PostgreSQL MySQL Oracle DB SQLite
# 存在すれば更新、なければ追加 UPSERT / MERGE

一意制約に衝突したときの処理を1文で表現する代表例です。

公式リファレンス
INSERT ... ON CONFLICT (id) DO UPDATE SET ...

ON CONFLICTを使用。

INSERT ... ON DUPLICATE KEY UPDATE ...

一意キー/主キー衝突時に更新。

MERGE INTO target USING source ON (...) ...

MERGEで条件に応じて更新/挿入。

INSERT ... ON CONFLICT (id) DO UPDATE SET ...

PostgreSQLに近いUPSERT構文。

# INSERT/UPDATE後の値を受け取る RETURNING

自動採番IDなど、DML直後の値を取得したい場面で差が出ます。

公式リファレンス
INSERT ... RETURNING id;

INSERT / UPDATE / DELETE等でRETURNING。

—

一般的なDML RETURNING句はありません。AUTO_INCREMENT値ならLAST_INSERT_ID()を使用。

INSERT ... RETURNING id INTO :id

RETURNING INTOでバインド変数等へ受け取ります。

INSERT ... RETURNING id;

SQLite 3.35.0以降。PostgreSQLを参考にした構文。

# テーブルの全行を高速に削除 TRUNCATE

DELETEとのトランザクション・ログ・採番リセット等の差にも注意してください。

公式リファレンス
TRUNCATE TABLE items;

TRUNCATE文を使用。

TRUNCATE TABLE items;

TRUNCATE TABLEを使用。

TRUNCATE TABLE items;

DDLとして扱われ、ロールバック不可など重要な特性があります。

DELETE FROM items;

TRUNCATE文はありません。条件なしDELETEにはtruncate optimizationが働く場合があります。

# 重複時はエラーにせず挿入をスキップ DO NOTHING / INSERT IGNORE / MERGE / OR IGNORE

主キー・一意制約の競合時に「更新せず、その行の挿入を見送る」代表的な方法。

公式リファレンス
INSERT INTO users (id, name) VALUES (1, 'Miria') ON CONFLICT DO NOTHING;

ON CONFLICT DO NOTHINGで競合行をスキップ。

INSERT IGNORE INTO users (id, name) VALUES (1, 'Miria');

IGNOREは重複以外の一部エラーも警告化するため挙動確認が必要です。

MERGE INTO users t USING (...) s ON (...) WHEN NOT MATCHED THEN INSERT ...

単純なINSERT IGNORE相当句ではなく、MERGEで未存在時だけINSERTする例。

INSERT OR IGNORE INTO users (id, name) VALUES (1, 'Miria');

OR IGNOREはSQLite独自のON CONFLICT解決アルゴリズム。

Category 04

集合演算・ユーティリティ

EXCEPT / MINUS、DUAL、正規表現、実行計画、シーケンスを比較。

集合演算・ユーティリティ:PostgreSQL・MySQL・Oracle Database・SQLiteの代表構文比較
やりたいこと PostgreSQL MySQL Oracle DB SQLite
# 差集合を求める EXCEPT / MINUS

古い比較記事ではMySQLを「EXCEPT非対応」としている場合があるため、バージョンに注意。

公式リファレンス
SELECT id FROM a EXCEPT SELECT id FROM b;

EXCEPTを使用。

SELECT id FROM a EXCEPT SELECT id FROM b;

MySQL 8.0.31以降でEXCEPTをサポート。

SELECT id FROM a MINUS SELECT id FROM b;

MINUSが広く使われます。現行26aiではEXCEPTも同義語。

SELECT id FROM a EXCEPT SELECT id FROM b;

EXCEPTを使用。

# テーブルなしで式をSELECT FROM省略 / DUAL

定数や現在日時の確認で使う小さな違いです。

公式リファレンス
SELECT 1;

FROM句を省略可能。

SELECT 1;

FROM句を省略可能。

SELECT 1 FROM DUAL;

従来から広く互換性のある書き方。Oracle 23以降は単純SELECTでFROM省略も可能。

SELECT 1;

FROM句を省略可能。

# 正規表現で検索 ~ / REGEXP_LIKE / REGEXP

正規表現エンジンやフラグ指定方法が大きく異なります。

公式リファレンス
name ~ '^[A-Z]'

~ はPOSIX正規表現。~* は大小文字を無視。

REGEXP_LIKE(name, '^[A-Z]')

REGEXP / RLIKE演算子も利用可能。

REGEXP_LIKE(name, '^[A-Z]')

REGEXP_LIKE条件を使用。

name REGEXP '^[A-Z]'

REGEXP構文はありますがregexp()関数は標準ビルドに実装されておらず、通常はアプリ側で追加が必要。

# 実行計画を確認 EXPLAIN

出力形式や実測実行の有無が異なるため、単純な置き換えではありません。

公式リファレンス
EXPLAIN SELECT * FROM items;

EXPLAIN ANALYZEも利用可能。

EXPLAIN SELECT * FROM items;

EXPLAIN ANALYZEも利用可能。

EXPLAIN PLAN FOR SELECT * FROM items;

結果はDBMS_XPLAN.DISPLAY()等で確認します。

EXPLAIN QUERY PLAN SELECT * FROM items;

高レベルのクエリ計画を確認。

# 独立したシーケンスを作る CREATE SEQUENCE

自動採番列とは別に、任意の場面で連番を取り出したい場合の差です。

公式リファレンス
CREATE SEQUENCE order_seq;

nextval('order_seq')等で利用。

—

MySQLにはPostgreSQL/Oracle型の独立したCREATE SEQUENCEはありません。通常はAUTO_INCREMENT等を利用。

CREATE SEQUENCE order_seq;

order_seq.NEXTVAL / CURRVALで利用。

—

独立したCREATE SEQUENCEはありません。INTEGER PRIMARY KEY / ROWID等を利用。

Important Notes

バージョン差が大きいポイント。

01

MySQLのEXCEPT

MySQL 8.0.31以降ではEXCEPTを利用できます。 古い技術記事では「MySQLはEXCEPT非対応」と説明されている場合があるため、対象バージョンを確認してください。

02

OracleのBOOLEAN

SQLのBOOLEAN列はOracle Database 23ai以降で利用できます。 19cなど従来バージョンを対象にする場合は、その前提でデータ設計を確認する必要があります。

03

PostgreSQLの自動採番

SERIALは今も広く見かけますが、新規設計ではSQL標準に近い GENERATED ... AS IDENTITYも確認しておくと移植時に理解しやすくなります。

04

SQLiteの型

SQLiteはPostgreSQLやMySQLとは型システムの考え方が異なります。 BOOLEANや日時を比較するときは、構文だけでなくSQLiteのstorage classと型親和性も確認してください。

Learn by Doing

早見表で確認したら、SQLを書いて確かめる。

Miria SQL Learningでは、SQLiteをベースにしたブラウザ内実行環境とRDBMSごとの方言チェックを使い、 PostgreSQL・MySQL・Oracle・SQLiteの違いを比較しながら学習できます。

※ Miria SQL上で4種類の実DBサーバーを直接動かしているわけではありません。 実運用前には、このページからリンクしている各RDBMSの公式リファレンスも確認してください。

SQL方言の学習を始める

FAQ

SQL方言についてよくある質問

SQL方言とは何ですか?

SQLには標準仕様がありますが、PostgreSQL・MySQL・Oracle Database・SQLiteなどのRDBMSは、 独自の関数・構文・データ型・拡張機能も持っています。この実装ごとの差を一般にSQL方言と呼びます。

同じSQLを4つのRDBMSでそのまま使えますか?

SELECT、WHERE、JOINなど共通性の高い構文は多い一方、件数制限、文字列関数、日付処理、自動採番、 UPSERTなどでは差が出ます。バージョンや設定でも挙動が変わるため、移行時は公式仕様の確認が必要です。

この早見表はどのバージョンを基準にしていますか?

2026年9月4日時点で、PostgreSQL 18、MySQL 8.4 LTS、Oracle Database 26aiを中心に公式ドキュメントを確認しています。 SQLiteは現行公式ドキュメントを参照しています。重要なバージョン差は各項目に注記しています。

Miria SQLではPostgreSQLやOracleそのものをブラウザで実行していますか?

Miria SQLのブラウザ内実行環境はSQLiteをベースにしています。 RDBMS切り替えと方言チェックを使って構文差を学習する設計のため、本番環境で利用するSQLは各製品の公式リファレンスでも確認してください。

Miria SQL Learning

違いを見つけたら、次は書いて覚える。

4つのRDBMSを切り替えながら、SQL方言を比較して学習できます。

インストール不要・ブラウザから開始