DevUtils
技術ガイド
データベース・SQL5分で読める

SQLフォーマット規則、AST構文解析、およびクエリ可読性の実務的価値

SQLパーサーの内部構文木(AST)、予約語大文字化ルール、CTEによる可読性向上、DBAレビューの効率化、およびCI/CDでの自動SQLリンティングを解説します。

実践ツールを使ってみる

SQLフォーマッター

データをサーバーに送信せず、すべてブラウザ内で安全に検証・実行できます。

ツールを開く

SQLの可読性がデータベース運用の安定性に直結する理由

SQL(Structured Query Language)は、手続き型言語とは異なり、「どのような手順でデータを取得するか」ではなく「どのような条件のデータが欲しいか」を宣言する高級宣言型言語です。システムが成熟するにつれて、本番クエリは多数のテーブル結合、サブクエリ、ウィンドウ関数が複雑に重なり合い、数百行に及ぶことが珍しくありません。

改行やインデントのない単一行の難読化されたSQLは、重大な本番障害を引き起こす温床です。結合条件(ON)の抜けによる意図しない直積結合(Cartesian Product / Full Cross Join)や、インデックスを無効化する暗黙の型変換がコードレビューをすり抜け、本番DBのCPUを100%に貼り付かせる原因となります。

SQLパーサーの内部構造:字句解析から抽象構文木(AST)まで

RDBMS(PostgreSQLやMySQLなど)がSQL文を受信すると、ディスクにアクセスする前に以下の3つのコンパイラフェーズを実行します:

  1. 字句解析(Lexer): 文字列をキーワード(SELECT)、識別子(users)、演算子(=)などのトークン列に分解します。
  2. 構文解析(Parser): 文法規則を検証し、木構造の抽象構文木(AST, Abstract Syntax Tree)を構築します。
  3. オプティマイザとプランナー: ASTと統計情報に基づき、最適なインデックススキャンやハッシュ結合を選択して実行計画を策定します。

空白や大文字小文字のフォーマット自体が実行計画を変えることはありませんが、適切なフォーマットはパーサーのAST構造を視覚的にそのまま反映するため、エンジニアが結合の優先順位やフィルタ条件を直感的に把握できるようになります。

実務で遵守すべきSQLフォーマッティングの基本規約

  • 予約語の大文字統一: SELECT, FROM, WHERE, LEFT JOIN, GROUP BYなどのSQL標準キーワードを大文字で統一し、小文字のスネークケースで命名されたテーブル名やカラム名と視覚的に明確に区別します。
  • 句(Clause)単位のインデント: 主な句は0列目に配置し、射影カラム一覧、結合条件(ON)、フィルタ条件(AND, OR)を2〜4スペースでインデントします。
  • 深いサブクエリを排してCTE(WITH句)を活用: 入れ子になったインラインビュー(FROM (SELECT ...))を避け、名前付き共通テーブル式(CTE)を用いてパイプラインを上から下へと流れるように整理します。
SQLDevUtils Code Reference
-- ❌ 悪例:可読性が著しく低く、レビューで見落としが発生しやすい
select u.id,u.name,count(o.id) as orders_cnt,sum(o.amount) from users u left join orders o on u.id=o.user_id where u.created_at >= '2026-01-01' and u.status = 'active' group by u.id,u.name having sum(o.amount) > 1000 order by orders_cnt desc;

-- ✅ 良例:CTEと明示的なインデントにより、論理構造が一目瞭然
WITH active_users AS (
    SELECT id, name
    FROM users
    WHERE created_at >= '2026-01-01'
      AND status = 'active'
)
SELECT
    u.id,
    u.name,
    COUNT(o.id) AS orders_cnt,
    SUM(o.amount) AS total_spent
FROM active_users u
LEFT JOIN orders o
    ON u.id = o.user_id
GROUP BY
    u.id,
    u.name
HAVING SUM(o.amount) > 1000
ORDER BY orders_cnt DESC;

ウィンドウ関数とCASE式の可読性設計

集計クエリで多用されるウィンドウ関数(OVER (PARTITION BY ... ORDER BY ...))は、行ごとに適切に改行とインデントを挟むことで、パーティション範囲の設定ミスを防ぐことができます。

また、CASE WHEN式はWHEN, THEN, ELSE, ENDの各キーワードを垂直方向に揃えて配置することで、条件の網羅性をコードレビュー時に素早く点検できるようにするのが実務上のスタンダードです。

CI/CD環境での自動SQLリンティングの導入

プルリクエストでの主観的なフォーマット議論を排除するため、自動化ツールの導入が推奨されます:

  1. SQLFluff: PostgreSQL、MySQL、BigQuery、Snowflakeなど各DBの方言(Dialect)に対応した業界最高水準のオープンソースSQLリンターです。
  2. DevUtils SQL Formatter: 複雑なSQLやORMが出力したログを、ブラウザ上で安全に即座に整形できます。外部サーバーへデータを送信しないため、機密スキーマの保護にも最適です。
タグ:SQLデータベースPostgreSQL最適化AST
実践ツールを使ってみる

SQLフォーマッター

複雑なSQLクエリのキーワードを自動で大文字化し整列するツール。

ツールを開く