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