MySQL SQL フォーマッター
MySQL のクエリを貼り付けてください。アプリケーションログからコピーして ? プレースホルダーが残ったままのものでも構いません。読みやすく一貫して整形された SQL が得られます。バッククォートで囲まれた識別子や MySQL 固有の関数も保持されます。
MySQL のクエリ、整形前と整形後
下の未整形のクエリは、上のエディタに読み込まれているサンプルそのものです。出力はデフォルト設定でこのフォーマッターが返す内容そのままで、手作業で整えた箇所はありません。
SELECT `u`.`id`, `u`.`name`, count(o.id) AS orders, sum(o.total) AS revenue FROM `users` `u` LEFT JOIN `orders` `o` ON o.user_id = u.id WHERE u.created_at >= ? AND u.status = ? AND o.region IN (?) GROUP BY u.id, u.name HAVING sum(o.total) > ? ORDER BY revenue DESC LIMIT 50 SELECT
`u`.`id`,
`u`.`name`,
count(o.id) AS orders,
sum(o.total) AS revenue
FROM
`users` `u`
LEFT JOIN `orders` `o` ON o.user_id = u.id
WHERE
u.created_at >= ?
AND u.status = ?
AND o.region IN (?)
GROUP BY
u.id,
u.name
HAVING
sum(o.total) > ?
ORDER BY
revenue DESC
LIMIT
50 対応している MySQL の構文
汎用のフォーマッターは方言固有の構文を壊すか、そもそも受け付けません。ここに挙げるのは、このフォーマッターがテストで確認している MySQL の構文です。
? 位置指定プレースホルダーは、隣接する列と演算子でグループ化されるため、2 回比較される列も入力は一度で済みます。
`identifier` バッククォートで囲まれた識別子は引用符と大文字小文字をそのまま保ちます。
ON DUPLICATE KEY UPDATE MySQL 固有のステートメント句は、不透明な塊として素通しにするのではなく整形されます。
STRAIGHT_JOIN MySQL の結合ヒントとインデックスヒントはその場に保持されます。
MySQL フォーマッターのよくある質問
ログからコピーした ? プレースホルダー付きのクエリをそのまま貼り付けられますか?
はい。それが典型的な使い方です。? プレースホルダーは検出され、比較対象の列でグループ化されるので、繰り返し登場する列も一度入力すれば済みます。その後、出力を値入り SQL に切り替えれば実行可能なクエリになります。
MariaDB でも使えますか?
はい。MariaDB 固有のキーワードが必要な場合は方言リストから MariaDB を選んでください。共通の構文であれば MySQL でカバーできます。
バッククォートで囲んだ識別子の大文字小文字は保たれますか?
はい。キーワードの大文字小文字と識別子の大文字小文字は別々のオプションです。SELECT や JOIN を大文字にしつつ、userProfile のような列名はキャメルケースのまま保てます。MySQL ではテーブル名の大文字小文字の区別がサーバのファイルシステムに依存するため、この点は他より重要です。
MySQL のクエリを 1 行に最小化できますか?
はい。最小化はアプリケーションのコードに貼り戻せるようクエリを圧縮しますが、文字列リテラル内の空白は決して書き換えません。空白が 2 つ含まれる値との比較も、最小化後に同じ行を返します。
ログ行から取り出した断片も整形できますか?
はい。部分的なクエリでも、WHERE u.created_at >= ? AND u.status = ? だけでも、外側の SELECT なしで整形され編集できます。MySQL のスロークエリログや一般ログの出力はまさにこの形なので、このフォーマッタはその状況に耐えるよう作られています。
ON DUPLICATE KEY UPDATE やインデックスヒントは扱えますか?
はい。MySQL 固有の句は未整形のかたまりとして素通しされるのではなく、本物の句として整形されます。STRAIGHT_JOIN や FORCE INDEX のような結合・インデックスのヒントも、修飾しているテーブルに付いたままです。