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は標準化されており、広くサポートされているため、同じメンタルモデルを以下に使用 できます:
日常のビジネスデータのほとんど—注文、ユーザー、支払い、ログ、分析—は最終的に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/XML、SQL/MED、さらにはプロパティグラフクエリ用の SQL/PGQなどの後続パート
完全なリストは SQLのISOカタログページ や Modern SQLの標準パートの分解 などのリソースで確認できます。
実際には、各データベースが独自の方言を実装しています:
- PostgreSQLは高度なデータ型や全文検索などの拡張機能を追加し、 PostgreSQLマニュアル に文書化されています。
- MySQLには独自の SQLステートメント と 関数 のバリエーションがあります。
- SQLiteは、いくつかの独特な動作を持つSQLの実質的なサブセットをサポートし、その SELECTドキュメント に詳しく記載されています。
コアコンセプト—テーブル、行、列、結合、集約—は移植可能ですが、非自明なシステムでは特定の方言の癖と機能を学ぶ必要があります。
3. リレーショナル基礎:テーブル、行、キー
核心として、SQLはリレーショナルモデルを中心に設計されています:データはテーブル(リレーション)に存在し、各行が事実を表し、各列が属性を記述します。
典型的な要素には以下が含まれます:
- テーブル:例:
customers、orders - 列:例:
id、name、order_date、total_amount - 主キー:各行の一意の識別子(多くの場合
id) - 外部キー:別のテーブルの主キーを参照する列(例:
orders.customer_id→customers.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句は比較演算子(=、<>、>、<)、論理演算子( AND、OR、NOT)、パターンマッチング(LIKE、ILIKE)などを使用できます。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を使用
良いチュートリアルとマニュアルは、式が多くの句—WHERE、ORDER BY、HAVING、さらには 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. 集約、グループ化、ウィンドウ関数
データを要約するために—合計、平均、カウント—集約関数(COUNT、SUM、 AVG、MIN、MAX)を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 KEY、UNIQUE、NOT 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;BEGINとCOMMITの間で何かが失敗した場合、トランザクションはロールバックされ、中間の変更がデータベースに漏れないようにします。
MySQLの トランザクションステートメントとロック のセクションは、START TRANSACTION、COMMIT、ROLLBACK、セーブポイントをカバーしています。一方、PostgreSQLの 並行性制御 と トランザクション管理 の章は、分離レベルとMVCCが内部でどのように機能 するかを説明しています。
制約—外部キーやチェック制約など—は、ビジネスルールを強制するデータベースの方法です:
ALTER TABLE orders
ADD CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id)
REFERENCES customers (id);適切に使用されると、データベースを不変量の守護者に変え、アプリケーションロジックにのみ依存するのではなく、ソースで無効なデータを防ぎます。
10. スキーマ設計と正規化
スキーマを正しく行うことは、多くの場合、巧妙なクエリよりも重要です。正規化は、冗長性を減らし、一貫性を向上させるためにテーブルを構造化するプロセスです。以下のようなチュートリアル:
- 「SQLでのデータベース正規化 — 1NF、2NF、3NFの説明」
- DigitalOceanの正規化ガイド
- DBMSの正規形に関するGeeksforGeeks
- Guru99の1NF–6NFの概要
- Visual Paradigmの正規化レベルガイド
典型的な進行:
- 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 >= ?にうまく機能します。 - インデックスはフィルタ付きの
SELECT、UPDATE、DELETEを支援しますが、挿入を遅くします。各挿入は関連するすべてのインデックスを更新する必要があるためです。
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はデータ作業の基礎であり続けているため、豊富な学習リソースのエコシステムがあります:
- インタラクティブチュートリアル— W3Schools SQLチュートリアル や W3Schools.in SQLコースインデックス は、ブラウザ内エディタで構文、クエリ、例をカバーしています。
- W3Schools SQLトレーニング や SQL Bootcamp などの構造化トレーニングは、演習、自動採点、認定を提供します。
- SQL Practice Onlineの結合チュートリアル などの実践ベースのサイトは、解決すべき実際の問題を提供します。
- Use The Index, Luke! などの専門リソースは、パフォーマンスとインデックス作成に焦点を当て、基本的なSQLと本番レベルのチューニングの間のギャップを埋めます。
実用的な学習戦略:
- SELECTと基本的なフィルタリングをマスターします。簡単なクエリから始めて、徐々に
WHERE、ORDER BY、LIMITを追加します。 - 結合に慣れます。すべての結合タイプを練習し、自信を持って結果を予測できるようになるまで続けます。
- グループ化と集約を追加します。「月ごとの収益」や「トップ10顧客」などの質問に
GROUP BYで答える方法を学びます。 - スキーマ設計を学びます。正規化を研究し、実際のシステム—例えば、店舗、予約システム、ソーシャルネットワーク—のモデリングを練習します。
- お気に入りのエンジンの機能を探索します。データベースの公式ドキュメント— PostgreSQLのSQL言語セクション、 MySQLリファレンスマニュアル、または SQLite言語リファレンス —を読んで、エンジン固有のツールを発見します。
- 最後に、パフォーマンスを学びます。 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を検証してください。