CheatSheet
日本語 icon日本語English iconEnglish
チートシートとはカンニングペーパーのことです。それが転じて、本来覚えることをまとめておいたものです。
要点をすぐに参照できるようにまとめてみました。

SQL

エンジニアのためのWebチートシート

SQL(Structured Query Language)は、リレーショナルデータベースを操作するための言語です。 SELECT、INSERT、UPDATE、DELETE、JOIN、集約関数などの基本構文をチートシートにまとめました。

基本クエリ

SELECT

  • テーブルからデータを取得します。

    -- 全カラム取得
    SELECT * FROM users;
    
    -- 特定カラム
    SELECT name, email FROM users;
    
    -- エイリアス
    SELECT name AS user_name,
           email AS user_email
    FROM users;

SELECT DISTINCT

  • 重複を除外してデータを取得します。

    SELECT DISTINCT department
    FROM employees;
    
    SELECT DISTINCT city, country
    FROM customers;

ORDER BY

  • 結果を並び替えます。

    -- 昇順(デフォルト)
    SELECT * FROM users ORDER BY name ASC;
    
    -- 降順
    SELECT * FROM users ORDER BY created_at DESC;
    
    -- 複数カラム
    SELECT * FROM users
    ORDER BY department ASC, name DESC;

LIMIT / OFFSET

  • 取得する行数を制限します。

    -- 先頭10行
    SELECT * FROM users LIMIT 10;
    
    -- 11行目から10行取得
    SELECT * FROM users LIMIT 10 OFFSET 10;
    
    -- ページネーション
    SELECT * FROM users
    ORDER BY id
    LIMIT 20 OFFSET 40;  -- 3ページ目

フィルタリング

WHERE

  • 条件を指定してデータを絞り込みます。

    SELECT * FROM users
    WHERE age >= 20;
    
    SELECT * FROM products
    WHERE price > 1000
      AND category = 'electronics';

LIKE(パターンマッチ)

  • ワイルドカードを使ったパターンマッチングです。

    -- %: 任意の0文字以上
    SELECT * FROM users
    WHERE name LIKE '田%';      -- 田で始まる
    
    SELECT * FROM users
    WHERE email LIKE '%@gmail.com'; -- Gmailアドレス
    
    -- _: 任意の1文字
    SELECT * FROM users
    WHERE name LIKE '田_';      -- 田+1文字

IN / BETWEEN

  • 値のリストや範囲を指定して絞り込みます。

    -- IN: リスト内の値
    SELECT * FROM users
    WHERE department IN ('sales', 'marketing', 'hr');
    
    -- BETWEEN: 範囲
    SELECT * FROM orders
    WHERE created_at BETWEEN '2024-01-01' AND '2024-12-31';
    
    -- NOT IN
    SELECT * FROM users
    WHERE status NOT IN ('inactive', 'banned');

NULL判定

  • NULLの判定にはIS NULL / IS NOT NULLを使います。

    -- NULLの判定(= NULLは使えない)
    SELECT * FROM users
    WHERE deleted_at IS NULL;
    
    SELECT * FROM users
    WHERE phone IS NOT NULL;
    
    -- COALESCE: NULLの代替値
    SELECT COALESCE(phone, 'N/A') FROM users;

JOIN(結合)

INNER JOIN

  • 両方のテーブルに一致する行のみ取得します。

    SELECT u.name, o.total
    FROM users u
    INNER JOIN orders o ON u.id = o.user_id;
    
    -- 複数JOIN
    SELECT u.name, o.total, p.name AS product
    FROM users u
    JOIN orders o ON u.id = o.user_id
    JOIN products p ON o.product_id = p.id;

LEFT / RIGHT JOIN

  • 一方のテーブルの全行と、もう一方の一致する行を取得します。

    -- LEFT JOIN: 左テーブルの全行
    SELECT u.name, o.total
    FROM users u
    LEFT JOIN orders o ON u.id = o.user_id;
    
    -- 注文がないユーザーも含まれる
    -- o.total は NULL になる
    
    -- RIGHT JOIN: 右テーブルの全行
    SELECT u.name, o.total
    FROM users u
    RIGHT JOIN orders o ON u.id = o.user_id;

集約

GROUP BY

  • 指定したカラムでグループ化します。

    SELECT department, COUNT(*) AS count
    FROM employees
    GROUP BY department;
    
    SELECT category, AVG(price) AS avg_price
    FROM products
    GROUP BY category
    ORDER BY avg_price DESC;

HAVING

  • GROUP BY後の結果に条件を適用します。

    SELECT department, COUNT(*) AS count
    FROM employees
    GROUP BY department
    HAVING COUNT(*) >= 5;
    
    SELECT user_id, SUM(total) AS total_spent
    FROM orders
    GROUP BY user_id
    HAVING SUM(total) > 10000;

主な集約関数の一覧です。

関数説明
COUNT(*)

行数

SUM(col)

合計

AVG(col)

平均

MAX(col)

最大値

MIN(col)

最小値

COUNT(DISTINCT col)

重複を除いた行数

GROUP_CONCAT(col)

値を連結

サブクエリ

スカラサブクエリ

  • 1つの値を返すサブクエリです。

    SELECT name, salary,
      (SELECT AVG(salary) FROM employees) AS avg_salary
    FROM employees
    WHERE salary > (SELECT AVG(salary) FROM employees);

EXISTS / IN サブクエリ

  • サブクエリの結果を条件に使います。

    -- EXISTS
    SELECT * FROM users u
    WHERE EXISTS (
      SELECT 1 FROM orders o
      WHERE o.user_id = u.id
    );
    
    -- IN サブクエリ
    SELECT * FROM users
    WHERE id IN (
      SELECT user_id FROM orders
      WHERE total > 10000
    );

データ操作

INSERT

  • テーブルに新しい行を挿入します。

    -- 単一行
    INSERT INTO users (name, email)
    VALUES ('Taro', 'taro@example.com');
    
    -- 複数行
    INSERT INTO users (name, email) VALUES
      ('Taro', 'taro@example.com'),
      ('Hanako', 'hanako@example.com');
    
    -- SELECT結果を挿入
    INSERT INTO archive_users
    SELECT * FROM users WHERE deleted_at IS NOT NULL;

UPDATE

  • 既存の行を更新します。

    UPDATE users
    SET email = 'new@example.com'
    WHERE id = 1;
    
    -- 複数カラム
    UPDATE products
    SET price = price * 1.1,
        updated_at = NOW()
    WHERE category = 'food';

DELETE

  • 行を削除します。

    DELETE FROM users WHERE id = 1;
    
    -- 条件付き削除
    DELETE FROM sessions
    WHERE expired_at < NOW();
    
    -- 全行削除
    TRUNCATE TABLE temp_data;

テーブル操作

CREATE TABLE

  • 新しいテーブルを作成します。

    CREATE TABLE users (
      id         INT PRIMARY KEY AUTO_INCREMENT,
      name       VARCHAR(100) NOT NULL,
      email      VARCHAR(255) UNIQUE NOT NULL,
      age        INT DEFAULT 0,
      created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      CONSTRAINT chk_age CHECK (age >= 0)
    );

ALTER TABLE

  • テーブル構造を変更します。

    -- カラム追加
    ALTER TABLE users ADD COLUMN phone VARCHAR(20);
    
    -- カラム変更
    ALTER TABLE users MODIFY COLUMN name VARCHAR(200);
    
    -- カラム削除
    ALTER TABLE users DROP COLUMN phone;
    
    -- テーブル名変更
    ALTER TABLE users RENAME TO members;

INDEX

  • インデックスを作成してクエリを高速化します。

    -- インデックス作成
    CREATE INDEX idx_users_email ON users(email);
    
    -- ユニークインデックス
    CREATE UNIQUE INDEX idx_users_email
    ON users(email);
    
    -- 複合インデックス
    CREATE INDEX idx_orders_user_date
    ON orders(user_id, created_at);
    
    -- インデックス削除
    DROP INDEX idx_users_email ON users;

応用

ウィンドウ関数

  • 行のグループに対して計算を行う関数です。

    -- ROW_NUMBER: 連番
    SELECT name, salary,
      ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
    FROM employees;
    
    -- RANK: 同値で同順位
    SELECT name, department, salary,
      RANK() OVER (
        PARTITION BY department
        ORDER BY salary DESC
      ) AS dept_rank
    FROM employees;
    
    -- 累計
    SELECT date, amount,
      SUM(amount) OVER (ORDER BY date) AS running_total
    FROM sales;

CTE(共通テーブル式)

  • WITH句を使って一時的な結果セットを定義します。

    WITH high_spenders AS (
      SELECT user_id, SUM(total) AS total_spent
      FROM orders
      GROUP BY user_id
      HAVING SUM(total) > 100000
    )
    SELECT u.name, hs.total_spent
    FROM users u
    JOIN high_spenders hs ON u.id = hs.user_id;

CASE式

  • 条件分岐を行います。

    SELECT name, salary,
      CASE
        WHEN salary >= 800 THEN 'high'
        WHEN salary >= 500 THEN 'mid'
        ELSE 'low'
      END AS level
    FROM employees;

UNION / INTERSECT / EXCEPT

  • 複数のクエリ結果を結合します。

    -- UNION: 重複除外して結合
    SELECT name FROM employees
    UNION
    SELECT name FROM contractors;
    
    -- UNION ALL: 重複含む
    SELECT name FROM employees
    UNION ALL
    SELECT name FROM contractors;
    
    -- INTERSECT: 共通部分
    -- EXCEPT: 差分

引用・参考リンク

Related Goods

  • SQLを初級から脱却したい方に!
達人のテクニックを体系的に学べる定番書籍です。
    SQLを初級から脱却したい方に! 達人のテクニックを体系的に学べる定番書籍です。
    詳細をみる
  • 読みやすく保守しやすいSQLを書くための35の原則。
実務で即使えるノウハウが満載です。
    読みやすく保守しやすいSQLを書くための35の原則。 実務で即使えるノウハウが満載です。
    詳細をみる
  • ケーブルに取り付け可能なTypeCとLightningの変換アダプタです。
スタイリッシュなデザインで、Apple製品との相性抜群です。
    ケーブルに取り付け可能なTypeCとLightningの変換アダプタです。 スタイリッシュなデザインで、Apple製品との相性抜群です。
    詳細をみる
  • お気に入りのサウンドデバイスをすぐ取り出せる位置にディスプレイさせておくことができます。
    お気に入りのサウンドデバイスをすぐ取り出せる位置にディスプレイさせておくことができます。
    詳細をみる

WebTerm - Recommended tools

WebTermは、ブラウザでLinuxコマンド・Gitコマンドを安全に実行でき、チュートリアル式で学べるターミナルサンドボックスです。
AIコーディングツールの普及に伴い、CLIの基礎知識を身につける重要性は増しています。実際のターミナルを操作するのに抵抗がある方でも、WebTermはローカル環境を壊す心配がありません。「会員登録不要・無料」で利用でき、学習環境として最適です。

WebTerm Logo

WebTerm

Browser Terminal Sandbox for Learning CLI

開く

All Cheatsheets

エンジニア・プログラマー向けの便利なチートシートを多数まとめています(SP/Tablet/PC対応)
すべてのチートシートを見る