SQL フォーマッター
SQLクエリを整形・美化・圧縮。無料、ブラウザ内で処理。
- ブラウザ内で処理
- データはブラウザ外に出ません
- 無料 · 登録不要
WeChat でスキャンしてシェア
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。
日本語のカラム名をそのまま整形する
PostgreSQL のマニュアルは、引用符なしの識別子にラテン文字以外の文字(non-Latin letters)も使えると説明しています(PostgreSQL: Lexical Structure)。そのため 社員番号 のような名前は、引用符なしでもそのまま実行できます。このツールのトークナイザーは、連続する Unicode の文字・数字・_・$ を1つの名前として読むので、日本語の名前は区切られずに残ります。
select 社員番号, 氏名 from 社員 where 部署 = '営業部';
SELECT
社員番号,
氏名
FROM 社員
WHERE 部署 = '営業部';
大文字になるのは SELECT、FROM、WHERE などのキーワードだけです。SQLite 3.49.1(sql.js)で試すと、元の文も整形後の文も実行でき、返る行は同じです。二重引用符で囲んだ名前も、ひとまとまりのまま整形されます。
select "社員番号", "氏名" from "社員" where "部署" = '営業部' order by "社員番号";
SELECT
"社員番号",
"氏名"
FROM "社員"
WHERE "部署" = '営業部'
ORDER BY "社員番号";
全角スペースは半角スペースに変わる
日本語入力をオンにしたまま SQL を打つと、語の区切りに全角スペース(U+3000)が入ることがあります。トークナイザーは全角スペースも空白として扱うので、整形すると語の間は半角スペースや改行になります。文字列の中の全角スペースは変わりません。
SELECT "氏名" FROM "社員" WHERE "部署" = '営業 第一部';
SELECT
"氏名"
FROM "社員"
WHERE "部署" = '営業 第一部';
SQLite 3.49.1 では、元の文は near "SELECT ": syntax error になり、整形後の文は実行できます。ただし、これは整形の副作用です。ほかの SQL クライアントでも同じように動くとは限らないので、全角スペースはエディターの検索で見つけて直すのが確実です。
小文字とスペース4個で整形する
チームのコーディング規約に合わせて、キーワードを小文字、インデントをスペース4個にした例です。二重引用符で囲んだ名前と文字列は、大文字・小文字の設定の影響を受けません。
SELECT "部署", COUNT(*) AS "人数" FROM "社員" GROUP BY "部署" HAVING COUNT(*) >= 3;
select
"部署",
count(*) as "人数"
from "社員"
group by "部署"
having count(*) >= 3;
COUNT は小文字の count になります。大文字・小文字を切り替えるのは、決まった 54 語のキーワードだけです(COUNT、SUM、AVG、MIN、MAX の集計関数を含む)。now() のようなほかの関数名は入力のままです。
サブクエリの例
既定の設定(2 スペースインデント、キーワード大文字)での実際の出力です。括弧内のサブクエリは 1 段深くインデントされます。
select * from users where id in (select user_id from orders where total > 100);
SELECT
*
FROM users
WHERE id IN (
SELECT
user_id
FROM orders
WHERE total > 100
);
制限事項
- 方言は汎用の 1 種類のみで、構文チェックはしません。 MySQL・PostgreSQL・SQL Server などのモードはなく、誤った SQL もエラーなしで整形されます。
- 文字列中のバックスラッシュは2通りの読み方のどちらかで扱います。 MySQL は
NO_BACKSLASH_ESCAPESが無効なとき、文字列中の\'をエスケープされた引用符として読みます(MySQL 8.4 String Literals)。既定のstandard_conforming_strings = onの PostgreSQL(PostgreSQL: Lexical Structure)や SQLite(SQLite: Literal Values)では、バックスラッシュは普通の文字です。このツールは、MySQL の読み方ですべての文字列が閉じるときはその読み方を使い、閉じないときは標準の読み方を使います。select * from users where note = 'It\'s'は圧縮後もSELECT * FROM users WHERE note = 'It\'s'のままで、単独の'C:\'も1つの文字列のままです。文字列の中身は常にそのままコピーし、読み方で決まるのは文字列の終わりの位置だけです。 #と--xの後ろは行末までそのままコピーします。 その行の残りは整形されないので、PostgreSQL の#演算子や SQL Server の#tempテーブル名の後のキーワードは大文字・小文字も位置も変わりません。この部分で次の行まで続く文字列や/* */コメントが始まる場合(MySQL では有効)、結果が元と変わることがあります。CASEは 1 行のままです(AND/ORを除く)。CASE WHEN ... THEN ... ENDはWHENごとに改行されませんが、中のAND・ORはWHEREと同じように改行されます。select case when a = 1 and b = 2 then 'x' else 'y' end as k from tの結果です。
SELECT
CASE WHEN a = 1
AND b = 2 THEN 'x' ELSE 'y' END AS k
FROM t
CREATE TABLEの列定義も 1 行のままです。 列ごとに改行されません。- 圧縮すると
--と/* */のコメントが消え(/*! … */と/*+ … */はそのまま残し、#のコメントと空白なしの--xは残して改行します)、閉じ括弧の後の空白もなくなります(例:SELECT COUNT(*)FROM events)。
FAQ
どのSQL方言に対応していますか?
方言ごとのモードはなく、SELECT・INSERT・UPDATE・DELETE・CREATE TABLE・JOIN・サブクエリ・CTE を汎用の SQL として整形します。よく使われる方言の書き方はそのまま残ります。バッククォートと [角括弧] の名前、N'...'・X'...'・PostgreSQL の E'...' 文字列、$$...$$ のドル引用符で囲んだ文字列、$1・?1・:id・@id・@@session.sql_mode のようなパラメーターと変数です。文字列中のバックスラッシュは、MySQL の読み方ですべての文字列が閉じるときだけエスケープとして扱います。圧縮では -- と空白で始まるコメントと普通の /* */ コメントを削除し、MySQL の /*! */(実行されるコメント)と /*+ */(オプティマイザーヒント)は残します。# のコメント(MySQL)と空白なしの --x はデータベースによって読み方が違うため、行末までそのまま残し、そこで改行します。
SQL の構文チェックはできますか?
できません。整形専用のツールで、構文エラーやテーブル定義との整合は確認しません。誤った SQL もエラーなしで整形されます。
長い複雑なクエリも整形できますか?
JOIN は1つずつ行を分け、サブクエリと WITH ... AS (...) の中身は1段深くインデントします。SUM(total) や ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) のような関数呼び出しは1行のままです。CASE 式は1行のままで(中の AND / OR は改行されます)、CREATE TABLE の列定義も1行のままです(どちらも下の「制限事項」を参照)。
整形オプションはカスタマイズできますか?
インデント(2スペース・4スペース・タブ)とキーワードの大文字・小文字を設定できます。入力中の自動整形は今の設定を使います。設定を変えたあとは「整形」を押すと、今の出力に反映されます。
日本語のカラム名は引用符で囲む必要がありますか?
このツールでは不要です。連続する Unicode の文字・数字・結合文字・_・$ を1つの名前として読むので、社員番号 や 氏名 は区切られずに残り、大文字・小文字が変わるのは 54 語の英語キーワードだけです。引用符なしの日本語名を受け付けるかどうかはデータベース次第で、PostgreSQL はラテン文字以外の文字を、MySQL は U+0080〜U+FFFF の文字を引用符なしの名前に使えます。
データはサーバーに送信されますか?
いいえ。クエリはこのブラウザのタブ内で整形し、サーバーへの送信もブラウザのストレージへの保存もしません。「整形」または「圧縮」を押すと、ページの統計にツール名とその操作が記録されますが、SQL の内容は含みません。