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 / OUTPUT INSERT/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 で異なる。ダブルクォート / バッククォート / 角括弧、および大文字小文字の扱いを比較