SQLフォーマッター&バリデーター - オンラインで無料SQLクエリを整形
このSQLフォーマッター&バリデーターは、SQLキーワードを大文字化し、適切な改行とインデントを自動で加えてクエリを整形する無料オンラインツール。閉じ忘れた引用符や、ON条件のないJOINといった構文エラーもその場で検出できる。MySQL、PostgreSQL、SQL Server、Oracleの各方言に対応している。
SQLフォーマッター & バリデーター
自動インデント、キーワード大文字化、構文エラー検出を使用してSQLクエリをフォーマットおよび検証します。
ドキュメンテーション
SQLフォーマッターとバリデーターとは?
SQLフォーマッターは、SQLクエリの空白、改行、キーワードの大文字表記を統一して書き換え、読みやすくするツールです。SQLバリデーターは、データベースに接続せず、閉じられていない引用符や不足している括弧など、同じクエリの構造上の誤りを確認します。このツールはその両方を行います。処理はすべてブラウザー内で実行されるため、クエリのテキストがサーバーに送信されることはありません。
SQLクエリを整形する方法
- 入力ボックスにSQLクエリを貼り付けるか入力します。
- 整形後のバージョンが右側に自動的に表示され、押すボタンはありません。
- バリデーションエラーは出力の下に一覧表示されます。
- コピーを押すと、整形後のクエリがクリップボードに送られます。
SQLの整形ルール
キーワードの大文字化
フォーマッターは、固定されたSQLキーワードの一覧を、文字列や引用符付き識別子の外にあるものについて大文字にします。SQLのキーワードは大文字と小文字を区別しないため、これはクエリの見た目を変えますが、動作は変えません。一覧には、主要な句(SELECT、FROM、WHERE、GROUP BY、ORDER BY、HAVING、LIMIT、OFFSET)、結合に関する語(JOIN、LEFT、RIGHT、INNER、OUTER、FULL、ON)、文の種類(INSERT、UPDATE、DELETE、CREATE、ALTER、DROP)、および一般的な演算子と接続語(AND、OR、NOT、IN、BETWEEN、LIKE、AS、CASE、WHEN、THEN、ELSE、END、UNION、DISTINCT、VALUES、SET、そのほかいくつか)が含まれます。
キーワードに見えても、入力したままにする語があります。COUNT、SUM、AVGなどの集計関数は一覧に含まれないため、count(*)は小文字で入力した場合、小文字のままです。並べ替えの方向を示す語ASCとDESC、および単独のリテラルTRUE、FALSE、NULLも変更されません。文字列リテラル('...')、引用符付き識別子("..."、MySQLのバッククォート`...`、またはSQL Serverの角括弧[...])、コメントの内部にあるテキストは、内容にかかわらず変更されません。
改行とインデント
各主要句は、新しい行の左端から始まります。対象はSELECT、FROM、WHERE、GROUP BY、ORDER BY、HAVING、LIMIT、OFFSETです。JOIN(およびLEFT JOINのような派生形)も新しい行から始まります。CASE、WHEN、THEN、ELSE、ENDはそれぞれ新しい行から始まり、UNION(または、一行にまとめて扱うUNION ALL)は空行で区切られます。カンマごとにも改行されるため、SELECTやGROUP BYの列リストは、一列につき一行になります。
インデントは括弧の内側にのみ現れます。サブクエリやグループ化された式の内部は、入れ子の段階ごとに二つのスペース分インデントされます。括弧のないクエリは、すべての句が左端にそろえて整形され、インデントはまったくありません。
例:整形前と整形後
整形前:
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パターンの内側に入れ子になったSELECTが、( )で囲まれていない場合です。 WHEREがANDまたはORで始まる。 その前に何もない状態で接続語が先頭に置かれています。- 対応する条件のない
JOIN。JOINにはON句またはUSING句が必要です。CROSS JOINとNATURAL JOINは条件を取らないため対象外です。 - 空の
GROUP BYまたはORDER BY。 クエリの末尾で、句のキーワードの後に列がありません。 - 不完全な
WHERE条件。 値のないWHERE status =のような未完了の比較、またはクエリ末尾で後続の内容がない単独のWHERE。 FROMのないSELECT。 選択リストが単なる列名の場合にのみ警告されます。SELECTの後ろの式、関数呼び出し、リテラルはそれだけで有効なため、警告されません。- 句の順序。 具体的には、
GROUP BYがWHEREより前にあってはならず、ORDER BYがGROUP BYより前にあってはなりません。サブクエリ内は無視し、クエリの最上位だけを確認します。
確認しない内容
バリデーターは、テーブルや列が実際に存在するか、結合された列の型に互換性があるか、クエリの性能がどうなるかを判断しません。実際のデータベースが適用するすべての規則を警告するわけでもありません。例を二つ挙げます。GROUP BYなしで使われたHAVINGは受け入れられます。HAVINGがあるとクエリはグループ化クエリになるため、GROUP BYがなくても、バリデーターはエラーを出しません。同様に、SELECTリスト内の集計されていない列がすべてGROUP BYにも含まれているかどうかは確認しません。多くのデータベースはこの規則を適用しますが、このツールは検査しません。末尾のセミコロンがなくても警告されません。セミコロンは文の区切りであり、単一のクエリの一部ではないためです。
例:バリデーターが検出するエラー
1SELECT id FROM orders
2JOIN users
3WHERE status =
4このクエリでは2つのエラーが発生します。
- 「JOIN文の一つ以上にON条件がありません。」
JOIN usersには、ON句もUSING句もありません。 - 「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句は、結果全体を一つのグループにまとめます。これは有効なSQLであるため、バリデーターはエラーとして扱いません。
バリデーターはSQLのすべての誤りを検出できますか?
いいえ。検査するのは構造で、括弧、引用符、いくつかの句の順序の規則、および条件のないJOINのような一般的な論理上の抜けです。テーブル名や列名、データ型、クエリの性能は検査しません。クエリが正しく実行されるかを確認するには、実際のデータベース接続が必要です。
整形によってクエリの実行方法は変わりますか?
いいえ。整形によって変わるのは空白と、引用符で囲まれていないキーワードの大文字表記だけです。文字列、引用符付き識別子、コメントの内部はそのままコピーされるため、クエリの意味は整形前とまったく変わりません。
参考文献
- PostgreSQL Global Development Group。Lexical Structure。postgresql.org — キーワードは大文字と小文字を区別しない。
- Oracle。MySQL 8.0 Reference Manual: Schema Object Names。dev.mysql.com — バッククォートはMySQLの識別子の引用符文字である。
- Microsoft。Database Identifiers。learn.microsoft.com — SQL Serverの区切り識別子は、角括弧または二重引用符を使う。
- PostgreSQL Global Development Group。SELECT。postgresql.org — HAVINGがあると、GROUP BYがなくてもクエリはグループ化クエリになる。