SQLをフォーマット

美化 してSQLクエリをフォーマット。 複数の方言。完全無料。
SQL方言
入力SQL
フォーマット済みSQL
入力SQL

プライベートで安全

すべてがブラウザで行われます。あなたのファイルが私たちのサーバーに触れることはありません。

超高速

アップロードも待つ必要もありません。ファイルをドロップした瞬間に変換します。

本当に無料

アカウントは必要ありません。隠れたコストもありません。ファイルサイズのトリックもありません。

SQL(Structured Query Language)は、地球上のほぼすべての本格的なリレーショナルデータベースで使用されている共通言語です— PostgreSQL MySQL SQLite から、SQL ServerやOracleなどの商用システムまで。データ構造を定義し、データを保存し、効率的にクエリし、そのデータの動作に関するルールを強制することができます。

以下は、SQLに関する約2,500語の詳細なツアーです:SQLとは何か、どのように機能するか、実際のシステムでどのようにうまく使用するか。

1. SQLとは(そしてなぜ今でも重要か)

SQLは宣言型言語です:どのデータが必要かを記述し、データベースがどのように取得するかを決定します。 W3SchoolsのSQLガイド W3Schools.inのSQLシリーズ などのチュートリアルは、SQLを多くのデータベースエンジンでデータを保存、操作、取得するための標準言語として紹介しています。

SQLは標準化されており、広くサポートされているため、同じメンタルモデルを以下に使用できます:

  • MySQL またはPostgreSQL上のWebアプリケーション
  • SQLite を使用した組み込みアプリケーション
  • SQL ServerやOracleなどのエンタープライズシステム

日常のビジネスデータのほとんど—注文、ユーザー、支払い、ログ、分析—は最終的にSQLでクエリできるテーブルに保存されます。

2. SQL標準と方言

SQLは ISO/IEC 9075 標準ファミリーによって標準化されており、コア言語と多くのオプション拡張を定義しています。標準はSQL-86、SQL-92、SQL:1999、SQL:2003からSQL:2023まで進化してきました。 SQL標準ISO/IEC 9075:2023 に関するANSIの概要などの記事は、ANSI標準とISO標準が時間の経過とともにどのように整合するかを説明しています。

標準自体は複数の部分に分かれています:

  • パート1(Framework)パート2(Foundation)
  • パート3(Call-Level Interface)(API用)
  • パート4(Persistent Stored Modules)(ストアドプロシージャ用)
  • SQL/XMLSQL/MED、さらにはプロパティグラフクエリ用の SQL/PGQなどの後続パート

完全なリストは SQLのISOカタログページ Modern SQLの標準パートの分解 などのリソースで確認できます。

実際には、各データベースが独自の方言を実装しています:

  • PostgreSQLは高度なデータ型や全文検索などの拡張機能を追加し、 PostgreSQLマニュアル に文書化されています。
  • MySQLには独自の SQLステートメント 関数 のバリエーションがあります。
  • SQLiteは、いくつかの独特な動作を持つSQLの実質的なサブセットをサポートし、その SELECTドキュメント に詳しく記載されています。

コアコンセプト—テーブル、行、列、結合、集約—は移植可能ですが、非自明なシステムでは特定の方言の癖と機能を学ぶ必要があります。

3. リレーショナル基礎:テーブル、行、キー

核心として、SQLはリレーショナルモデルを中心に設計されています:データはテーブル(リレーション)に存在し、各行が事実を表し、各列が属性を記述します。

典型的な要素には以下が含まれます:

  • テーブル:例:customersorders
  • :例:idnameorder_date total_amount
  • 主キー:各行の一意の識別子(多くの場合id
  • 外部キー:別のテーブルの主キーを参照する列(例: orders.customer_idcustomers.id

正規化ガイド— DigitalOceanの正規化チュートリアル やfreeCodeCampの 1NF、2NF、3NF の説明など—は、データを適切に構造化されたテーブルに分割し、キーでそれらをリンクすることで冗長性を最小限に抑え、更新異常を防ぐことを良いリレーショナル設計として位置づけています。

SQLでクエリする場合、本質的にデータベースに尋ねています:「これらのテーブルから、これらの条件下で、どの行と列を見るべきか?」

4. コアクエリ:SELECT

SELECTステートメントはSQLの主力であり、おそらく最も複雑なコマンドです。 SQLite SELECTリファレンス は「SQL言語で最も複雑なコマンド」と呼んでおり、 MySQLのSELECTドキュメント SQLite TutorialのSELECTガイド などのチュートリアルは、その多くのオプションを説明しています。

SELECT id, name
FROM customers;

重要な部分:

  • SELECTは列をリストします(またはすべての列には*を使用しますが、通常は明示的であることが良いです)。
  • FROMは1つ以上のテーブルを選択します。
  • WHEREは行をフィルタリングします。
  • ORDER BYは結果をソートします。
  • LIMITは表示する行数を制限します。
SELECT id, name, created_at
FROM customers
WHERE active = TRUE
ORDER BY created_at DESC
LIMIT 50;

W3Schools SQLチュートリアル W3Schools MySQLの一般的なコマンドの概要 などの入門チュートリアルは、SELECTを使用して、単一の読み取り可能な式でテーブルからデータを抽出する方法を示しています。

5. フィルタリング、ソート、式

SQLは、クエリ内で直接フィルタリングと式を組み合わせるときに輝きます:

SELECT
 id,
 total_amount,
 total_amount * 0.1 AS tax_estimate
FROM orders
WHERE status = 'paid'
 AND total_amount >= 100
ORDER BY total_amount DESC;

WHERE句は比較演算子(=<>><)、論理演算子( ANDORNOT)、パターンマッチング(LIKEILIKE)などを使用できます。MySQLなどのデータベースは、数値、文字列、日付/時刻、JSON、その他の操作のための豊富な 組み込み関数と演算子 のセットを文書化しています。

また、以下も可能です:

  • リストと一致するためにINを使用: WHERE status IN ('paid', 'refunded')
  • 範囲にBETWEENを使用: WHERE created_at BETWEEN '2025-01-01' AND '2025-01-31'
  • 欠損値を処理するためにIS NULL / IS NOT NULLを使用

良いチュートリアルとマニュアルは、式が多くの句—WHEREORDER BYHAVING、さらには SELECT自体—に現れることを強調しています。MySQLドキュメントは、関数と演算子の章内の式評価のセクションでこれを強調しています。

6. テーブルの結合

実際のデータベースは、すべてを1つのテーブルに保持することはほとんどありません。代わりに、データを複数のテーブルに正規化し、クエリするときにそれらを結合します。結合は、 W3SchoolsのSQL結合ページ GeeksforGeeksの結合チュートリアル TutorialsPointの結合概要、および SQL Practice OnlineのSQL結合チュートリアル などのリソースで広くカバーされています。

SELECT
 id,
 c.name,
 o.order_date,
 o.total_amount
FROM orders AS o
JOIN customers AS c
 ON c.id = o.customer_id;

一般的な結合タイプ:

  • INNER JOIN – 両方のテーブルに一致がある行のみ
  • LEFT JOIN – 左側のテーブルからのすべての行、プラス右側からの一致
  • RIGHT JOIN – 左結合の反対(SQLiteなどの一部のエンジンではサポートされていません)
  • FULL OUTER JOIN – 一致しない場合でも、両側からの行

DbSchemaの「SQL joins explained」記事 LearnSQL.comの結合例 などの視覚的でコード中心の説明は、結合の動作について強い直感を構築する優れた方法です。

7. 集約、グループ化、ウィンドウ関数

データを要約するために—合計、平均、カウント—集約関数COUNTSUM AVGMINMAX)をGROUP BYと共に使用します:

SELECT
 customer_id,
 COUNT(*) AS order_count,
 SUM(total_amount) AS total_spent
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(total_amount) >= 1000
ORDER BY total_spent DESC;

MySQLの関数と演算子の章 PostgreSQLの集約関数とウィンドウ関数のドキュメント などのリファレンスは、これらの式で使用できる組み込み関数をカタログ化しています。

モダンSQLはウィンドウ関数もサポートしており、個別の行を返しながら、行のスライディング「ウィンドウ」で集約を計算できます—例えば、累積合計やランキング。ウィンドウ関数はSQL:1999への修正を通じてSQLに入り、後にSQL:2003に統合されました。 SQL:1999とSQL:2003標準 に関するノートに要約されています。

SELECT
 customer_id,
 order_date,
 total_amount,
 SUM(total_amount) OVER (
   PARTITION BY customer_id
   ORDER BY order_date
 ) AS running_total
FROM orders;

この種のクエリは、データベース内で直接分析を行うために非常に強力です。

8. データ定義:スキーマの作成と進化

SQLはクエリのためだけではありません。また、Data Definition Language(DDL)ステートメントを通じてデータの形状を定義します。これは、 PostgreSQLのデータ定義ガイド MySQLのSQLステートメントの章 などのセクションでよく文書化されています。

一般的なDDLコマンド:

  • CREATE DATABASE my_app; – データベースを作成
  • CREATE TABLE customers (...); – テーブルを定義
  • ALTER TABLE customers ADD COLUMN phone TEXT; – テーブル構造を変更
  • DROP TABLE customers; – テーブルを削除
CREATE TABLE customers (
 id           SERIAL PRIMARY KEY,
 email        VARCHAR(255) UNIQUE NOT NULL,
 name         TEXT NOT NULL,
 created_at   TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 active       BOOLEAN NOT NULL DEFAULT TRUE
);

注意すべきポイント:

  • データ型:整数、文字列、日付、ブール値、JSONなど
  • 制約PRIMARY KEYUNIQUENOT NULL CHECK
  • デフォルト値と生成列

すべての主要なRDBMSマニュアル— PostgreSQLのSQL言語セクション MySQLリファレンスマニュアル SQLite言語リファレンス —は、スキーマの決定は後で変更するのが難しいため、DDLについて慎重に考えることを強調しています。

9. トランザクション、並行性、制約

SQLデータベースは通常、ACIDプロパティ—原子性、一貫性、分離性、持続性—をトランザクションを通じて実装します:

BEGIN;

UPDATE accounts
SET balance = balance - 200
WHERE id = 1;

UPDATE accounts
SET balance = balance + 200
WHERE id = 2;

COMMIT;

BEGINCOMMITの間で何かが失敗した場合、トランザクションはロールバックされ、中間の変更がデータベースに漏れないようにします。

MySQLの トランザクションステートメントとロック のセクションは、START TRANSACTIONCOMMITROLLBACK、セーブポイントをカバーしています。一方、PostgreSQLの 並行性制御 トランザクション管理 の章は、分離レベルとMVCCが内部でどのように機能するかを説明しています。

制約—外部キーやチェック制約など—は、ビジネスルールを強制するデータベースの方法です:

ALTER TABLE orders
ADD CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id)
REFERENCES customers (id);

適切に使用されると、データベースを不変量の守護者に変え、アプリケーションロジックにのみ依存するのではなく、ソースで無効なデータを防ぎます。

10. スキーマ設計と正規化

スキーマを正しく行うことは、多くの場合、巧妙なクエリよりも重要です。正規化は、冗長性を減らし、一貫性を向上させるためにテーブルを構造化するプロセスです。以下のようなチュートリアル:

典型的な進行:

  • 1NF:繰り返しグループなし。各列は原子値を保持します。
  • 2NF:各非キー属性は完全な主キーに依存します(複合キーの場合)。
  • 3NF:推移的依存関係なし(非キー属性は他の非キー属性に依存しません)。

過度の正規化はパフォーマンスを損ない、クエリを複雑にする可能性があります。実用的なチームは、しばしば3NFに正規化し、その後、パフォーマンスが必要な場合に選択的に非正規化します(例えば、集約のキャッシュ)。

11. インデックスとクエリパフォーマンス

インデックスは、SQLクエリを高速にするための主要なツールです。これらは補助データ構造であり、データベースがテーブル全体をスキャンする代わりに、関連する行に直接ジャンプできるようにします。

インデックス作成に関する非常に尊敬されているリソースは、Markus WinandのUse The Index, Luke!です。これは、SQLパフォーマンスとインデックス戦略に完全に焦点を当てた無料のオンラインブックです。サイトのメインページ、 UseTheIndexLuke.com、および 「Indexing LIKE filters」 「More indexes, slower INSERT」 などの記事は、インデックスがいつ役立ち、いつ害になるかを説明しています。

重要なアイデア:

  • B-treeインデックスは等価性と範囲検索を高速化します(WHERE email = ... WHERE created_at >= ...)。
  • 複合インデックスは列の順序を考慮します—例えば、(customer_id, created_at) WHERE customer_id = ? AND created_at >= ?にうまく機能します。
  • インデックスはフィルタ付きのSELECTUPDATEDELETEを支援しますが、挿入を遅くします。各挿入は関連するすべてのインデックスを更新する必要があるためです。

MSSQLTipsのSQL Serverインデックス設計に関する記事 などのガイドは、インデックス内の列の選択と順序が実際のクエリにどのように影響するかを示しています。

実用的な経験則:

  • 主キーと頻繁な結合/フィルタ列にインデックスを作成します。
  • すべての列にインデックスを作成することは避けます—インデックスが多すぎると書き込みパフォーマンスが低下します。
  • データベースのEXPLAIN/EXPLAIN ANALYZEを使用して、クエリがどのように実行されるかを確認します。

12. モダンSQL機能:CTE、JSON、その先へ

基礎は安定していますが、モダンSQLは大幅に成長しています:

  • WITHによるCommon Table Expressions(CTE)は、より読みやすくモジュール化されたクエリを可能にします:
    WITH recent_orders AS (
     SELECT *
     FROM orders
     WHERE order_date >= CURRENT_DATE - INTERVAL '7 days'
    )
    SELECT customer_id, COUNT(*) 
    FROM recent_orders
    GROUP BY customer_id;
  • JSONサポートにより、半構造化データをリレーショナルテーブルと混合できます。PostgreSQL、MySQL、その他は、マニュアルで広範なJSON関数を文書化しています。例えば、MySQLのJSON機能は JSON関数 の下にリストされています。
  • 高度なデータ型(配列、hstore、ジオメトリ、全文検索)は、 PostgreSQLマニュアル のPostgreSQLのデータ型とインデックスの章で説明されています。

SQL標準自体は、XML、多次元配列、プロパティグラフクエリのパートを追加しました。これは ISO SQL標準カタログ ANSI SQL標準記事 などのSQLの進化に関する記事に文書化されています。

モダンSQLは非常に強力で、多くのアプリケーションが複雑なロジック—階層、分析、イベント処理—をデータベース層にプッシュできます。

13. SQLを効果的に学ぶ

SQLはデータ作業の基礎であり続けているため、豊富な学習リソースのエコシステムがあります:

実用的な学習戦略:

  1. SELECTと基本的なフィルタリングをマスターします。簡単なクエリから始めて、徐々に WHEREORDER BYLIMITを追加します。
  2. 結合に慣れます。すべての結合タイプを練習し、自信を持って結果を予測できるようになるまで続けます。
  3. グループ化と集約を追加します。「月ごとの収益」や「トップ10顧客」などの質問にGROUP BYで答える方法を学びます。
  4. スキーマ設計を学びます。正規化を研究し、実際のシステム—例えば、店舗、予約システム、ソーシャルネットワーク—のモデリングを練習します。
  5. お気に入りのエンジンの機能を探索します。データベースの公式ドキュメント— PostgreSQLのSQL言語セクション MySQLリファレンスマニュアル、または SQLite言語リファレンス —を読んで、エンジン固有のツールを発見します。
  6. 最後に、パフォーマンスを学びます。 Use The Index, Luke! や類似のリソースの概念を使用してインデックスで実験し、EXPLAINでクエリをプロファイリングします。

SQLを快適に読み書きできる場合、本番環境で直接データを検査し、スプレッドシートにエクスポートせずにレポートを構築し、基になるテーブルを見てアプリケーションロジックをデバッグし、エンジニアやアナリストとより効果的に協力できます。

14. 大きな絵

SQLは独特な交差点にあります:40年以上の歴史がありますが、今日のクラウドネイティブで分析重視のシステムで深く関連しています。 ISO/IEC 9075標準 とその多くの部分は進化し続けており、 PostgreSQL MySQL SQLite などのオープンソースデータベースは、実用的な機能とパフォーマンスの改善を推進しています。

データを扱う場合—開発者、アナリスト、データサイエンティスト、またはプロダクトマネージャー—SQLは、データベースに直接質問することを可能にする共通言語です。一度学ぶ価値があり、キャリアの残りの期間に報酬を支払います。

よくある質問

SQLフォーマットとは何ですか?

SQLフォーマットは、適切なインデント、改行、キーワードの大文字小文字を使用してSQLクエリを整理し、可読性と保守性を向上させるプロセスです。

どのSQL方言がサポートされていますか?

当社のフォーマッターは、MySQL、PostgreSQL、SQL Server、SQLite、Oracleなど、複数のSQL方言をサポートしています。

私のSQLコードは安全ですか?

はい!すべてのSQLフォーマットは完全にブラウザ内で行われます。クエリがコンピューターを離れることはなく、完全なプライバシーとセキュリティが保証されます。

複数のSQLステートメントをフォーマットできますか?

はい、複数のSQLステートメントを一度にフォーマットできます。フォーマッターは選択した方言に基づいて各ステートメントを適切に処理します。

SQLに構文エラーがある場合はどうなりますか?

フォーマッターは、構文エラーが含まれている場合でもSQLをフォーマットしようとします。ただし、解析できない無効なSQLのエラーメッセージが表示される場合があります。常にデータベースシステムでSQLを検証してください。