【データベース】SQLクエリチートシート - j-komatsu/myCheatSheet GitHub Wiki
SQLクエリチートシート
目的
SQLクエリの基本操作から応用までを整理し、効率的なデータ操作や分析をサポートする。
インデックス
- データの選択 (SELECT)
- 条件付きデータ取得 (WHERE)
- データの挿入 (INSERT)
- データの更新 (UPDATE)
- データの削除 (DELETE)
- 並び替え (ORDER BY)
- グループ化 (GROUP BY)
- 集計関数 (COUNT, SUM, AVG)
- テーブル結合 (JOIN)
- サブクエリの使用
- ビューの作成と操作
- データの重複除去 (DISTINCT)
- NULL値の処理
- トランザクションの管理
- HAVING句
- EXISTS句
- CASE文
- UNION / UNION ALL
- LIMIT / OFFSET
- COALESCE関数
- ALTER TABLE
- TRUNCATE TABLE
- WITH句 (共通テーブル式, CTE)
- WINDOW関数
- IN / NOT IN句
- JSON関数
- FULL OUTER JOIN
- INDEXの作成
1. データの選択 (SELECT)
- 目的: テーブルから特定の列または全列を取得する。
- 構文:
SELECT [列名1], [列名2] FROM [テーブル名];
- 使用例:
全ての列を取得。
SELECT * FROM employees;
2. 条件付きデータ取得 (WHERE)
- 目的: 条件を指定してデータを取得する。
- 構文:
SELECT [列名] FROM [テーブル名] WHERE [条件];
- 使用例:
年齢が30以上の従業員を取得。
SELECT name, age FROM employees WHERE age >= 30;
3. データの挿入 (INSERT)
- 目的: 新しいデータをテーブルに挿入する。
- 構文:
INSERT INTO [テーブル名] ([列名1], [列名2]) VALUES ([値1], [値2]);
- 使用例:
新しい従業員を追加。
INSERT INTO employees (name, age) VALUES ('John Doe', 28);
4. データの更新 (UPDATE)
- 目的: 既存のデータを更新する。
- 構文:
UPDATE [テーブル名] SET [列名] = [値] WHERE [条件];
- 使用例:
特定の従業員の年齢を更新。
UPDATE employees SET age = 29 WHERE name = 'John Doe';
5. データの削除 (DELETE)
- 目的: 条件に一致するデータを削除する。
- 構文:
DELETE FROM [テーブル名] WHERE [条件];
- 使用例:
特定の従業員を削除。
DELETE FROM employees WHERE name = 'John Doe';
6. 並び替え (ORDER BY)
- 目的: データを指定した列で昇順または降順に並び替える。
- 構文:
SELECT [列名] FROM [テーブル名] ORDER BY [列名] [ASC|DESC];
- 使用例:
年齢の降順で並び替え。
SELECT name, age FROM employees ORDER BY age DESC;
7. グループ化 (GROUP BY)
- 目的: データを特定の列でグループ化して集計する。
- 構文:
SELECT [列名], [集計関数] FROM [テーブル名] GROUP BY [列名];
- 使用例:
部署ごとの平均給与を計算。
SELECT department, AVG(salary) FROM employees GROUP BY department;
8. 集計関数 (COUNT, SUM, AVG)
- 目的: データの集計を行う。
- 構文:
SELECT [集計関数]([列名]) FROM [テーブル名];
- 使用例:
従業員の合計数を取得。
SELECT COUNT(*) FROM employees;
9. テーブル結合 (JOIN)
- 目的: 複数のテーブルを関連付けてデータを取得する。
- 構文:
SELECT [列名] FROM [テーブル1] INNER JOIN [テーブル2] ON [条件];
- 使用例:
従業員と部署情報を結合。
SELECT employees.name, departments.name FROM employees INNER JOIN departments ON employees.department_id = departments.id;
10. サブクエリの使用
- 目的: クエリ内で別のクエリを使用する。
- 構文:
SELECT [列名] FROM [テーブル名] WHERE [列名] IN (SELECT [列名] FROM [別のテーブル]);
- 使用例:
特定の給与以上の従業員を取得。
SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
11. ビューの作成と操作
- 目的: クエリ結果を仮想テーブルとして保存し、再利用可能にする。
- 構文:
CREATE VIEW [ビュー名] AS [クエリ];
- 使用例:
高収入従業員のビューを作成。
CREATE VIEW high_salary_employees AS SELECT name, salary FROM employees WHERE salary > 5000;
12. データの重複除去 (DISTINCT)
- 目的: 重複するデータを除外して取得する。
- 構文:
SELECT DISTINCT [列名] FROM [テーブル名];
- 使用例:
重複のない部署リストを取得。
SELECT DISTINCT department FROM employees;
13. NULL値の処理
- 目的: NULL値を考慮してクエリを実行する。
- 構文:
SELECT [列名] FROM [テーブル名] WHERE [列名] IS NULL;
- 使用例:
部署が未設定の従業員を取得。
SELECT name FROM employees WHERE department_id IS NULL;
14. トランザクションの管理
- 目的: 複数の操作を一括して管理し、必要に応じてロールバックする。
- 構文:
BEGIN TRANSACTION; [SQL操作] COMMIT;
- 使用例:
データ更新中にエラーが発生した場合のロールバック。
BEGIN TRANSACTION; UPDATE employees SET salary = salary * 1.1 WHERE department = 'Sales'; ROLLBACK;
15. HAVING句
- 目的: GROUP BY句でグループ化した結果に条件を適用する。
- 構文:
SELECT [列名], [集計関数] FROM [テーブル名] GROUP BY [列名] HAVING [条件];
- 使用例:
従業員数が5人以上の部署を取得。
SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department HAVING COUNT(*) > 5;
16. EXISTS句
- 目的: サブクエリの結果が存在するかを確認する。
- 構文:
SELECT [列名] FROM [テーブル名] WHERE EXISTS (サブクエリ);
- 使用例:
プロジェクトを担当している従業員を取得。
SELECT name FROM employees e WHERE EXISTS (SELECT 1 FROM projects p WHERE p.employee_id = e.id);
17. CASE文
- 目的: 条件に応じて異なる値を返す。
- 構文:
SELECT [列名], CASE WHEN [条件1] THEN [値1] WHEN [条件2] THEN [値2] ELSE [値3] END AS [新しい列名] FROM [テーブル名];
- 使用例:
給与レベルを表示。
SELECT name, CASE WHEN salary > 5000 THEN 'High' WHEN salary BETWEEN 3000 AND 5000 THEN 'Medium' ELSE 'Low' END AS salary_level FROM employees;
18. UNION / UNION ALL
- 目的: 複数のクエリ結果を結合する。
- 構文:
SELECT [列名] FROM [テーブル名1] UNION [ALL] SELECT [列名] FROM [テーブル名2];
- 使用例:
従業員とマネージャーの名前を結合。
SELECT name FROM employees UNION SELECT name FROM managers;
19. LIMIT / OFFSET
- 目的: 結果セットの取得件数や開始位置を制限する。
- 構文:
SELECT [列名] FROM [テーブル名] LIMIT [件数] OFFSET [開始位置];
- 使用例:
20件目から10件を取得。
SELECT * FROM employees LIMIT 10 OFFSET 20;
20. COALESCE関数
- 目的: NULL値をデフォルト値で置き換える。
- 構文:
SELECT COALESCE([列名], [デフォルト値]) FROM [テーブル名];
- 使用例:
部署が未設定の従業員に'Default'を表示。
SELECT name, COALESCE(department, 'Default') AS department FROM employees;
21. ALTER TABLE
- 目的: 既存のテーブルを変更する(列の追加、削除、変更など)。
- 構文:
ALTER TABLE [テーブル名] ADD COLUMN [列名] [データ型];
- 使用例:
従業員テーブルに電話番号列を追加。
ALTER TABLE employees ADD COLUMN phone_number VARCHAR(15);
22. TRUNCATE TABLE
- 目的: テーブルの全データを高速に削除する(ログを残さない)。
- 構文:
TRUNCATE TABLE [テーブル名];
- 使用例:
従業員テーブルを初期化。
TRUNCATE TABLE employees;
23. WITH句 (共通テーブル式, CTE)
- 目的: 再利用可能なクエリを一時的に定義する。
- 構文:
WITH [名前] AS ([クエリ]) SELECT [列名] FROM [名前];
- 使用例:
部署ごとの従業員数を計算。
WITH EmployeeCount AS ( SELECT department, COUNT(*) AS count FROM employees GROUP BY department ) SELECT * FROM EmployeeCount WHERE count > 5;
24. WINDOW関数
- 目的: ウィンドウ関数を使ってデータを集計する。
- 構文:
SELECT [列名], [ウィンドウ関数] OVER ([ウィンドウ定義]) AS [新しい列名] FROM [テーブル名];
- 使用例:
各従業員の給与順位を計算。
SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank FROM employees;
25. IN / NOT IN句
- 目的: 指定した値のリストに一致するかを確認する。
- 構文:
SELECT [列名] FROM [テーブル名] WHERE [列名] IN ([値1], [値2], ...);
- 使用例:
特定の部署IDを持つ従業員を取得。
SELECT name FROM employees WHERE department_id IN (1, 2, 3);
26. JSON関数
- 目的: JSONデータの操作。
- 構文:
SELECT json_extract([列名], '[JSONパス]') FROM [テーブル名];
- 使用例:
JSON列から特定の値を取得。
SELECT json_extract(data, '$.name') AS name FROM employees;
27. FULL OUTER JOIN
- 目的: 両方のテーブルに存在するすべてのデータを取得。
- 構文:
SELECT [列名] FROM [テーブル1] FULL OUTER JOIN [テーブル2] ON [条件];
- 使用例:
従業員と部署情報を完全結合。
SELECT e.name, d.department_name FROM employees e FULL OUTER JOIN departments d ON e.department_id = d.id;
28. INDEXの作成
- 目的: クエリのパフォーマンスを向上させるためのインデックス作成。
- 構文:
CREATE INDEX [インデックス名] ON [テーブル名] ([列名]);
- 使用例:
従業員名の検索を高速化するインデックスを作成。
CREATE INDEX idx_employee_name ON employees (name);