コマンド道場

SQL 方言の違い

SQL の方言とは、標準 SQL(ISO/IEC 9075)をもとに各データベース製品が独自の拡張や省略を加えた結果生まれた、製品ごとの書き方の違いのことです。このページでは、その違いを構文ごとに一覧にしています。

基本構文は製品をまたいでほとんど同じです。主要 7 製品で調べた 95 構文のうち、書き方が分かれたのは 34 構文だけでした。残る 61 構文では差が見つかっていません(うち 21 構文は全製品で確認済み、40 構文は未確認の製品が残っています)。差が出るのは件数制限・文字列連結・結合の一部など、範囲の限られた部分です。

この表は推測ではありません。PostgreSQL 18.3 / MySQL 8.4 / MariaDB 11.8 / SQLite 3.53 は実際にコンテナを起動して同じ SQL を流した結果です(2026-10-26 実施)。SQL Server(2026-08-03 確認) / Oracle Database(2026-09-07 確認) / IBM Db2 は各社の公式ドキュメントで確認した値です。表では文献と付けて区別しています。

この表が示すのは「その書き方がそのまま通るか(エラーにならず、同じ意味で動くか)」だけです。処理速度などの性能は測っていませんし、比較もしていません。SQL Server・Oracle Database・IBM Db2 の差の理由は各社の公式ドキュメントに基づいて書いており、これらのソフトウェアが出力したエラーメッセージは掲載していません。

対応表(95 構文 × 7 製品)

構文PostgreSQL18.3MySQL8.4MariaDB11.8SQLite3.53SQL Server文献Oracle Database文献IBM Db2文献
LIMIT n○○○○×××
FETCH FIRST n ROWS ONLY○×○××○○
OFFSET n ROWS FETCH NEXT n ROWS ONLY○×○×○○○
TOP n××××○××
JOIN ... USING (列)○○○○×○○
FULL OUTER JOIN○××○○○○
|| による文字列連結○××○×○○
LENGTH(文字数)○○○○×○-
round(x)(引数 1 つ)○○○○×○×
WITH RECURSIVE(再帰)○○○○××-
DATE 'YYYY-MM-DD' の日付リテラル○○○××○○
EXTRACT(日付の一部を取り出す)○○○××○-
ORDER BY ... NULLS LAST○××○×○○
text 型の列○○○○○×-
問い合わせの結果から表を作る(CREATE TABLE ... AS SELECT)○○○○×--
TO_CHAR(書式を指定して文字列にする)○×○××○-
GENERATE_SERIES(連番を行として作る)○××○○--
集約関数の FILTER (WHERE …)○××○×--
AGE(2 つの日付の差を年・月・日で)○×××××-
ARRAY_AGG(値を配列にまとめる)○×××××-
CAST(値 AS integer)(整数への型変換)○×○○○○-
CEIL / FLOOR(切り上げ・切り下げ)○○○○×○-
DATE_TRUNC(月や年の初めに切り捨てる)○×××××-
GREATEST / LEAST(いちばん大きい・小さい値)○○○×○○-
LPAD / RPAD(指定の長さまで埋める)○○○××○-
MOD(割り算の余り)○○○○×○-
NTH_VALUE(並びの n 番目の値)○○○○×○-
POSITION(探す文字列 IN 対象)○○○×××-
REGEXP_REPLACE(正規表現で置き換え)○×××××-
SPLIT_PART(区切り文字で分けた n 番目)○×××××-
STRING_AGG(文字列をつなげてまとめる)○××○○×-
SUBSTRING(文字列 FROM 開始 FOR 長さ)○○○×××-
TRUNC(小数を切り捨てる)○××○×○-
値::型(PostgreSQL 独自の型変換の書き方)○×××××-
不等号 <>○○○○○○-
AND / OR / NOT と括弧○○○○○○-
IN(値の並び)○○○○○○-
BETWEEN○○○○○○-
LIKE○○○○○○-
COUNT(DISTINCT 列)○○○○○○-
IN(副問い合わせ)○○○○○○-
EXISTS / NOT EXISTS○○○○○○-
FROM の中の副問い合わせ(派生表)○○○○○○-
UNION○○○○○○-
UNION ALL○○○○○○-
INTERSECT○○○○○○-
EXCEPT○○○○○○-
NULLIF○○○○○○-
UPPER / LOWER○○○○○○-
ウィンドウ関数の PARTITION BY○○○○○○-
集約関数の OVER(累計など)○○○○○○-
INSERT ... VALUES○○○○○○-
DELETE ... WHERE○○○○○○-
列と型を指定した CREATE TABLE○○○○○--
CREATE TABLE の PRIMARY KEY○○○○○--
列の NOT NULL○○○○○--
列の DEFAULT○○○○○--
列の REFERENCES(外部キー)○○○○○--
列の UNIQUE(一意制約)○○○○○--
列の CHECK(検査制約)○○○○○--
名前を付けた制約(CONSTRAINT 名 …)○○○○○--
外部キーの ON DELETE CASCADE○○○○○--
外部キーの ON DELETE SET NULL○○○○○--
LAG / LEAD(前後の行の値)○○○○○--
ウィンドウの枠指定(ROWS BETWEEN …)○○○○○--
ABS(絶対値)○○○○○○-
AVG(平均)○○○○○○-
MAX / MIN(最大・最小)○○○○○○-
NTILE(n 等分した番号)○○○○○○-
PERCENT_RANK / CUME_DIST(順位の割合)○○○○○○-
POWER(累乗)○○○○○○-
REPLACE(文字列の置き換え)○○○○○○-
SUM(合計)○○○○○○-
TRIM(前後の空白を取る)○○○○○○-
列を指定した SELECT○○○○○○○
WHERE と比較演算子○○○○○○○
DISTINCT○○○○○○○
ORDER BY(複数条件・DESC)○○○○○○○
IS NULL / IS NOT NULL○○○○○○○
count(*)○○○○○○○
count(列)(NULL を数えない)○○○○○○○
GROUP BY○○○○○○○
HAVING○○○○○○○
JOIN ... ON○○○○○○○
LEFT OUTER JOIN○○○○○○○
RIGHT OUTER JOIN○○○○○○○
CROSS JOIN○○○○○○○
スカラー副問い合わせ○○○○○○○
CASE 式○○○○○○○
COALESCE○○○○○○○
CONCAT()○○○○○○○
round(x, n)(引数 2 つ)○○○○○○○
ウィンドウ関数 rank() OVER○○○○○○○
WITH 句(CTE)○○○○○○○
UPDATE ... SET ... WHERE○○○○○○○

○ = そのまま通る/× = そのままでは使えない(エラーになる、またはエラーにならずに別の意味で動く)/- = まだ確認していません。差が出るものを上に並べています。× に触れると、その製品での書き方や理由が出ます。

通るが結果が変わるもの

エラーにならず黙って違う結果を返すため、方言の中でもっとも危険な部類です。

項目PostgreSQLMySQLMariaDBSQLiteSQL ServerOracle DatabaseIBM Db2
GROUP BY に無い列を SELECT するとエラーになるかエラーになる(厳格)エラーになる(厳格)通る(どの行の値が返るかは決まっていない)通る(どの行の値が返るかは決まっていない)エラーになる(厳格)エラーになる(厳格)エラーになる(厳格)
文字列比較が大文字小文字を区別するか区別する区別しない(既定の照合順序)区別しない(既定の照合順序)区別する照合順序に従う(既定は大文字小文字を区別しない)区別する区別する
空文字を NULL として扱うか'' は NULL ではない'' は NULL ではない'' は NULL ではない'' は NULL ではない'' は NULL ではない'' を NULL として扱う'' は NULL ではない
NOT IN の右側に NULL があるとき1 行も返らない1 行も返らない1 行も返らない1 行も返らないNOT IN の右側に NULL があると 1 行も返らない——

この表の書き方を、このサイトで試せますか

上の表で PostgreSQL の列に ○ が付いている書き方なら、そのまま試せます。練習問題と自由入力では本物のデータベースが 1 つ動いているためです(PostgreSQL 本体)。打ち込んだ SQL をサーバーへ送らない設計なので、ブラウザの中だけで動くエンジンに限られます。

そのため、他の製品にしかない書き方はこの画面では通りません。
たとえば SQL Server の SELECT TOP 3 や、Oracle の ROWNUM をここで打ってもエラーになります。この表と各問題の注記に、その製品での書き方を載せていますので、手元の環境ではそちらを使ってください。

そのため練習問題は標準 SQL 中心で作り、各問題に「どの製品でそのまま通るか」をこの表から導いて表示しています。 Oracle 固有の構文を実際に打って確かめたいときは、Oracle 公式のLive SQL(無料・ブラウザから使えます)が便利です。

根拠(一次情報)

実際に打って確かめる → SQL 練習問題