データエンジニアリングやアプリケーション開発において、データの操作と言語の標準であるSQLは、2026年の現在においても欠かすことのできない中核的なスキルです。
生成AIによるコード自動生成が普及した現代だからこそ、出力されたSQLが正しいかどうかを判断し、システムのパフォーマンスを最適化するために、正確な構文理解が求められています。
本記事では、日常的なデータ抽出から複雑な分析クエリ、データベース管理にいたるまで、実務で即座に参照できるSQL構文の一覧を目的別に整理して解説します。
データ操作の基本(DML:Data Manipulation Language)
SQLにおいて最も頻繁に使用されるのが、データの参照、追加、更新、削除を行うDMLです。
2026年のシステム開発においても、これらの基本構文はすべての操作の土台となります。
SELECTによるデータの取得
データベースから特定のカラムやレコードを取得するために使用します。
単なる全件取得だけでなく、別名(エイリアス)の設定や計算結果の取得など、柔軟な記述が可能です。
-- 基本的なSELECT文の記述
SELECT
product_name,
price,
price * 1.1 AS price_with_tax -- 消費税込みの価格を計算して別名を付与
FROM
products;
product_name | price | price_with_tax
-------------+-------+----------------
Laptop PC | 120000| 132000
Monitor | 35000 | 38500
データを取得する際は、SELECT *(ワイルドカード)を多用せず、必要なカラムを明示することがパフォーマンス向上の鉄則です。
不要なデータ転送を減らすことで、クラウドデータベースのコスト削減にも繋がります。
INSERTによるデータの挿入
テーブルに新しいレコードを追加します。
単一の行を追加するだけでなく、一度に複数の行を挿入するマルチインサート構文が実務では一般的です。
-- 複数行を一度に挿入する例
INSERT INTO customers (customer_name, email, region)
VALUES
('田中 太郎', 'tanaka@example.com', 'Tokyo'),
('佐藤 次郎', 'sato@example.com', 'Osaka'),
('鈴木 花子', 'suzuki@example.com', 'Nagoya');
INSERT 0 3 -- 3件のデータが正常に挿入されたことを示す
UPDATEによるデータの更新
既存のレコードの内容を変更します。
更新対象を限定するために、後述するWHERE句との組み合わせが必須です。
-- 条件に一致するデータの単価を一斉に更新
UPDATE products
SET price = price * 1.05
WHERE category_id = 10; -- カテゴリIDが10の商品のみ5%値上げ
WHERE句を指定し忘れるとテーブル内の全データが更新されてしまうため、実行前に必ず対象を確認する習慣をつけましょう。
DELETEによるデータの削除
不要になったレコードを削除します。
物理削除を行うため、実行後の復旧はバックアップから行う必要があります。
-- 特定の条件を満たすレコードを削除
DELETE FROM temporary_logs
WHERE created_at < '2025-01-01';
データの抽出条件と並べ替え
膨大なデータの中から必要な情報を絞り込み、視認性の高い順序に整理するための構文です。
WHEREによる絞り込み
比較演算子や論理演算子を組み合わせて、複雑な条件を指定します。
| 演算子 | 説明 |
|---|---|
| = | <> | 等しい | 等しくない |
| > | < | より大きい | より小さい |
| IN | 指定したリストのいずれかに一致 |
| BETWEEN | 指定した範囲内に含まれる |
| LIKE | パターンマッチング(% は任意の文字列) |
| IS NULL | NULL値であるかどうか |
-- 複数の条件を組み合わせた絞り込み
SELECT *
FROM orders
WHERE status = 'shipped'
AND (total_amount >= 5000 OR priority_member = TRUE)
AND order_date BETWEEN '2026-04-01' AND '2026-04-30';
ORDER BYによる並べ替え
取得した結果を特定のカラムに基づいてソートします。
昇順はASC、降順はDESCを使用します。
-- 売上額の高い順(降順)に並べ替え、同額なら日付の古い順(昇順)
SELECT order_id, total_amount, order_date
FROM orders
ORDER BY total_amount DESC, order_date ASC;
LIMIT / OFFSETによる取得件数の制限
大量のデータをページネーション(ページ送り)で表示する場合に使用します。
-- 11件目から10件分を取得(ページ2の表示などに利用)
SELECT *
FROM blog_posts
ORDER BY published_at DESC
LIMIT 10 OFFSET 10;
データの集計とグループ化
データ分析において最も重要なプロセスが、複数の行をまとめて統計値を算出する集計処理です。
集計関数
代表的な関数として以下があります。
COUNT():行数を数えるSUM():合計値を算出するAVG():平均値を算出するMAX()/MIN():最大・最小値を求める
GROUP BYとHAVING
特定の属性ごとに集計を行う場合はGROUP BYを使用します。
また、集計結果に対して絞り込みを行いたい場合は、WHEREではなくHAVINGを使用します。
-- カテゴリごとの平均売上を算出し、平均が1000円以上のカテゴリのみ表示
SELECT
category_id,
AVG(price) AS average_price,
COUNT(*) AS item_count
FROM products
GROUP BY category_id
HAVING AVG(price) >= 1000;
category_id | average_price | item_count
------------+---------------+------------
1 | 2500.5 | 15
3 | 1200.0 | 8
実行順序の理解が重要です。
SQLは内部的に「FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY」の順で処理されます。
テーブルの結合(JOIN)
正規化されたデータベースから、複数のテーブルを組み合わせて関連データを取り出します。
INNER JOIN(内部結合)
両方のテーブルに存在するデータのみを取得します。
-- 注文情報と顧客情報を結合して名前を取得
SELECT
o.order_id,
c.customer_name
FROM orders AS o
INNER JOIN customers AS c ON o.customer_id = c.customer_id;
LEFT OUTER JOIN(左外部結合)
左側のテーブル(FROM句に記述したテーブル)の全データを保持し、右側のテーブルに一致するデータがあれば結合します。
一致しない場合はNULLが入ります。
-- すべての商品を表示し、注文履歴があればその日付を表示
SELECT
p.product_name,
o.order_date
FROM products AS p
LEFT JOIN orders AS o ON p.product_id = o.product_id;
その他の結合方式
- RIGHT JOIN:右側のテーブルを基準にする(実務ではLEFT JOINに書き換えることが多い)。
- FULL JOIN:両方のテーブルのすべての行を保持し、一致しない箇所をNULLにする。
- CROSS JOIN:デカルト積(すべての組み合わせ)を作成する。
集合演算
クエリの結果セット同士を結合したり、差分を取得したりするために使用します。
UNION と UNION ALL
複数のSELECT文の結果を垂直に統合します。
UNIONは重複を除去しますが、UNION ALLは重複を残したまま結合するため処理が高速です。
-- 2025年の顧客と2026年の顧客リストを統合
SELECT email FROM customers_2025
UNION ALL
SELECT email FROM customers_2026;
INTERSECT と EXCEPT
INTERSECT:共通するレコードのみを抽出します。EXCEPT(またはMINUS):1番目のクエリ結果から2番目の結果に含まれるものを差し引きます。
高度なクエリ手法(サブクエリとCTE)
複雑なロジックを1つのクエリで完結させるための手法です。
サブクエリ(副問合せ)
SELECT文の中に別のSELECT文を入れ込みます。
-- 平均価格より高い商品のみを抽出
SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);
CTE(共通テーブル式:WITH句)
一時的な名前付きの結果セットを定義します。
サブクエリよりも可読性が高く、2026年現在のモダンな開発現場ではCTEの使用が推奨されます。
-- 売上トップ5の顧客の詳細情報を取得する
WITH top_customers AS (
SELECT customer_id, SUM(amount) as total
FROM sales
GROUP BY customer_id
ORDER BY total DESC
LIMIT 5
)
SELECT c.*, tc.total
FROM customers c
JOIN top_customers tc ON c.customer_id = tc.customer_id;
ウィンドウ関数
集計を行いつつ、各行の個別のデータも保持したい場合に非常に強力な機能です。
基本構文と代表的な関数
OVER句を使用し、データの範囲(パーティション)や順序を指定します。
ROW_NUMBER():行番号を振るRANK()/DENSE_RANK():順位を付けるSUM() OVER():累計値を算出する
-- 部署ごとの給与ランキングを表示
SELECT
employee_name,
department,
salary,
RANK() OVER(PARTITION BY department ORDER BY salary DESC) as salary_rank
FROM employees;
employee_name | department | salary | salary_rank
--------------+------------+--------+-------------
田中 | Sales | 500000 | 1
佐藤 | Sales | 450000 | 2
鈴木 | IT | 600000 | 1
伊藤 | IT | 580000 | 2
データ定義と管理(DDL・DCL・TCL)
データベースの構造自体を操作したり、権限や安全性を管理するための構文です。
DDL(Data Definition Language)
テーブルやインデックスを作成・変更します。
-- テーブルの新規作成
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(255) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- テーブル構造の変更(カラム追加)
ALTER TABLE users ADD COLUMN last_login TIMESTAMP;
-- テーブルの削除
-- DROP TABLE users;
TCL(Transaction Control Language)
一連の操作を「すべて成功させるか、すべて取り消すか」を制御します。
データの整合性を保つために不可欠です。
BEGIN; -- トランザクション開始
UPDATE accounts SET balance = balance - 1000 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE user_id = 2;
-- 何らかのエラーが発生した場合は
-- ROLLBACK;
COMMIT; -- 変更を確定
2026年における実務での活用Tips
JSONデータの操作
現代のデータベース(PostgreSQL, MySQLなど)は、リレーショナルデータだけでなくJSON形式のデータもネイティブに扱えます。
-- JSONカラムから特定のキーの値を取得
SELECT
user_id,
meta_data->>'theme' AS selected_theme
FROM user_settings;
CASE式による条件分岐
クエリ結果の中で値の変換を行いたい場合に便利です。
SELECT
product_name,
CASE
WHEN stock_quantity = 0 THEN '在庫切れ'
WHEN stock_quantity < 10 THEN '残りわずか'
ELSE '在庫あり'
END AS stock_status
FROM inventory;
インデックスの適切な利用
検索スピードを劇的に向上させるためには、適切なカラムにインデックスを貼ることが重要です。
-- 頻繁に検索されるemailカラムにインデックスを作成
CREATE INDEX idx_users_email ON users(email);
ただし、インデックスを貼りすぎるとデータの更新(INSERT/UPDATE)が遅くなるため、参照と更新のバランスを考慮する必要があります。
まとめ
SQLは単なるデータの抽出言語から、複雑な分析やモダンなデータ型(JSONやベクトルデータ)を扱うための多機能な言語へと進化し続けています。
2026年現在、AIによるアシストが当たり前となりましたが、生成されたクエリが「意図通りか」「効率的か」を見極めるには、今回紹介した基本構文と実行原理の理解が欠かせません。
本記事で紹介した構文一覧をリファレンスとして手元に置き、実務におけるデータ操作の効率化にぜひ役立ててください。
特にCTE(WITH句)やウィンドウ関数を使いこなすことで、複雑なレポート作成もシンプルに記述できるようになります。
常にクエリの可読性とパフォーマンスを意識し、最適なデータベース操作を目指しましょう。
