コンテンツにスキップ

SQLフォーマッター&バリデーター - オンラインで無料SQLクエリを整形

このSQLフォーマッター&バリデーターは、SQLキーワードを大文字化し、適切な改行とインデントを自動で加えてクエリを整形する無料オンラインツール。閉じ忘れた引用符や、ON条件のないJOINといった構文エラーもその場で検出できる。MySQL、PostgreSQL、SQL Server、Oracleの各方言に対応している。

SQLフォーマッター & バリデーター

自動インデント、キーワード大文字化、構文エラー検出を使用してSQLクエリをフォーマットおよび検証します。

フォーマットされた結果を表示するには、SQLクエリを入力してください。
ローディング計算機...
📚

ドキュメンテーション

SQLフォーマッターとバリデーターとは?

SQLフォーマッターは、SQLクエリの空白、改行、キーワードの大文字表記を統一して書き換え、読みやすくするツールです。SQLバリデーターは、データベースに接続せず、閉じられていない引用符や不足している括弧など、同じクエリの構造上の誤りを確認します。このツールはその両方を行います。処理はすべてブラウザー内で実行されるため、クエリのテキストがサーバーに送信されることはありません。

SQLクエリを整形する方法

  1. 入力ボックスにSQLクエリを貼り付けるか入力します。
  2. 整形後のバージョンが右側に自動的に表示され、押すボタンはありません。
  3. バリデーションエラーは出力の下に一覧表示されます。
  4. コピーを押すと、整形後のクエリがクリップボードに送られます。

SQLの整形ルール

キーワードの大文字化

フォーマッターは、文字列や引用符で囲まれた識別子の内部ではない場所にあるSQLキーワードについて、あらかじめ定めた一覧に含まれるものを大文字にします。一覧には主な句(SELECT、FROM、WHERE、GROUP BY、ORDER BY、HAVING、LIMIT、OFFSET)、結合に使う語(JOIN、LEFT、RIGHT、INNER、OUTER、FULL、CROSS、NATURAL、ON、USING)、集合演算子(UNION、INTERSECT、EXCEPT)、文の種類(INSERT、UPDATE、DELETE、CREATE、ALTER、DROP)、一般的な演算子と接続語(AND、OR、NOT、IN、BETWEEN、LIKE、AS、CASE、WHEN、THEN、ELSE、END、ALL、DISTINCT、VALUES、SETなど)が含まれます。

キーワードのように見える語の一部は、入力されたままになります。COUNT、SUM、AVGなどの集計関数は一覧に含まれないため、count(*)を小文字で入力した場合は小文字のままです。並べ替え方向を示す語のASCとDESC、単独で使われるリテラルのTRUE、FALSE、NULLも変更されません。文字列リテラル('...')、引用符付き識別子("..."、`...`、[...])、コメント内のテキストは、何が含まれていても変更されません。

改行とインデント

主な句はそれぞれ左端から新しい行で始まります。対象はSELECT、FROM、WHERE、GROUP BY、ORDER BY、HAVING、LIMIT、OFFSETです。結合は1つの単位として新しい行から始まるため、LEFT JOIN、FULL OUTER JOIN、CROSS JOINは2行に分割されず、まとまったままになります。UNIONとUNION ALLの上下には空行が入り、結合するクエリが分けられます。CASEとENDは新しい行から始まり、WHEN、THEN、ELSEはインデントされた行から始まります。すべてのコンマも新しい行を開始するため、SELECTやGROUP BYの列一覧は1行に1列ずつ表示されます。

インデントが入るのは括弧の内側だけです。サブクエリやグループ化された式の内側では、入れ子の階層ごとに半角スペース2つ分インデントされます。括弧のないクエリ(普段使われるクエリの大半)は、すべての句が左端に揃い、インデントなしで整形されます。

例:整形前と整形後

整形前:

1select id, first_name, last_name, email from customers where status = 'active' order by last_name, first_name;
2

整形後:

1SELECT id,
2first_name,
3last_name,
4email
5FROM customers
6WHERE status = 'active'
7ORDER BY last_name,
8first_name;
9

すべてのキーワードが大文字になり、すべての句と列がそれぞれ独立した行に置かれます。クエリに括弧がないため、インデントされた行はありません。

括弧があると変わります。より大きなクエリの一部として(select count(*) from employees e where e.department_id = d.id)を整形すると、内部のSELECT、FROM、WHEREは2つのスペース分インデントされます。また、countは一覧にあるキーワードではなく関数名なので、小文字のままです。

SQLバリデーターが確認する内容

バリデーターは、データベースに接続せずに構造上の問題を探します。

  • 閉じられていない引用符、角括弧、コメント。 開始したものの閉じられていない単一引用符(')、二重引用符(")、バッククォート(`)、角括弧([)、ブロックコメント(/*)。
  • 対応する括弧がない。 文字列とコメントの外側にある(と)の数が一致していなければなりません。
  • 括弧のないサブクエリ。 SELECT * FROM SELECT id FROM tのように、括弧の外側にある2つ目のSELECT。集合演算子(UNION、UNION ALL、INTERSECT、EXCEPT)で結合された2つのクエリは、各オペランドに括弧が不要なため検出されません。セミコロンで区切られた2つの文も同様です。
  • WHEREがANDまたはORで始まる。 その前に何もない状態で接続語が先頭に置かれています。
  • 対応する条件のないJOIN。 JOINにはON句またはUSING句が必要です。CROSS JOINとNATURAL JOINは条件を取らないため対象外です。
  • 空のGROUP BYまたはORDER BY。 クエリの末尾で、句のキーワードの後に列がありません。
  • 不完全なWHERE条件。 値のないWHERE status =のような未完了の比較、またはクエリ末尾で後続の内容がない単独のWHERE。
  • FROMのないSELECT。 選択リストが単純な列名だけの場合に限り検出されます。式、関数呼び出し、リテラル、CURRENT_DATEのように括弧なしで記述した値関数は単独でも有効なため、SELECT 1 + 1とSELECT CURRENT_DATEは検出されません。
  • 句の順序。 具体的には、GROUP BYがWHEREより前にあってはならず、ORDER BYがGROUP BYより前にあってはなりません。サブクエリ内は無視し、クエリの最上位だけを確認します。

確認しない内容

バリデーターは、テーブルや列が実際に存在するか、結合した列の型に互換性があるか、クエリがどのように実行されるかを判定しません。また、実際のデータベースが適用するすべての規則を検出するわけでもありません。例として、GROUP BYなしでHAVINGを使うことは、結果全体を暗黙の1グループにまとめる合法なSQLであるため受け入れられ、バリデーターはエラーを出しません。同様に、SELECTリスト内の集計されていないすべての列がGROUP BYにも現れるかどうかも確認しません。この規則は多くのデータベースに存在しますが、このツールは検査しません。末尾のセミコロンがないことも検出されません。セミコロンは文の区切り記号であり、単一のクエリの一部ではないためです。

例:バリデーターが検出するエラー

1SELECT id FROM orders
2JOIN users
3WHERE status =
4

このクエリでは2つのエラーが発生します。

  1. 「1つ以上のJOIN文にON条件がありません。」 — JOIN usersにON句もUSING句もありません。
  2. 「WHERE条件が不完全です。」 — status =の等号の後に値がありません。

よくある質問

このツールはMySQL、PostgreSQL、SQL Server、Oracleで動作しますか?

これらのデータベースで共通するSQLの基本構文、つまりSELECT、JOIN、WHERE、GROUP BYなどの句を処理できます。PostgreSQLの配列リテラルやT-SQLの手続き型ブロックなど、データベース固有の構文でもフォーマッターが壊れることはありませんが、特別な処理は行われない場合があります。

SQLクエリはサーバーに送信されますか?

いいえ。整形とバリデーションはどちらもブラウザー内で実行されます。クエリのテキストがどこかに送信されることはありません。

COUNT、SUM、AVGなどの関数名も大文字になりますか?

いいえ。大文字になるのは句のキーワード、結合に使う語、あらかじめ定めた一覧にある演算子だけです。count、sum、avgなどの関数名と、asc、desc、true、false、nullという語は、入力されたまま変更されません。

GROUP BYなしで使われたHAVINGをバリデーターは検出しますか?

いいえ。GROUP BYなしのHAVING句は結果全体を1つのグループにまとめます。これはISO/IEC9075規格において有効なSQLであるため、バリデーターはエラーとして扱いません。

バリデーターはSQLのすべての誤りを検出できますか?

いいえ。括弧、引用符、いくつかの句の順序規則、条件のないJOINのような一般的な論理上の不足を確認しますが、テーブル名や列名、データ型、クエリのパフォーマンスは確認しません。クエリが正しく実行されることを確認するには、実際のデータベース接続が必要です。

整形によってクエリの実行方法は変わりますか?

いいえ。整形によって変わるのは空白と、引用符で囲まれていないキーワードの大文字表記だけです。文字列、引用符付き識別子、コメントの内部はそのままコピーされるため、クエリの意味は整形前とまったく変わりません。

参考文献