menu
language日本語
save_alt ダウンロード

SQL言語チートシート

データベースのクエリに欠かせないSQLコマンドと構文のリファレンス

🔍 SELECTの基本

返す列を指定してテーブルからデータを取得します。重複を除くにはDISTINCTを、列の別名にはASを使います。
SELECT customer_id, name, email
FROM customers;

-- With alias and DISTINCT
SELECT DISTINCT country AS customer_country
FROM customers;

ポイント:

  • パフォーマンス向上のため、* ではなく列を個別に指定します
  • DISTINCTは重複行を除外します
  • ASキーワードで列の別名を付けます
  • SELECT内の列の順序が結果の列順になります

⚡ WHERE句

比較演算子を使い、条件に基づいて行を絞り込みます。複雑な絞り込みにはAND/ORで複数の条件を組み合わせます。
SELECT name, price
FROM products
WHERE price > 100;

-- Multiple conditions
SELECT name, category
FROM products
WHERE category = 'Electronics'
  AND price <= 500;

ポイント:

  • 結果を返す前に行を絞り込みます
  • AND/ORで複数の条件を組み合わせられます
  • 文字列の値はシングルクォートで囲みます
  • 演算子: =, !=, <>, <, >, <=, >=

⚙️ 論理演算子

AND(すべてが真)、OR(少なくとも1つが真)、NOT(条件を否定)を使って複数の条件を組み合わせます。
-- AND operator
SELECT * FROM orders
WHERE status = 'shipped' AND total > 100;

-- OR operator
SELECT * FROM customers
WHERE country = 'USA' OR country = 'Canada';

-- NOT operator
SELECT * FROM products
WHERE NOT category = 'Discontinued';

ポイント:

  • ANDはORより優先順位が高くなります
  • 評価順序は括弧で制御します
  • NOTは != や <> と同等です
  • 演算子を組み合わせて複雑なロジックを表現できます

↕️ ORDER BY

クエリ結果を昇順(ASC)または降順(DESC)で並べ替えます。複数の列で並べ替えることもできます。
-- Single column sort
SELECT name, price
FROM products
ORDER BY price DESC;

-- Multiple columns
SELECT name, category, price
FROM products
ORDER BY category ASC, price DESC;

ポイント:

  • 指定しない場合はASCがデフォルトです
  • 複数の列で並べ替え可能(左から順に優先)
  • SELECTリストにない列でも並べ替えできます
  • NULLは先頭か末尾に並びます(DBによって異なります)

✂️ LIMIT / OFFSET

返す行数を制限し、OFFSETで行をスキップします。ページネーションや大きな結果セットの扱いに欠かせません。
-- First 10 rows
SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 10;

-- Pagination (skip first 20, get next 10)
SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 10 OFFSET 20;

ポイント:

  • ページネーションに必須です
  • ORDER BYと組み合わせると結果が安定します
  • OFFSETは0(最初の行)から始まります
  • 注意: SQL ServerではLIMITの代わりにTOPを使います

*️⃣ パターンマッチ(LIKE)

ワイルドカードでテキストのパターンに一致させます。% は任意の文字列、_ は任意の1文字に一致します。
-- Starts with 'John'
SELECT name, email
FROM customers
WHERE name LIKE 'John%';

-- Contains 'smith'
SELECT name FROM customers
WHERE name LIKE '%smith%';

-- Exact pattern (5 characters starting with 'A')
SELECT code FROM products
WHERE code LIKE 'A____';

ポイント:

  • % は0文字以上に一致します
  • _ はちょうど1文字に一致します
  • 大文字・小文字の区別はデータベースの照合順序によります
  • 除外にはNOT LIKEを使えます

↔️ 範囲と集合(BETWEEN, IN)

BETWEEN(境界値を含む)で範囲を絞り込むか、INでリスト内の値に一致させます。複数のOR条件より効率的です。
-- BETWEEN (inclusive)
SELECT name, price
FROM products
WHERE price BETWEEN 50 AND 100;

-- IN operator
SELECT name, country
FROM customers
WHERE country IN ('USA', 'Canada', 'Mexico');

-- NOT IN
SELECT name FROM products
WHERE category NOT IN ('Discontinued', 'Draft');

ポイント:

  • BETWEENは両端の値を含みます
  • INは複数のOR条件よりも簡潔です
  • INはサブクエリと組み合わせて使えます
  • BETWEENは日付や文字列にも使えます

❓ NULLの扱い

IS NULLとIS NOT NULLでNULL値を扱います。NULLの列にデフォルト値を与えるにはCOALESCEを使います。
-- Find NULL values
SELECT name, phone
FROM customers
WHERE phone IS NULL;

-- Exclude NULL values
SELECT name, email
FROM customers
WHERE email IS NOT NULL;

-- Provide default value
SELECT name, COALESCE(phone, 'No phone') AS contact
FROM customers;

ポイント:

  • NULLには = や != を使えません
  • IS NULLまたはIS NOT NULLを使う必要があります
  • COALESCEは最初の非NULL引数を返します
  • NULLを含む算術演算の結果はNULLになります

Σ 集計関数

COUNT、SUM、AVG、MIN、MAXで行の集合に対して計算を行います。集計関数はNULL値を無視します(COUNT(*)を除く)。
-- Basic aggregates
SELECT
  COUNT(*) AS total_orders,
  SUM(amount) AS total_revenue,
  AVG(amount) AS avg_order_value,
  MIN(amount) AS smallest_order,
  MAX(amount) AS largest_order
FROM orders;

-- COUNT variations
SELECT COUNT(*) AS all_rows,
       COUNT(email) AS rows_with_email,
       COUNT(DISTINCT country) AS unique_countries
FROM customers;

ポイント:

  • COUNT(*)はすべての行を数えます(NULLを含む)
  • COUNT(column)はNULL値を除外します
  • COUNT(DISTINCT column)は一意な値を数えます
  • SUM/AVGは数値型にのみ使えます

▦ GROUP BY / HAVING

列の値で行をグループ化し、集計関数を適用します。グループの絞り込みにはHAVINGを使います(グループ版のWHERE)。
-- Group by single column
SELECT country, COUNT(*) AS customer_count
FROM customers
GROUP BY country
ORDER BY customer_count DESC;

-- Group by multiple columns with HAVING
SELECT category, status, AVG(price) AS avg_price
FROM products
GROUP BY category, status
HAVING AVG(price) > 50;

ポイント:

  • 集計していないSELECT列はすべてGROUP BYに含める必要があります
  • WHEREはグループ化の前に行を絞り込みます
  • HAVINGは集計後にグループを絞り込みます
  • HAVING句では集計関数を使えます

🔗 JOIN(クイックリファレンス) 詳細ガイドを見る

関連する列をもとに複数のテーブルのデータを結合します。INNER JOINは一致する行のみを返し、LEFT/RIGHTは片側の行をすべて残します。
-- INNER JOIN (most common)
SELECT orders.id, customers.name, orders.amount
FROM orders
INNER JOIN customers
  ON orders.customer_id = customers.id;

-- LEFT JOIN (all orders, even without customer)
SELECT orders.id, customers.name
FROM orders
LEFT JOIN customers
  ON orders.customer_id = customers.id;

ポイント:

  • INNER JOINが最も一般的です(JOINだけでも書けます)
  • LEFT/RIGHT JOINは片方のテーブルの全行を残します
  • 結合条件はON句で指定します

⬚ サブクエリ

クエリの中にクエリを書き、複雑な絞り込みや計算を行います。IN、EXISTSと組み合わせるか、スカラー値として使います。
-- Subquery with IN
SELECT name, price
FROM products
WHERE category_id IN (
  SELECT id FROM categories
  WHERE name = 'Electronics'
);

-- Subquery with EXISTS
SELECT name FROM customers c
WHERE EXISTS (
  SELECT 1 FROM orders o
  WHERE o.customer_id = c.id
);

-- Scalar subquery
SELECT name, price,
  price - (SELECT AVG(price) FROM products) AS price_diff
FROM products;

ポイント:

  • INサブクエリは複数の値を返します
  • EXISTSは存在を確認します(効率的)
  • スカラーサブクエリは単一の値を返します
  • 相関サブクエリは外側のクエリを参照します

✂️ 文字列関数

テキストデータの抽出、変換、整形を行います。SUBSTRINGは位置で抽出し、LEFT/RIGHTは両端から取り出します。
-- Extract characters by position
SELECT SUBSTRING(name, 1, 3) AS prefix FROM products;

-- First / last N characters
SELECT LEFT(email, 5), RIGHT(phone, 4) FROM users;

-- Dynamic position (find @ then extract domain)
SELECT SUBSTRING(email, INSTR(email, '@') + 1) AS domain
FROM users;

-- Common string helpers
SELECT
  UPPER(name), LOWER(name),
  TRIM(name),
  LENGTH(name)
FROM users;

ポイント:

  • SQLの位置は1始まりです(先頭文字 = 位置1)
  • 先頭/末尾にはLEFT/RIGHT、中間にはSUBSTRINGを使います
  • SQLiteはLEFT/RIGHTに非対応のため、SUBSTRINGを使います
  • OracleではSUBSTRING()ではなくSUBSTR()を使います

もっと快適にSQLを書きたいですか?

Beekeeper Studioは、オートコンプリート、クエリ履歴、15種類以上のデータベース対応を備えた、モダンで直感的なSQLエディタです。

Beekeeper Studioを無料で試す