目的別 SQL クイックリファレンス
データ検索 (SELECT)
テーブルから情報を取得するための基本的な操作です。
基本的な検索
- 全ての列を取得:
- 特定の列を取得:
- 重複を除外して取得 (DISTINCT):
- 別名 (エイリアス) を使用:
条件指定 (WHERE)
特定の条件に一致する行のみを取得します。
- 基本的な比較演算子: `=`, `<>` (または `!=`), `<`, `>`, `<=`, `>=`
- 論理演算子 (AND, OR, NOT):
- 範囲指定 (BETWEEN):
- リスト指定 (IN):
- パターンマッチング (LIKE): `%` (任意の文字列), `_` (任意の1文字)
注意: エスケープ文字はデータベースによって異なる場合があります (例: `\`)
- NULL 値の判定 (IS NULL, IS NOT NULL):
結果の並び替え (ORDER BY)
取得した結果を指定した列で並び替えます。
- 昇順 (ASC – デフォルト):
- 降順 (DESC):
- 複数列での並び替え:
- 列番号での指定 (非推奨だが可能):
結果の制限 (LIMIT / TOP / ROWNUM)
取得する行数を制限します。構文はデータベース製品によって異なります。
データベース | 構文例 (先頭からN件) | 構文例 (M行目からN件) |
---|---|---|
MySQL, PostgreSQL, SQLite | ||
SQL Server | ||
Oracle |
集計関数とグループ化 (Aggregate Functions, GROUP BY, HAVING)
データをグループ化し、各グループに対して集計を行います。
- 主な集計関数:
- `COUNT()`: 行数を数える ( `COUNT(*)`: 全行数, `COUNT(列名)`: NULL以外の行数, `COUNT(DISTINCT 列名)`: 重複を除いた行数)
- `SUM(列名)`: 合計値
- `AVG(列名)`: 平均値
- `MAX(列名)`: 最大値
- `MIN(列名)`: 最小値
- グループ化 (GROUP BY): 特定の列の値が同じ行をグループ化し、集計関数を適用します。`SELECT`句には`GROUP BY`で指定した列か集計関数しか記述できません。
- グループ化後の条件指定 (HAVING): `GROUP BY`でグループ化された結果に対して条件を指定します。`WHERE`句はグループ化前の行に対する条件指定です。
テーブル結合 (JOIN)
複数のテーブルを関連する列を基に結合します。
JOINの種類 | 説明 | 構文例 |
---|---|---|
INNER JOIN (または JOIN) | 両方のテーブルに結合キーが存在する行のみを結合します。 | |
LEFT JOIN (または LEFT OUTER JOIN) | 左側のテーブル(t1)の全ての行と、右側のテーブル(t2)で結合キーが一致する行を結合します。一致しない場合は右側の列はNULLになります。 | |
RIGHT JOIN (または RIGHT OUTER JOIN) | 右側のテーブル(t2)の全ての行と、左側のテーブル(t1)で結合キーが一致する行を結合します。一致しない場合は左側の列はNULLになります。 | |
FULL OUTER JOIN | 左右両方のテーブルの全ての行を結合します。どちらかのテーブルにしか存在しない場合は、存在しない側の列はNULLになります。(MySQLは標準ではサポートしていません) | |
CROSS JOIN | 両方のテーブルの行の全ての組み合わせ(デカルト積)を生成します。結合条件は指定しません。 | |
SELF JOIN | 同じテーブル同士を結合します。テーブルに別名をつける必要があります。 |
副問い合わせ (Subquery)
クエリの中に別のクエリを埋め込む方法です。
- SELECT句内の副問い合わせ (スカラ副問い合わせ): 単一の値を返す必要があります。
- FROM句内の副問い合わせ (インラインビュー): 結果セットを一時的なテーブルとして扱います。
- WHERE句内の副問い合わせ:
- 単一値を返す副問い合わせ: 比較演算子 (`=`, `>`, etc.) と共に使用します。
- リストを返す副問い合わせ: `IN`, `NOT IN` と共に使用します。
- 存在確認: `EXISTS`, `NOT EXISTS` と共に使用します。副問い合わせが1行でも返せば真。
- 比較演算子 (`ANY`, `SOME`, `ALL`) と共に使用します。
- 相関副問い合わせ (Correlated Subquery): 外側のクエリの列を内側の副問い合わせが参照するものです。外側のクエリの行ごとに実行されるため、パフォーマンスに影響が出ることがあります。
ウィンドウ関数 (Window Functions)
行のセット(ウィンドウ)に対して計算を行いますが、`GROUP BY`のように行を集約しません。各行に対して計算結果を返します。分析関数とも呼ばれます。
`関数名() OVER ( [PARTITION BY 列…] [ORDER BY 列…] [ROWS BETWEEN … AND …] )` の形式で使用します。
- ランキング関数:
- `ROW_NUMBER()`: ウィンドウ内で一意の連番を付与 (同順位でも異なる番号)
- `RANK()`: 順位を付与 (同順位は同じ番号、次の順位は飛ぶ)
- `DENSE_RANK()`: 順位を付与 (同順位は同じ番号、次の順位は飛ばない)
- `NTILE(n)`: ウィンドウをn個のグループに分割し、グループ番号を付与
- 集計関数 (ウィンドウ関数として使用): `SUM()`, `AVG()`, `COUNT()`, `MAX()`, `MIN()` など
- 値関数:
- `LAG(列 [, オフセット [, デフォルト値]])`: ウィンドウ内の前の行の値を取得
- `LEAD(列 [, オフセット [, デフォルト値]])`: ウィンドウ内の後の行の値を取得
- `FIRST_VALUE(列)`: ウィンドウ内の最初の行の値を取得
- `LAST_VALUE(列)`: ウィンドウ内の最後の行の値を取得
- フレーム句 (ROWS/RANGE BETWEEN): ウィンドウ関数が計算対象とする範囲をより細かく指定します。
- `ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`: 先頭行から現在の行まで (累計計算のデフォルト)
- `ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING`: 前の行、現在の行、次の行
- `ROWS BETWEEN 3 PRECEDING AND CURRENT ROW`: 3つ前の行から現在の行まで (移動平均など)
共通テーブル式 (Common Table Expression – CTE)
`WITH`句を使って、クエリ内で一時的な名前付き結果セットを定義します。複雑なクエリを読みやすくしたり、再帰的なクエリを記述するのに役立ちます。
- 基本的な使い方:
- 再帰CTE (Recursive CTE): 階層構造データ(組織図、親子関係など)を扱う際に有用です。`WITH RECURSIVE` (PostgreSQL, MySQL 8.0+) または `WITH` (SQL Server, Oracle) を使用します。
データ操作 (DML – Data Manipulation Language)
テーブル内のデータを追加、更新、削除します。
データ挿入 (INSERT)
- 1行挿入 (列指定):
- 1行挿入 (全列指定 – 非推奨): 列の順序に依存するため、列指定が推奨されます。
- 複数行挿入 (標準SQL / PostgreSQL / MySQLなど):
- 複数行挿入 (Oracle / SQL Server – UNION ALL を使用):
注意: SQL Server 2008以降、MySQL/PostgreSQL と同様の VALUES 句による複数行挿入も可能です。
- 別のテーブルから挿入 (INSERT INTO … SELECT):
- 存在しない場合のみ挿入 (UPSERT / MERGE): データベースによって構文が異なります。
- MySQL: `INSERT … ON DUPLICATE KEY UPDATE`
- PostgreSQL: `INSERT … ON CONFLICT DO UPDATE / DO NOTHING`
- SQL Server / Oracle: `MERGE`
- SQLite: `INSERT OR REPLACE INTO` または `INSERT OR IGNORE INTO`
データ更新 (UPDATE)
- 特定の行を更新: `WHERE`句で対象行を指定します。指定しないと全行が更新されます。
- 他のテーブルの値を使って更新 (データベースによる違いあり):
- 標準SQL / PostgreSQL / SQL Server: `FROM`句や`JOIN`を使用
- MySQL: `JOIN`を`UPDATE`句の後ろに記述
- Oracle: 副問い合わせや`MERGE`を使用
データ削除 (DELETE)
- 特定の行を削除: `WHERE`句で対象行を指定します。指定しないと全行が削除されます。
- 全行削除 (DELETE vs TRUNCATE):
- `DELETE FROM テーブル名;`: トランザクションログに記録され、ロールバック可能。WHERE句がないだけで、行ごとに削除処理が走る。低速な場合がある。
- `TRUNCATE TABLE テーブル名;`: トランザクションログ記録が最小限(または記録されない)。ロールバック不可な場合が多い。高速だが注意が必要。テーブル構造は残る。Auto Incrementもリセットされることが多い。
- 他のテーブルの条件に基づいて削除 (データベースによる違いあり):
- 標準SQL / PostgreSQL / SQL Server: `USING`句や副問い合わせ、`JOIN`を使用
- MySQL: `JOIN`を使用
- Oracle: 副問い合わせを使用
データ定義 (DDL – Data Definition Language)
データベースオブジェクト(テーブル、インデックスなど)を作成、変更、削除します。
テーブル操作 (TABLE)
- テーブル作成 (CREATE TABLE): 列名、データ型、制約を指定します。
主なデータ型:
分類 主な型 (例) 説明 数値 `INT`, `INTEGER`, `SMALLINT`, `BIGINT`, `DECIMAL(p,s)`, `NUMERIC(p,s)`, `FLOAT`, `REAL`, `DOUBLE PRECISION` 整数、固定小数点数、浮動小数点数 文字列 `CHAR(n)`, `VARCHAR(n)`, `TEXT`, `NCHAR(n)`, `NVARCHAR(n)` (Unicode) 固定長文字列、可変長文字列、長いテキスト 日付/時刻 `DATE`, `TIME`, `TIMESTAMP`, `DATETIME` (DBによる) 日付、時刻、日付と時刻 真偽値 `BOOLEAN`, `BOOL`, `BIT` (DBによる) 真 (True) または偽 (False) バイナリ `BINARY(n)`, `VARBINARY(n)`, `BLOB` バイナリデータ (画像など) 注意: データ型の名称や機能はデータベース製品によって異なります。
- テーブル変更 (ALTER TABLE): 列の追加、削除、変更、制約の追加、削除などを行います。
- テーブル削除 (DROP TABLE): テーブルとそのデータ、インデックス、制約などを完全に削除します。
インデックス操作 (INDEX)
検索パフォーマンスを向上させるために使用します。
- インデックス作成 (CREATE INDEX):
- インデックス削除 (DROP INDEX):
注意: `DROP INDEX` の構文はデータベースによって異なります。
ビュー操作 (VIEW)
一つ以上のテーブルから導出される仮想的なテーブルです。クエリを単純化したり、セキュリティを向上させるために使用します。
- ビュー作成 (CREATE VIEW):
- ビュー変更 (ALTER VIEW or CREATE OR REPLACE VIEW):
- ビュー削除 (DROP VIEW):
データベース/スキーマ操作 (DATABASE / SCHEMA)
データベースやスキーマ(データベース内の名前空間)を管理します。
- データベース作成 (CREATE DATABASE): (DBA権限が必要なことが多い)
- スキーマ作成 (CREATE SCHEMA): (PostgreSQL, SQL Serverなどで使用)
- データベース/スキーマ削除 (DROP DATABASE / DROP SCHEMA): (非常に危険な操作!中のオブジェクトも全て削除される)
データ制御 (DCL – Data Control Language)
ユーザーのアクセス権限を管理します。
権限付与 (GRANT)
ユーザーまたはロールに対して、データベースオブジェクトへの操作権限を与えます。
- 特定の操作権限を付与:
- 権限付与オプション (GRANT OPTION): 他のユーザーに権限を付与する権限も与えます。
- ロールへの権限付与:
権限剥奪 (REVOKE)
ユーザーまたはロールから権限を取り消します。
- 特定の操作権限を剥奪:
- 権限付与オプション (GRANT OPTION) の剥奪: (DBにより `GRANT OPTION FOR` または `CASCADE` などの指定が異なる)
トランザクション制御 (TCL – Transaction Control Language)
一連の DML 操作を一つの処理単位(トランザクション)として管理します。
トランザクションは、原子性(Atomicity)、一貫性(Consistency)、独立性(Isolation)、永続性(Durability)という ACID 特性を保証するための仕組みです。
トランザクションの開始
多くのデータベースでは、最初の DML 文 (INSERT, UPDATE, DELETE) が実行された時点で暗黙的にトランザクションが開始されます (自動コミットが無効な場合)。明示的に開始することも可能です。
注意: 自動コミット(Auto Commit)設定が有効な場合、各 DML 文が即座にコミットされるため、明示的なトランザクション制御が必要です。
変更の確定 (COMMIT)
トランザクション内の全ての変更を確定し、データベースに永続的に反映させます。
変更の取り消し (ROLLBACK)
トランザクション内の全ての変更を取り消し、トランザクション開始前の状態に戻します。
セーブポイント (SAVEPOINT)
トランザクション内に中間ポイントを設定し、そこまでロールバックできるようにします。
- セーブポイントの設定:
- セーブポイントまでロールバック:
- セーブポイントの解放 (任意、COMMIT/ROLLBACKで自動解放されることが多い):
注意: `RELEASE SAVEPOINT` はサポートされていない、または不要なデータベースもあります。
使用例:
その他の便利な機能・関数
SQL をより強力にする様々な機能
条件分岐 (CASE 式)
条件に応じて返す値を切り替えます。
- 単純 CASE 式: 列の値が特定の値と一致するかで分岐
- 検索 CASE 式: より複雑な条件で分岐
- UPDATE 文での利用:
NULL 値の処理関数
- COALESCE(値1, 値2, …): 引数の中で最初に NULL でない値を返します。全て NULL なら NULL を返します。
- NULLIF(値1, 値2): 値1 と 値2 が等しい場合は NULL を返し、等しくない場合は 値1 を返します。ゼロ除算を防ぐのに使われることがあります。
- ISNULL(値, 置換値) (SQL Server): 値が NULL なら置換値を返します。
- IFNULL(値, 置換値) (MySQL): 値が NULL なら置換値を返します。`COALESCE`と似ていますが、引数は2つです。
- NVL(値, 置換値) (Oracle): 値が NULL なら置換値を返します。`COALESCE`と似ていますが、引数は2つです。
文字列操作関数
データベース製品によって関数名や挙動が異なる場合が多いです。
機能 | 関数例 (標準/代表的) | 説明 |
---|---|---|
連結 | `||` (標準/PostgreSQL/Oracle), `CONCAT()` (標準/MySQL/PostgreSQL/SQL Server 2012+), `+` (SQL Server) | 文字列を結合する (`SELECT ‘A’ || ‘B’;` or `SELECT CONCAT(‘A’, ‘B’);`) |
長さ | `LENGTH()`, `LEN()` (SQL Server), `CHAR_LENGTH()` | 文字列の長さを返す (`SELECT LENGTH(‘abc’);`) |
部分文字列 | `SUBSTRING(str FROM start FOR len)`, `SUBSTR(str, start, len)` | 文字列の一部を抽出する (`SELECT SUBSTRING(‘abcdef’ FROM 2 FOR 3); — ‘bcd’`) |
置換 | `REPLACE(str, from_str, to_str)` | 文字列中の特定の部分を置換する (`SELECT REPLACE(‘abc abc’, ‘b’, ‘X’); — ‘aXc aXc’`) |
大文字/小文字変換 | `UPPER()`, `LOWER()` | 文字列を大文字または小文字に変換する (`SELECT UPPER(‘abc’), LOWER(‘XYZ’);`) |
トリム | `TRIM()`, `LTRIM()`, `RTRIM()` | 文字列の前後の空白(または指定文字)を除去する (`SELECT TRIM(‘ abc ‘); — ‘abc’`) |
位置検索 | `POSITION(substr IN str)`, `INSTR(str, substr)`, `CHARINDEX(substr, str)` (SQL Server) | 文字列内で部分文字列が最初に出現する位置を返す (`SELECT POSITION(‘b’ IN ‘abc’); — 2`) |
日付/時刻操作関数
データベース製品によって関数名や構文が大きく異なります。
機能 | 関数例 (代表的) | 説明 |
---|---|---|
現在日時取得 | `CURRENT_TIMESTAMP`, `NOW()`, `GETDATE()` (SQL Server), `SYSDATE` (Oracle) | 現在のサーバーの日付と時刻を取得する |
現在日付取得 | `CURRENT_DATE`, `CURDATE()` (MySQL) | 現在の日付を取得する |
日付/時刻要素抽出 | `EXTRACT(unit FROM date)`, `DATE_PART(unit, date)` (PostgreSQL), `YEAR()`, `MONTH()`, `DAY()` (MySQL, SQL Server) | 日付/時刻から年、月、日、時、分などを抽出する (`SELECT EXTRACT(YEAR FROM CURRENT_DATE);`) |
日付/時刻加減算 | `date + INTERVAL ‘n unit’`, `DATE_ADD(date, INTERVAL n unit)`, `DATEADD(unit, n, date)` (SQL Server) | 日付/時刻に期間を加算/減算する (`SELECT CURRENT_DATE + INTERVAL ‘1’ MONTH;`) |
日付/時刻差分計算 | `date1 – date2`, `DATEDIFF(unit, date1, date2)` (SQL Server, MySQL), `AGE(date1, date2)` (PostgreSQL) | 二つの日付/時刻の差を計算する |
書式設定 | `TO_CHAR(date, format)` (Oracle, PostgreSQL), `FORMAT(date, format)` (SQL Server 2012+), `DATE_FORMAT(date, format)` (MySQL) | 日付/時刻を指定した書式に変換する (`SELECT TO_CHAR(NOW(), ‘YYYY/MM/DD HH24:MI:SS’);`) |