コマンド道場

SQL 方言の違い

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

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

この表が示すのは「その書き方がそのまま通るか」だけです。処理速度などの性能は測っていませんし、比較もしていません。 差の理由は各製品の公式ドキュメントに基づいて記述しており、 ソフトウェアが出力したエラーメッセージそのものは掲載していません。

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

構文PostgreSQL18.4MySQL8.4MariaDB11.8SQLite3.53SQL Server2022Oracle 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×××
不等号 <>
AND / OR / NOT と括弧
IN(値の並び)
BETWEEN
LIKE
COUNT(DISTINCT 列)
IN(副問い合わせ)
EXISTS / NOT EXISTS
FROM の中の副問い合わせ(派生表)
UNION
UNION ALL
INTERSECT
EXCEPT
UPPER / LOWER
ウィンドウ関数の PARTITION BY
集約関数の OVER(累計など)
INSERT ... VALUES
DELETE ... WHERE
列を指定した 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 するとエラーになるか非集約列を SELECT に書くとエラー(厳格)非集約列を SELECT に書くとエラー(8.0 以降は既定で厳格)非集約列を SELECT に書いても通る(緩い)非集約列を SELECT に書いても通る(緩い)非集約列を SELECT に書くとエラーになる(厳格)エラーになる(厳格)エラーになる(厳格)
文字列比較が大文字小文字を区別するかsensitiveinsensitiveinsensitivesensitive照合順序に従う(既定は大文字小文字を区別しない)sensitivesensitive
空文字を NULL として扱うかempty_is_not_nullempty_is_not_nullempty_is_not_nullempty_is_not_null'' は NULL ではないempty_is_nullempty_is_not_null
NOT IN の右側に NULL があるときno_rowsno_rowsno_rowsno_rowsNOT IN の右側に NULL があると 1 行も返らない

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

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

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

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

根拠(一次情報)

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