件数制限
LIMIT / FETCH FIRST
LIMIT 10
FETCH FIRST 10 ROWS ONLY
SQL Dialect Cheat Sheet
「これ、別のDBではどう書く?」をすぐ確認。 やりたいことを軸に、4つのRDBMSの代表構文を横並びで比較できます。 実務の確認、DB移行、SQL学習の手元リファレンスとして使える早見表です。
LIMIT 10LIMIT 10FETCH FIRST 10 ROWS ONLYLIMIT 10How to Read
このページは、各RDBMSでよく使われる代表的な構文を比較するための早見表です。 同じ機能でも複数の書き方が存在する場合や、バージョン・SQLモード・照合順序・設定によって挙動が変わる場合があります。
2026年9月4日時点の公式ドキュメントを確認し、 PostgreSQL 18、MySQL 8.4 LTS、Oracle Database 26aiを中心に整理しています。 SQLiteは現行の公式ドキュメントを参照し、バージョン差が重要な項目には注記しています。
Quick Compare
各RDBMSごとの方言(違い)がとくに目立つ代表例です。下の早見表では、さらに28項目を網羅して比較しています。
件数制限
LIMIT 10
FETCH FIRST 10 ROWS ONLY
NULL置換
COALESCE(price, 0)
NVL(price, 0)
自動採番
GENERATED ... AS IDENTITY
AUTO_INCREMENT
差集合
EXCEPT
MINUS
Cheat Sheet
キーワード検索やカテゴリ絞り込みを利用して、目的の構文を探すことができます。コード横の「コピー」ボタンから代表構文をクリップボードに保存できます。
Category 01
取得件数、文字列、NULL、検索、日付演算など、SELECTで頻繁に迷う違い。
| やりたいこと | 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)
|
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
自動採番、BOOLEAN、日時型、ALTER TABLE、一時テーブルなどの定義差。
| やりたいこと | 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
UPSERT、RETURNING、TRUNCATEなど、データ更新で差が出やすい構文。
| やりたいこと | 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 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
MySQL 8.0.31以降ではEXCEPTを利用できます。
古い技術記事では「MySQLはEXCEPT非対応」と説明されている場合があるため、対象バージョンを確認してください。
SQLのBOOLEAN列はOracle Database 23ai以降で利用できます。
19cなど従来バージョンを対象にする場合は、その前提でデータ設計を確認する必要があります。
SERIALは今も広く見かけますが、新規設計ではSQL標準に近い
GENERATED ... AS IDENTITYも確認しておくと移植時に理解しやすくなります。
SQLiteはPostgreSQLやMySQLとは型システムの考え方が異なります。 BOOLEANや日時を比較するときは、構文だけでなくSQLiteのstorage classと型親和性も確認してください。
Learn by Doing
Miria SQL Learningでは、SQLiteをベースにしたブラウザ内実行環境とRDBMSごとの方言チェックを使い、 PostgreSQL・MySQL・Oracle・SQLiteの違いを比較しながら学習できます。
※ Miria SQL上で4種類の実DBサーバーを直接動かしているわけではありません。 実運用前には、このページからリンクしている各RDBMSの公式リファレンスも確認してください。
SQL方言の学習を始めるRelated Guides
早見表だけでは伝えきれない背景や特徴は、各ガイドで解説しています。
FAQ
SQLには標準仕様がありますが、PostgreSQL・MySQL・Oracle Database・SQLiteなどのRDBMSは、 独自の関数・構文・データ型・拡張機能も持っています。この実装ごとの差を一般にSQL方言と呼びます。
SELECT、WHERE、JOINなど共通性の高い構文は多い一方、件数制限、文字列関数、日付処理、自動採番、 UPSERTなどでは差が出ます。バージョンや設定でも挙動が変わるため、移行時は公式仕様の確認が必要です。
2026年9月4日時点で、PostgreSQL 18、MySQL 8.4 LTS、Oracle Database 26aiを中心に公式ドキュメントを確認しています。 SQLiteは現行公式ドキュメントを参照しています。重要なバージョン差は各項目に注記しています。
Miria SQLのブラウザ内実行環境はSQLiteをベースにしています。 RDBMS切り替えと方言チェックを使って構文差を学習する設計のため、本番環境で利用するSQLは各製品の公式リファレンスでも確認してください。
Miria SQL Learning
4つのRDBMSを切り替えながら、SQL方言を比較して学習できます。
インストール不要・ブラウザから開始