コンテンツにスキップ

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

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

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

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

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

ドキュメンテーション

SQLフォーマットが重要な理由

誰かが目隠しをしながらタイプしたかのようなSQLデータベースプロジェクトを引き継いだことはありませんか?あなただけではありません。整形されていないSQLは、データベース開発における最も一般的なバグと時間の無駄の原因の1つです。

このSQLフォーマッターおよびバリデーターは、乱雑なクエリを自動的にきれいにするのに役立ちます。SQLをペーストすれば、適切なインデント、キーワードの大文字化、構文エラーのチェックをブラウザ内でデータをサーバーに送信することなく即座に行います。通常10-15分かかる手動フォーマットが数秒で完了します。

データベースチームでの経験から、最大の時間節約は単なるフォーマットではなく、本番環境に入る前にエラーを捉えることです。不適切な括弧や閉じられていない引用符は、デバッグに何時間も費やす可能性があります。このツールは、データベースに対して何かを実行する前に、即座にそれらの問題を捉えます。

SQLフォーマッターの使い方

インターフェースは意図的にシンプルです—貼り付けてすぐに使えます:

  1. SQLを入力ボックスに貼り付け(またはゼロから直接入力)
  2. 入力と同時に自動的にフォーマット—クリックするボタンも、設定を構成する必要もありません
  3. フォーマット後の出力の下に表示される検証エラーを確認
  4. フォーマットされたSQLを1クリックでコピーし、IDEやドキュメント、データベースツールで使用

ブラウザがあれば、どのデバイスでも動作します。フォーマット処理は完全にクライアント側で行われるため、クエリが外部に送信されることはありません—本番データベース構造や機密スキーマを扱う際に重要です。

SQLフォーマッターの機能

キーワードの大文字化

すべてのSQLキーワードは自動的に大文字化されます—SELECTFROMWHEREJOINなどです。これは、ほとんどのデータベースチームで使用される規則に従い、キーワードをテーブルおよび列名と視覚的に区別します。複雑なクエリを走査する際、この視覚的な分離により、クエリ構造をすぐに識別できます。

スマートなインデント

フォーマッターは、ランダムな改行を追加するのではなく、論理的な階層に基づいてSQLを構造化します。SELECTFROMなどのメインの句は左余白から始まります。JOIN句はFROMの下にインデントされ、テーブル選択の一部であることを示します。サブクエリは追加のインデントレベルを持ち、ネストされたロジックを明確にします。

実際には、複数の結合とサブクエリを含むクエリがある場合、適切なインデントにより、すべての単語を読まなくてもクエリ構造を確認できます。1つの結合が終わり、別の結合が始まる場所や、SELECTリストでサブクエリが使用されている場所をすぐに特定できます。

論理的な改行

改行は、読みやすさに役立つ場所に表示され、無作為に追加されるわけではありません。各メイン句は独自の行を持ちます。カンマ区切りリスト(SELECT内の列名など)の項目は、適切なインデントで各行に配置されます。サブクエリは視覚的に分離されます。CASE文は、明確さのためにWHENTHENELSEで改行されます。

スペーシングは、業界全体で使用されるSQLスタイルガイドの規則に従います。つまり、フォーマットされたSQLは、他の開発者にとって馴染みのあるものになります。

SQLバリデーション: チェックされる内容

バリデーターは、SQLを素早く書いているときに通常見逃されるエラーを捉えます。データベースのクエリアナライザーの代わりにはなりませんが、クエリを実行する前に一般的な間違いを捉えます。

構造的エラー

不均衡な括弧は、ネストされたサブクエリを含む複雑なクエリでは驚くほど一般的です。バリデーターは、開始括弧と終了括弧をカウントし、不一致をすぐにフラグ付けします。200行のクエリ内の1つの欠落した括弧が原因で本番環境のインシデントを引き起こした例を見てきました—これらを早期に捉えます。

閉じられていない文字列リテラルは、文字列値の終了引用符を忘れた場合に発生します。データベースはこれらをすぐに拒否しますが、ここで捉えることで往復を省けます。

句の順序の問題は、句が順序外に現れる場合にフラグ付けされます。例えば、HAVINGGROUP BYの前に、またはWHEREGROUP BYの後に置くと、バリデーターが警告します。これはISO/IEC 9075 SQL標準で定義されたSQLの標準構文規則に従います。

論理的エラー

ON条件のないJOIN句は、意図せずクロス結合を作成し、意図したよりもはるかに多くの行を返します。一般的なシナリオ:クエリに3番目または4番目のテーブルを追加する際にON句を忘れます。このチェックがないと、結果に何千もの重複行が表示されるまで気づかない可能性があります。

GROUP BYのないHAVINGは、ほとんどのデータベースでは技術的に無効なSQLです。HAVING句はグループ化された結果をフィルタリングするため、機能するにはGROUP BYが必要です。バリデーターはこの論理的な不一致を捉えます。

不完全なWHERE条件は、条件の入力を開始しながら完了しない場合に発生します—例えば、値のないWHERE status =のようなものです。これらはクエリを編集する際に見逃しやすいです。

捉えられないもの

このバリデーターは、構文と構造に焦点を当てており、データベーススキーマは対象外です。以下のことは分かりません:

  • テーブルや列名が実際のデータベースに存在するかどうか
  • 互換性のあるデータ型で結合しているかどうか
  • クエリのパフォーマンスや最適化の問題
  • 照会しているテーブルにアクセス権があるかどうか

実際のデータベースにクエリを送信する前の最初のチェックと考えてください。

フォーマッティングルール

このツールは、ほとんどのデータベースチームが従うSQLスタイルガイドの規約に基づいて、一貫したルールを適用します。

キーワードは大文字になる

すべてのSQLキーワードは大文字になります:SELECTINSERTUPDATEDELETECREATEALTERDROP。これには、句(FROMWHEREGROUP BYHAVINGORDER BY)、結合タイプ(JOININNER JOINLEFT JOIN)、演算子(ANDORNOTINBETWEENLIKE)、および一般的な関数(COUNTSUMAVGCASEWHEN)が含まれます。

なぜ大文字なのか?SQLの言語要素とデータベース固有の名前(テーブル、列、エイリアス)を視覚的に区別するためです。クエリをスキャンする際、構造がすぐに目に入ります。

レベルごとに2スペースのインデント

SELECTFROMなどのメインの句は左余白から始まります。JOIN句はFROMの下に2スペースインデントされ、テーブル選択の一部であることを示します。サブクエリは、ネストレベルごとにさらに2スペースインデントされます。これにより、論理構造に一致する視覚的な階層が作成されます。

カンマ区切りのリスト(例えばSELECTの列名)は、それぞれ一貫したインデントで独自の行を持ちます。SELECTリストに15の列がある場合、これにより特定の列を簡単にスキャンできます。

WHERE句の条件は垂直に揃えられます。複数のANDまたはOR条件がある場合、揃えることで論理構造がすぐに明らかになります。

前と後:違いを確認

フォーマット前:

1select u.id, u.name, o.order_date from users u join orders o on u.id = o.user_id where o.status = "completed" group by u.id order by u.name;
2

フォーマット後:

1SELECT
2  u.id,
3  u.name,
4  o.order_date
5FROM users u
6  JOIN orders o ON u.id = o.user_id
7WHERE
8  o.status = "completed"
9GROUP BY
10  u.id
11ORDER BY
12  u.name;
13

バリデーションルール: どのような項目がフラグされるか

バリデーターは、構造的な整合性と基本的な論理的一貫性をチェックします。以下がチェックする内容です:

構造的チェック

バランスの取れたカッコ: 開始カッコと終了カッコは一致する必要があります。ネストされたサブクエリには複数のレベルのカッコがあることが多く、それらを誤って数えることは最も一般的なSQLエラーの1つです。バリデーターがカッコを数えます。

適切に閉じられた文字列: すべての開始引用符(シングルまたはダブル)には、対応する終了引用符が必要です。明白に聞こえますが、複数の文字列リテラルを含む複雑なクエリを作成する際に、1つを見落とすことは簡単です。

正しい句の順序: SQLには特定の順序要件があります。SELECTFROMの前、FROMWHEREの前、WHEREGROUP BYの前、GROUP BYHAVINGの前、HAVINGORDER BYの前に来ます。これらを順不同にすると、即座に構文エラーが発生します。バリデーターはSQLの標準に基づいてこの順序をチェックします。

論理的一貫性チェック

ONコンディションを伴うJOIN: すべてのJOINには、テーブルの関連を指定するためのONまたはUSING句が必要です。これがないと、クロスジョイン(あるテーブルのすべての行が、もう一方のテーブルのすべての行とペアリングされる)が発生します。これはめったに望まれるものではなく、通常はON句の欠落を示しています。

完全なWHERE条件: WHERE句には完全な述語が必要です。値のないWHERE status =は不完全で無効です。バリデーターはこれらの部分的な条件にフラグを立てます。

HAVINGにはGROUP BYが必要: HAVING句はグループ化された結果をフィルタリングするため、GROUP BYがある場合にのみ意味があります。GROUP BYなしでHAVINGを使用することは、ほとんどのデータベースで拒否される論理的エラーです。

GROUP BYの集計ルール: COUNT()SUM()などの集計関数を使用する場合、SELECTリストの非集計列はGROUP BYに表示される必要があります。これはバリデーターがチェックする基本的なSQL要件です。

検出される一般的なエラーの例

バリデーターがフラグを立てるSQLの例:

1SELECT user_id, COUNT(*) FROM orders
2JOIN users
3WHERE status =
4GROUP BY
5HAVING count > 10;
6

検出される問題:

  1. JOIN usersON条件がない(クロスジョインが作成される)
  2. WHERE status =が不完全(比較値がない)
  3. 空のGROUP BY句(列が指定されていない)
  4. HAVING count > 10が未定義の列を参照している

SQLフォーマッターを使用するタイミング

コードレビュー時

50行のSQLクエリが1行で書かれているのを見たことがありますか?それは非常に厳しいものです。コードレビューにクエリを提出する前に、フォーマッターを通してください。レビュアーは感謝し、構造を解読する代わりにロジックに集中できます。

プルリクエストでデータベースの変更を確認する際は、コントリビューターにSQLを最初にフォーマットするよう依頼してください。構造が一貫していれば、ロジックエラーを見つけやすくなります。

本番環境の問題のデバッグ

本番環境で失敗したクエリのトラブルシューティングを行う際、適切にフォーマットすることで構造を明確に見ることができます。SQLが適切にフォーマットされると、問題が明らかになるクエリを何度もデバッグしてきました。見落とされていた結合条件、不正なWHERE句のグループ化、または間違った場所にあるサブクエリなどです。

ログからクエリをコピーし、ここに貼り付けると、構造的な問題がすぐに分かります。

生成されたSQLの操作

Hibernate、Entity Framework、SQLAlchemyなどのORM(オブジェクト・リレーショナル・マッパー)は、SQLを自動的に生成します。実際に生成されているクエリを確認する必要がある場合があります。生成されたSQLは通常、フォーマットされていない1行の長いクエリです。このツールを使用すると、ORM生成クエリを読みやすくし、理解と最適化を行えます。

SQLの学習と教育

SQLを学んでいる、または教えている場合、このフォーマッターは適切なクエリ構造を理解するのに役立ちます。動作するクエリを貼り付けて、どのようにフォーマットされるかを見ることで、規則を学べます。壊れたクエリを貼り付けて、検証エラーを見ることで、なぜ動作しないかを理解できます。

データベースシステム間の移行

PostgreSQL、MySQL、SQL Serverなど、異なるデータベースには少しずつ異なるSQLの方言があります。システム間でクエリを移行する際、適切なフォーマットは、調整が必要な方言固有の構文を見つけるのに役立ちます。フォーマッターは、ほとんどの主要なデータベースで機能する標準的なSQLの規則に従っています。

SQLフォーマッターの代替手段

データベース固有のIDE

DataGrip、SQL Server Management Studio、またはMySQL Workbenchなどのツールには、組み込みのフォーマッターがあります。これらは強力で、データベース接続に直接統合されています。

トレードオフ:インストールとセットアップが必要です。DataGripは個人向けに年間199ドルかかります。SSMSは無料ですが、Windowsのみで利用可能です。何もインストールせずに迅速なフォーマットが必要な場合、または複数のデータベースシステムで作業する場合、ブラウザベースのツールがより実用的です。

エディター拡張機能

VS CodeやSublime TextでSQLを記述する場合、SQL BeautifyやSqlBeautifierなどの拡張機能により、エディター内でフォーマットできます。これは、クエリを作成中に即座にフォーマットを適用したい場合に効果的です。

制限:拡張機能には設定が必要で、特定のエディターに依存します。SQLをチームメイトと共有したり、ドキュメンテーションにクエリを投稿する際は、標準化されたWebフォーマッターにより、誰もが同じフォーマットを確認できます。

コマンドラインフォーマッター

sqlformat(Python)やsql-formatter-cli(Node.js)などのツールは、バージョン管理でSQLを自動的にフォーマットするCI/CDパイプラインに統合できます。これにより、チーム全体で一貫性を確保できます。

自動化されたワークフローに最適で、アドホックなフォーマットには向いていません。単に数個のクエリをクリーンアップしたり、SQLを学習している場合、コマンドラインツールは不必要な複雑さを追加します。

SQLフォーマットが標準的な慣行になった経緯

SQLは1970年代にIBMで開発されましたが、フォーマットの規約が登場したのはずっと後のことです。初期のSQLは機能的でしたが、一貫性に欠けており、各開発者がクエリを異なる方法でフォーマットしていました。

転換点は1990年代に訪れ、データベースが単一の開発者によるプロジェクトからチームベースの開発に移行しました。組織は一貫性を維持するために、内部SQLスタイルガイドの作成を開始しました。同じデータベースで5人の開発者が作業する場合、読みやすいSQLは共同作業に不可欠でした。

2000年代には、SQLを自動生成するORMが登場しました。これらのツールは機能するものの見栄えの悪いSQL—すべてが1行に、インデントなし—を生成しました。これにより、生成されたSQLを人間が読めるようにする自動フォーマッターへの需要が生まれました。

2010年代、Webの発展に伴い、オンラインSQLフォーマッターが登場しました。ツールをインストールしたり、IDEプラグインを設定したりする代わりに、開発者はブラウザでSQLをフォーマットできるようになりました。これにより、SQLを学び始めた初心者から、簡単なクエリを整理する経験豊富な開発者まで、適切なフォーマットへのアクセスが民主化されました。

今日、SQLフォーマットは他のプログラミング言語のコードフォーマットと同様に、基本的な慣行と見なされています。Simon HolywellのSQLスタイルガイドは広く採用されている規約を提供し、このようなツールが自動的にそれらの標準を実装しています。

コード例

例1: 基本的なSELECTクエリ

フォーマットなし:

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

フォーマット済み:

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

例2: JOINクエリ

フォーマットなし:

1select c.id, c.name, o.order_date, o.total_amount from customers c left join orders o on c.id = o.customer_id where o.order_date >= '2023-01-01' and o.status != 'cancelled' order by o.order_date desc;
2

フォーマット済み:

1SELECT
2  c.id,
3  c.name,
4  o.order_date,
5  o.total_amount
6FROM
7  customers c
8  LEFT JOIN orders o ON c.id = o.customer_id
9WHERE
10  o.order_date >= '2023-01-01'
11  AND o.status != 'cancelled'
12ORDER BY
13  o.order_date DESC;
14

例3: サブクエリを含む複雑なクエリ

フォーマットなし:

1select d.department_name, (select count(*) from employees e where e.department_id = d.id) as employee_count, (select avg(salary) from employees e where e.department_id = d.id) as avg_salary from departments d where d.active = true having employee_count > 0 order by avg_salary desc;
2

フォーマット済み:

1SELECT
2  d.department_name,
3  (
4    SELECT
5      COUNT(*)
6    FROM
7      employees e
8    WHERE
9      e.department_id = d.id
10  ) AS employee_count,
11  (
12    SELECT
13      AVG(salary)
14    FROM
15      employees e
16    WHERE
17      e.department_id = d.id
18  ) AS avg_salary
19FROM
20  departments d
21WHERE
22  d.active = TRUE
23HAVING
24  employee_count > 0
25ORDER BY
26  avg_salary DESC;
27

プログラム的なSQLフォーマット

以下は、さまざまなプログラミング言語でのSQLフォーマットの実装例です:

1// sql-formatterライブラリを使用したJavaScriptのSQLフォーマット例
2const sqlFormatter = require('sql-formatter');
3
4function formatSQL(sql) {
5  return sqlFormatter.format(sql, {
6    language: 'sql',
7    uppercase: true,
8    linesBetweenQueries: 2,
9    indentStyle: 'standard'
10  });
11}
12
13const rawSQL = "select id, name from users where status='active'";
14const formattedSQL = formatSQL(rawSQL);
15console.log(formattedSQL);
16

よくある質問

このSQLフォーマッターは、PostgreSQL、MySQL、SQL Serverで動作しますか?

はい、主要なデータベース間で共通の標準SQLシンタックスを処理します - PostgreSQL、MySQL、SQL Server(T-SQL)、Oracle、SQLite、MariaDB。フォーマッターは、どこでも動作するコアSQL(SELECT、JOIN、WHERE、GROUP BYなど)に焦点を当てています。

データベース固有の機能は完璧にフォーマットされない可能性があります。例えば、PostgreSQLの配列構文やSQL Serverの独自関数は特別なフォーマット処理を受けないかもしれませんが、フォーマッターを壊すことはありません。クエリは以前よりも読みやすくなります。

SQLコードはサーバーに送信されますか?

いいえ。すべての処理はブラウザ内で行われます。SQLをペーストすると、ネットワークリクエストなしでローカルにフォーマットされます。クエリは決してマシンから出ません。

本番データベーススキーマや独自のビジネスロジックを扱う際に重要です。機密情報が他人のサーバーに記録または保存されるリスクはありません。

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

とんでもありません。構造的および文法的な問題のみを検出します - 括弧の欠落、閉じられていない引用符、間違った順序の句など。それだけです。

テーブル名が間違っているか、データ型に互換性がないか、クエリの実行に10分かかるかは分かりません。そのためには、実際のデータベースが必要です。このバリデーターはSQLのスペルチェックであり、完全なクエリアナライザではありません。

データベースが実行するのに、なぜSQLをフォーマットする必要があるのですか?

データベースはフォーマットを気にしません - クエリを解析します。しかし、人間は気にします。障害が発生しているクエリをデバッグする必要がある場合、既存のクエリを変更する場合、または他の人のSQLをレビューする場合、適切なフォーマットは30秒で理解するか30分かかるかの違いになります。

フォーマットされたSQLは、論理エラーを見つけるのにも役立ちます。構造が明確になれば、テーブルを誤って結合したり、条件を間違った場所に置いたりしているかを確認できます。

インデントやキーワードスタイルをカスタマイズできますか?

現在はできません。フォーマッターは標準的な規則を使用します:大文字のキーワード、2スペースのインデント、別々の行の句。これらは、ほとんどのチームが使用するSQLスタイルガイドに従っています。

カスタムフォーマット(異なるインデント幅、小文字のキーワード)が必要な場合は、sqlformatのような設定可能なコマンドラインツールまたはフォーマット設定のあるIDEを使用する必要があります。

1000行のストアドプロシージャでも動作しますか?

大きなクエリもフォーマットできますが、非常に複雑なストアドプロシージャ(1000行以上)の処理には数秒かかる可能性があります。フォーマッターは、ペーストされたSQLを長さに関係なく処理します。

大規模なストアドプロシージャの場合、小さな部分に分割するか、大きなファイル用に最適化されたデータベース固有のIDEを使用することをお勧めします。

フォーマットによってクエリの実行方法は変わりますか?

いいえ。フォーマットは単に空白を追加し、大文字化を変更するだけです。データベースはこれらを無視します。フォーマットされたクエリは、未フォーマットのバージョンと全く同じ結果を返し、同じパフォーマンスで実行されます。

唯一の例外は、バリデーターが実際の文法エラー(括弧の欠落など)を見つけた場合、それらを修正すると動作が変わる可能性があることです - しかし、「実行できない」から「正しく実行される」にのみ変わります。

どのSQLスタンダードに従っていますか?

フォーマッターは、SQL:1999以降の標準の一般的な機能を拡張したSQL-92規則に従っています。これは、ほとんどの開発者が日常的に記述するSQL - SELECTクエリ、結合、サブクエリ、CASE文、ウィンドウ関数をカバーしています。

SQL:2016またはSQL:2019の非常に新しいSQL機能は認識されない可能性がありますが、フォーマッターを壊すことはありません。基本的なフォーマットのみが適用されます。

Oracle PL/SQLやSQL Server T-SQLでも使用できますか?

基本的なクエリであれば、はい。手続き型コード(PL/SQLブロック、制御フローを含むT-SQLストアドプロシージャ)のフォーマットは限定的です。このツールは、SELECT、INSERT、UPDATE、DELETE文とその句に焦点を当てています。

データベース固有の手続き型コードを集中的に扱う場合は、データベース独自のIDE(OracleのSQL Developer、SQL ServerのSSMS)が完全な構文を理解するより良いフォーマットを提供します。

参考文献と追加情報

SQLのフォーマットを始める

読みやすいSQLは、デバッグを高速化し、コードレビューを容易にし、コラボレーションをスムーズにします。上記にクエリを貼り付けると、業界標準の規則に従ってフォーマットされます—インストール不要、設定不要、データはブラウザから出ません。