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.4 | MySQL8.4 | MariaDB11.8 | SQLite3.53 | SQL Server2022 | 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 | ○ | × | × | ○ | × | ○ | ○ |
| 不等号 <> | ○ | ○ | ○ | ○ | ○ | ○ | - |
| 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 | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
○ = そのまま通る/× = 通らない(別の書き方が必要)/- = まだ確認していません。 差が出るものを上に並べています。× に触れると、その製品での書き方が出ます。
通るが結果が変わるもの
エラーにならず黙って違う結果を返すため、方言の中でもっとも危険な部類です。
| 項目 | PostgreSQL | MySQL | MariaDB | SQLite | SQL Server | Oracle Database | IBM Db2 |
|---|---|---|---|---|---|---|---|
| GROUP BY に無い列を SELECT するとエラーになるか | 非集約列を SELECT に書くとエラー(厳格) | 非集約列を SELECT に書くとエラー(8.0 以降は既定で厳格) | 非集約列を SELECT に書いても通る(緩い) | 非集約列を SELECT に書いても通る(緩い) | 非集約列を SELECT に書くとエラーになる(厳格) | エラーになる(厳格) | エラーになる(厳格) |
| 文字列比較が大文字小文字を区別するか | sensitive | insensitive | insensitive | sensitive | 照合順序に従う(既定は大文字小文字を区別しない) | sensitive | sensitive |
| 空文字を NULL として扱うか | empty_is_not_null | empty_is_not_null | empty_is_not_null | empty_is_not_null | '' は NULL ではない | empty_is_null | empty_is_not_null |
| NOT IN の右側に NULL があるとき | no_rows | no_rows | no_rows | no_rows | NOT IN の右側に NULL があると 1 行も返らない | — | — |
この表の書き方を、このサイトで試せますか
上の表で PostgreSQL の列に ○ が付いている書き方なら、そのまま試せます。練習問題と自由入力では本物のデータベースが 1 つ動いているためです(PostgreSQL 本体)。打ち込んだ SQL をサーバーへ送らない設計なので、ブラウザの中だけで動くエンジンに限られます。
そのため、他の製品にしかない書き方はこの画面では通りません。
たとえば SQL Server の SELECT TOP 3 や、Oracle の ROWNUM をここで打ってもエラーになります。この表と各問題の注記に、その製品での書き方を載せていますので、手元の環境ではそちらを使ってください。
そのため練習問題は標準 SQL 中心で作り、各問題に 「どの製品でそのまま通るか」をこの表から導いて表示しています。 Oracle 固有の構文を実際に打って確かめたいときは、Oracle 公式のLive SQL(無料・ブラウザから使えます)が便利です。