SQL チートシート
最終更新
データの問い合わせ (SELECT)
SQL の中核: 1 つまたは複数のテーブルから行を読み取ります。
| 操作 | 構文 |
|---|---|
| すべての列を選択 | SELECT * FROM users; |
| 特定の列を選択 | SELECT id, name FROM users; |
| 列名を変更 (別名) | SELECT name AS full_name FROM users; |
| 重複しない値 | SELECT DISTINCT country FROM users; |
| 行数を制限 | SELECT * FROM users LIMIT 10; |
| スキップしてから制限 (ページング) | SELECT * FROM users LIMIT 10 OFFSET 20; |
| 行数をカウント | SELECT COUNT(*) FROM users; |
行の絞り込み (WHERE)
クエリが返す行を絞り込みます。
| 操作 | 構文 |
|---|---|
| 等価 / 比較 | WHERE age >= 18 |
| 複数条件 | WHERE age >= 18 AND country = 'US' |
| いずれかの条件 | WHERE role = 'admin' OR role = 'owner' |
| 集合に含まれる | WHERE country IN ('US', 'CA', 'MX') |
| 範囲内 | WHERE price BETWEEN 10 AND 50 |
| パターンマッチ | WHERE email LIKE '%@gmail.com' |
| null かどうか | WHERE deleted_at IS NULL |
| 否定 | WHERE status NOT IN ('archived') |
並べ替えとグループ化
| 操作 | 構文 |
|---|---|
| 昇順で並べ替え (既定) | ORDER BY created_at |
| 降順で並べ替え | ORDER BY created_at DESC |
| 複数列で並べ替え | ORDER BY country, name DESC |
| 行をグループ化 | SELECT country, COUNT(*) FROM users GROUP BY country; |
| グループを絞り込み | GROUP BY country HAVING COUNT(*) > 100 |
結合 (JOIN)
一致する列を基準に、2 つのテーブルの行を結合します。
| 結合の種類 | 返す内容 | 構文 |
|---|---|---|
| INNER JOIN | 両方のテーブルで一致する行のみ | FROM orders o INNER JOIN users u ON o.user_id = u.id |
| LEFT JOIN | 左側の全行 + 一致 (一致がなければ null) | FROM users u LEFT JOIN orders o ON o.user_id = u.id |
| RIGHT JOIN | 右側の全行 + 一致 | FROM orders o RIGHT JOIN users u ON o.user_id = u.id |
| FULL OUTER JOIN | 両側のすべての行 | FROM a FULL OUTER JOIN b ON a.id = b.a_id |
| CROSS JOIN | すべての組み合わせ (直積) | FROM sizes CROSS JOIN colors |
| 自己結合 | テーブルを自分自身と結合 | FROM employees e JOIN employees m ON e.manager_id = m.id |
集計関数
行のグループ全体から単一の値を計算します。
| 関数 | 機能 |
|---|---|
COUNT(*) | 行数 |
COUNT(col) | null でない値の数 |
SUM(col) | 数値列の合計 |
AVG(col) | 平均値 |
MIN(col) / MAX(col) | 最小値 / 最大値 |
STRING_AGG(col, ',') | 値を連結 (Postgres、MySQL では GROUP_CONCAT) |
ウィンドウ関数
複数の行をまとめてしまわずに、その行の集合に対して計算します。
| 関数 | 構文 |
|---|---|
| 行番号 | ROW_NUMBER() OVER (ORDER BY score DESC) |
| ランク (順位に飛びあり) | RANK() OVER (PARTITION BY country ORDER BY score DESC) |
| 連続ランク | DENSE_RANK() OVER (ORDER BY score DESC) |
| 累計 | SUM(amount) OVER (ORDER BY created_at) |
| 前後の行 | LAG(score) OVER (ORDER BY date), LEAD(score) OVER (...) |
データの変更 (INSERT, UPDATE, DELETE)
| 操作 | 構文 |
|---|---|
| 行を挿入 | INSERT INTO users (name, email) VALUES ('Ada', 'ada@x.com'); |
| 複数行を挿入 | INSERT INTO users (name) VALUES ('Ada'), ('Alan'); |
| 行を更新 | UPDATE users SET active = true WHERE id = 1; |
| 行を削除 | DELETE FROM users WHERE active = false; |
| アップサート (Postgres/SQLite) | INSERT ... ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name; |
テーブルの定義 (DDL)
| 操作 | 構文 |
|---|---|
| テーブルを作成 | CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL); |
| 列を追加 | ALTER TABLE users ADD COLUMN age INTEGER; |
| 列を削除 | ALTER TABLE users DROP COLUMN age; |
| テーブルを削除 | DROP TABLE users; |
| インデックスを作成 | CREATE INDEX idx_users_email ON users (email); |
| 外部キー | FOREIGN KEY (user_id) REFERENCES users (id) |
よく使う SQL のステートメント、句、結合を 1 ページにまとめました。この SQL チートシートは、リレーショナルデータの問い合わせと変更のためのクイックリファレンスです。SELECT 句、4 種類の JOIN、集計、そしてテーブルの作成・更新に使う DDL と DML を収録しています。
ここで紹介する構文は標準の ANSI SQL で、特記がない限り PostgreSQL、MySQL、SQLite、SQL Server で動作します。必要なものをコピーするか、SQL プレイグラウンドですべてのクエリをその場で試してみてください。データベースのインストールは不要です。
SQL チートシート よくある質問
この SQL チートシートは無料ですか?
はい。この SQL チートシートは完全に無料で、登録も不要です。ブックマークしておけば、句や結合、関数を調べたいときにいつでも戻ってこられます。
MySQL、PostgreSQL、SQLite で動きますか?
ほとんどの場合、動きます。ここで紹介している
SELECT、WHERE、JOIN、GROUP BY、DDL の構文は標準の ANSI SQL で、MySQL、PostgreSQL、SQLite、SQL Server で同じように動作します。いくつかの高度な機能は方言によって異なり、アップサートと文字列の集計が代表例です。該当する行ではその違いを注記しています。INNER JOIN と LEFT JOIN の違いは何ですか?
INNER JOIN は両方のテーブルで一致する行のみを返します。LEFT JOIN は左側 (最初) のテーブルのすべての行を返し、右側のテーブルに一致がない場合は右側の列を NULL で埋めます。注文のないユーザーがいてもすべてのユーザーを取得したいときに便利です。これらの SQL コマンドをオンラインで練習できますか?
はい。SQL プレイグラウンドを開けば、このチートシートのどのクエリも、ブラウザ上で本物のデータベースに対して実行できます。インストールは不要です。体系的に学びたいときは、Coddy の無料インタラクティブ SQL コースが、
SELECT から結合、ウィンドウ関数まで段階的に導いてくれます。このチートシートは初心者に向いていますか?
はい。最もよく使う操作 (問い合わせと絞り込み) から高度なもの (ウィンドウ関数) へと並べてあるので、初日から上のセクションを使い、残りには慣れながら進めます。