SQL 構文リファレンス

カテゴリ別に SQL の構文を解説

基本構文

SELECTテーブルからデータを取り出す最も基本の句。取り出す列の指定(ワイルドカード/明示列)、エイリアス、計算列の書き方を押さえる
FROM取得元のテーブルやビュー、サブクエリを指定する句。テーブルエイリアスと FROM 内サブクエリを解説
WHERE行を絞り込む句。比較・論理演算子、IN・BETWEEN・LIKE、NULL 扱いの注意点を押さえる
ORDER BY結果を並び替える句。ASC/DESC、NULLS FIRST/LAST、複数キー、式による並び替えを整理
LIMIT / OFFSET件数制限とページング。OFFSET の性能落とし穴と keyset pagination への移行を解説
DISTINCT結果から重複行を排除する。DISTINCT ON など PostgreSQL 拡張や GROUP BY との使い分けも解説
CASE 式SQL の条件分岐。簡易 CASE と検索 CASE、SELECT / WHERE / ORDER BY / 集約と組み合わせた活用法
NULL の扱い3 値論理、IS NULL / IS NOT NULL、COALESCE / NULLIF / NVL、NULL による集約や比較のハマりどころ
CAST / 型変換明示的な型変換 CAST(x AS type) と :: 記法(PostgreSQL)、暗黙変換の危険と安全な書き方
サブクエリスカラー・行・表サブクエリと相関サブクエリ、EXISTS / IN の使い分け、NOT IN の NULL 罠
CTE (WITH 句)WITH 句で名前付きの一時結果を定義。可読性向上、再帰 CTE で階層構造、MATERIALIZED ヒントにも触れる

結合 (JOIN)

INNER JOIN両側のテーブルに一致する行だけを返す結合。最も基本的な結合方法
LEFT OUTER JOIN左テーブルを基準に、右側に一致行がなければ NULL で埋めて返す結合
FULL OUTER JOIN左右どちらかにある行をすべて返し、もう片方が無ければ NULL で埋める結合
CROSS JOIN結合条件を持たず、左右すべての行の組み合わせ(デカルト積)を返す結合
自己結合 (Self Join)同じテーブルを別エイリアスで結合する手法。組織図や行同士の比較に使う
USING / NATURAL JOIN同名の結合キーを短く書ける USING と、同名列で自動結合する NATURAL JOIN
UNION / INTERSECT / EXCEPT複数の SELECT 結果を縦に合成する集合演算。和・積・差と、重複排除の有無を押さえる

集約・ウィンドウ関数

GROUP BY行をグループ化して集約関数を適用する。SELECT に書ける列の制約や NULL の扱いを理解しよう
HAVINGグループ化後の結果に対する絞り込み。WHERE との違いと使い分けを押さえる
COUNT / SUM / AVG / MIN / MAX基本の集約関数。COUNT(*) と COUNT(col) の違い、NULL を無視する性質を理解する
ウィンドウ関数入門 (OVER / PARTITION BY)GROUP BY と違い行数を潰さず集計する。OVER と PARTITION BY の基本、移動平均の例
ROW_NUMBER / RANK / DENSE_RANK / NTILEランキング系ウィンドウ関数。同値・欠番の扱いが関数ごとに違うので使い分ける
ウィンドウフレーム (ROWS / RANGE)OVER の中の「どこからどこまでを集計するか」を決めるフレーム。デフォルトの落とし穴に注意
LAG / LEAD / FIRST_VALUE / LAST_VALUE前後の行の値を参照するウィンドウ関数。LAG で差分、時系列分析の定番
ROLLUP / CUBE / GROUPING SETS小計・総計を 1 クエリで。ROLLUP は階層、CUBE は全組合せ、GROUPING SETS は任意指定

更新系

INSERTテーブルへの行追加。基本形、複数行まとめて、SELECT 結果から、DEFAULT VALUES まで
UPDATE既存行の値を書き換える。UPDATE ... FROM / JOIN と、WHERE 忘れによる全件更新事故
DELETE行を削除する。DELETE USING (PostgreSQL)、外部キー制約、TRUNCATE との違い
MERGE / UPSERT存在すれば UPDATE、なければ INSERT。標準 MERGE と PostgreSQL / MySQL の方言
RETURNING / OUTPUTINSERT/UPDATE/DELETE の影響行を返す。PostgreSQL RETURNING、SQL Server OUTPUT、MySQL 非対応
TRUNCATEテーブルを高速に全削除する DDL 寄りの操作。DELETE との違いと MySQL の暗黙コミット

スキーマ定義 (DDL)

CREATE TABLEテーブルを定義する基本 DDL。列名・データ型・DEFAULT・NOT NULL・コメントの書き方を整理
ALTER TABLE既存テーブルのスキーマ変更。列追加・削除・型変更・デフォルト変更と本番でのロック注意点
DROP TABLEテーブル削除の DDL。CASCADE / RESTRICT、IF EXISTS の使い分けと事故防止のポイント
制約 (PRIMARY KEY / FOREIGN KEY / UNIQUE / CHECK / NOT NULL)データ整合性を DB レベルで守るための制約。主キー・外部キー・一意・CHECK・複合キー・DEFERRABLE を整理
CREATE INDEXインデックス作成の DDL。基本・UNIQUE・部分インデックス・式インデックス・CONCURRENTLY / INPLACE の使い分け
CREATE VIEW / MATERIALIZED VIEW通常ビューとマテリアライズドビューの違い、更新可能ビューの条件、リフレッシュ戦略
データ型の概要SQL の主要データ型まとめ。数値・文字列・日付時刻・BOOLEAN・JSON・配列の特徴と RDBMS 差分

トランザクション

BEGIN / COMMIT / ROLLBACKトランザクションの開始・確定・取り消しを行う基本コマンド。ACID の I (独立性) を支える仕組み
SAVEPOINTトランザクション内に中間保存点を作り、部分的にロールバックできる仕組み
分離レベル (Isolation Levels)READ UNCOMMITTED / READ COMMITTED / REPEATABLE READ / SERIALIZABLE の 4 段階と発生する異常現象
ロック (Locking)楽観的ロック vs 悲観的ロック、SELECT ... FOR UPDATE、SKIP LOCKED / NOWAIT の使い分け
デッドロック (Deadlock)複数トランザクションが互いのロックを待ち続けて止まる状態。検知とアプリ側のリトライが基本

RDBMS 差分

件数制限の方言 (LIMIT / TOP / FETCH)SELECT の返却行数を制限する書き方は RDBMS ごとに異なる。LIMIT / TOP / FETCH FIRST の違いと移植のコツを解説
UPSERT の方言 (ON CONFLICT / ON DUPLICATE / MERGE)存在すれば UPDATE、無ければ INSERT の UPSERT は RDBMS で記法が大きく異なる。PostgreSQL/MySQL/SQLite/SQL Server の比較
自動採番の方言 (SERIAL / AUTO_INCREMENT / IDENTITY)主キーの自動採番は SERIAL / IDENTITY / AUTO_INCREMENT / ROWID と RDBMS ごとに別物。定義方法と挿入直後の ID 取得方法を比較
日付関数の方言 (NOW / DATE_ADD / TO_CHAR)現在時刻・日付加算・フォーマットは RDBMS 差分が大きい。NOW / GETDATE / CURRENT_TIMESTAMP、INTERVAL / DATE_ADD / DATEADD を比較
文字列連結の方言 (|| / CONCAT / +)文字列連結の演算子は RDBMS で異なる。標準の || / MySQL の CONCAT / SQL Server の + と NULL の扱い
識別子クォートと大文字小文字 ("" / `` / [])列名やテーブル名のクォート記号は RDBMS で異なる。ダブルクォート / バッククォート / 角括弧、および大文字小文字の扱いを比較