SQL整形

SQL整形では主要な句を1行ずつに分けます。たとえば「select a from t where x=1」は3行になります: 「SELECT a」、「FROM t」、「WHERE x = 1」。

問題は解決しましたか?
Googleで優先表示

使い方

  1. 入力欄にSQLを貼り付けます。結果がわかるようにサンプルのクエリが入っています。
  2. キーワードを大文字、小文字、入力のままのどれにするかを選び、インデントをスペース2つ、4つ、タブから選びます。
  3. 整形済みのクエリを結果欄からコピーします。入力に合わせて更新され、セミコロンで区切った複数の文もまとめて整形できます。

計算方法

SQLを単語、数値、文字列リテラル、引用符付きの識別子、コメント、演算子、括弧のトークンに分けます。引用符の中身とコメントは一切変更しません。

SELECT、FROM、WHERE、GROUP BY、ORDER BY、HAVING、LIMIT、UNION、INSERT INTO、VALUES、UPDATE、SETと各種JOINは新しい行から始めます。SELECTやSETの項目が2つ以上あれば、1項目ずつインデントした行に置きます。WHERE、HAVING、ONの中のANDとORは句の下に1段下げます。ただしBETWEEN x AND yのANDは除きます。

サブクエリを開く括弧で新しいインデントのブロックが始まり、閉じ括弧で元の深さに戻ります。CASE式はWHENとELSEを1行ずつに分けます。関数呼び出しは括弧を名前に付けたままにするので、COUNT(*)は崩れません。

キーワードとよく使う関数名は選んだ大文字・小文字に揃えます。テーブル名と列名は書いたままですが、keyやindexのようにキーワードと同じ名前の列も変換されます。SQLの文法チェックはせず、特定の方言にも依存しないため、珍しい構文は少し違う空け方になることがあります。

改行が入る位置

要素レイアウト
SELECT, FROM, WHERE, GROUP BY, ORDER BY, HAVING, LIMIT今のインデントで改行
JOIN, LEFT JOIN, INNER JOIN などの結合改行し、ON以降の条件は同じ行
WHERE, HAVING, ON の中の AND, OR改行して1段深く
項目が2つ以上のSELECTリスト1項目1行
括弧内のサブクエリインデントしたブロック
CASE ... WHEN ... ENDWHENごとに1行
セミコロン次の文の前に空行

よくある質問

整形でクエリの動作が変わりませんか?

変わりません。変えるのは空白、改行、キーワードの大文字・小文字だけです。文字列、コメント、引用符付きの識別子はそのまま残ります。心配なら整形後のクエリを一度実行して確かめてください。

どのデータベースに対応していますか?

特定の方言には縛られません。標準SQL、MySQL、PostgreSQL、SQLite風のクエリを扱えます。バッククォート、ダブルクォートの名前、::によるキャスト、$1や:nameのプレースホルダーも大丈夫です。ストアドプロシージャ本体のような製品固有のブロックはきれいに並ばない場合があります。

SELECTの項目が1つだと改行されないのはなぜ?

項目が1つなら改行しても読みやすくならないからです。2つ以上あるときは1項目1行にします。

閉じていない、という警告の意味は?

引用符かブロックコメントが開いたまま閉じていません。そこから後ろはすべて文字列かコメントの一部として扱われるので、引用符の閉じ忘れがないか確認してください。

SQLはどこかに送信されますか?

いいえ。整形はブラウザ内で行うので、テーブル名やデータを含むクエリも端末から出ません。