2026年現在、データエンジニアリングやAI活用が一般化する中で、SQLの重要性はかつてないほど高まっています。
データベースから必要な情報を正確に抽出するスキルは、エンジニアだけでなくデータサイエンティストやマーケターにとっても必須の技術と言えるでしょう。
本力では、SQLの学習を始めたばかりの方から、実務での記述ルールを再確認したい方までを対象に、現場で役立つSQLの基本構文を網羅的に整理して解説します。
1. SQLの基本概念と記述のルール
SQL(Structured Query Language)は、関係データベース(RDBMS)を操作するための言語です。
2026年においても、クラウドネイティブなデータベースや分散ストレージの多くがSQLインターフェースを採用しており、その基本は変わりません。
SQLを記述する際には、いくつかの基本的なルールがあります。
SQLの基本的な記述ルール
SQL文を記述する上で、まず意識すべきは可読性です。
チーム開発や将来のメンテナンスを考慮し、以下のルールを遵守しましょう。
- SQL文の末尾にはセミコロン
;を記述する。 - キーワード(SELECT, FROMなど)は大文字、カラム名やテーブル名は小文字で記述するのが一般的(慣習)。
- 可読性を高めるため、句ごとに改行やインデントを入れる。
- 文字列を指定する場合はシングルクォーテーション
''で囲む。
これらのルールを守ることで、複雑なクエリであっても構造が把握しやすくなります。
2. データの取得:SELECT文の基本
SQLで最も頻繁に使用されるのが、テーブルからデータを取得するための SELECT 文です。
全てのカラムを取得する
テーブルに含まれるすべての情報を確認したい場合は、アスタリスク * を使用します。
-- employeesテーブルから全てのデータを取得
SELECT
*
FROM
employees;
| employee_id | name | department | salary |
|---|---|---|---|
| 1 | 田中 太郎 | 営業 | 500000 |
| 2 | 佐藤 花子 | 開発 | 600000 |
| 3 | 鈴木 一郎 | 人事 | 450000 |
特定のカラムを指定して取得する
実務においては、パフォーマンスや可読性の観点から必要なカラムだけを明示的に指定することが推奨されます。
-- 氏名と部署名のみを取得
SELECT
name,
department
FROM
employees;
| name | department |
|---|---|
| 田中 太郎 | 営業 |
| 佐藤 花子 | 開発 |
| 鈴木 一郎 | 人事 |
別名を付ける(AS句)
取得したカラム名に別名を付けることで、結果をわかりやすく表示できます。
-- カラム名に日本語の別名を付ける
SELECT
name AS 社員名,
salary AS 月収
FROM
employees;
3. データの絞り込み:WHERE句
膨大なデータの中から、特定の条件に合致するレコードだけを抽出するには WHERE 句を使用します。
比較演算子による絞り込み
数値や文字列を比較して条件を指定します。
-- 給与が500,000円以上の社員を取得
SELECT
name,
salary
FROM
employees
WHERE
salary >= 500000;
複数の条件を組み合わせる(AND, OR)
複数の条件を組み合わせて、より詳細な絞り込みを行います。
-- 部署が「開発」で、かつ給与が550,000円以上の社員を取得
SELECT
*
FROM
employees
WHERE
department = '開発'
AND salary >= 550000;
あいまい検索(LIKE句)
特定のパターンを含む文字列を検索する際に使用します。
パーセント記号 % は「0文字以上の任意の文字列」を意味するワイルドカードです。
-- 苗字が「佐藤」で始まる社員を検索
SELECT
*
FROM
employees
WHERE
name LIKE '佐藤%';
NULLの扱い
データが入っていない状態(NULL)を検索する場合は、= ではなく IS NULL を使用します。
「= NULL」と記述しても正しく判定されないため、注意が必要です。
-- 部署名が設定されていないレコードを抽出
SELECT
*
FROM
employees
WHERE
department IS NULL;
4. データの並べ替えと制限
取得した結果を見やすく整理するために、並べ替えや取得件数の制限を行います。
データの並べ替え(ORDER BY句)
特定のカラムを基準に昇順(ASC)または降順(DESC)で並べ替えます。
デフォルトは昇順です。
-- 給与が高い順(降順)に並べ替える
SELECT
name,
salary
FROM
employees
ORDER BY
salary DESC;
取得件数の制限(LIMIT句)
大量のデータがある場合、最初の数件だけを取得することで、処理の高速化やデータのサンプリングが可能です。
-- 給与が高いトップ3を取得
SELECT
name,
salary
FROM
employees
ORDER BY
salary DESC
LIMIT 3;
5. データの集計とグループ化
データ分析において、平均値の算出やカテゴリーごとの合計値の集計は非常に重要な工程です。
集計関数
主要な集計関数には以下のものがあります。
| 関数名 | 内容 |
|---|---|
| COUNT() | 行数を数える |
| SUM() | 数値の合計を算出する |
| AVG() | 数値の平均を算出する |
| MAX() / MIN() | 最大値 / 最小値を特定する |
グループ化(GROUP BY句)
特定のカラムごとに集計を行いたい場合に使用します。
-- 部署ごとの平均給与を算出
SELECT
department,
AVG(salary) AS average_salary
FROM
employees
GROUP BY
department;
集計後の絞り込み(HAVING句)
WHERE 句は「集計前」のデータに対して絞り込みを行いますが、HAVING 句は集計した後の結果に対して条件を指定します。
-- 平均給与が500,000円以上の部署のみを表示
SELECT
department,
AVG(salary) AS average_salary
FROM
employees
GROUP BY
department
HAVING
AVG(salary) >= 500000;
6. 複数テーブルの結合:JOIN
実務のデータベース設計では、データが複数のテーブルに分割されています(正規化)。
これらを関連付けて1つの結果として表示するために結合(JOIN)を使用します。
内部結合(INNER JOIN)
両方のテーブルに一致するデータのみを取得します。
-- 社員情報と部署情報を結合
SELECT
e.name,
d.department_name
FROM
employees AS e
INNER JOIN
departments AS d
ON
e.department_id = d.department_id;
左外部結合(LEFT JOIN)
左側のテーブル(FROM句に書かれたテーブル)の全レコードを保持しつつ、右側のテーブルの情報を結合します。
対応するデータがない場合は NULL が入ります。
-- 部署に所属していない社員も含めて取得
SELECT
e.name,
d.department_name
FROM
employees AS e
LEFT JOIN
departments AS d
ON
e.department_id = d.department_id;
実務では、マスターテーブルを基準に情報を補完することが多いため、LEFT JOINの使用頻度が非常に高いのが特徴です。
7. データの更新・挿入・削除(DML)
取得だけでなく、データを操作する構文も基本として押さえておく必要があります。
データの挿入(INSERT)
テーブルに新しいレコードを追加します。
-- 新しい社員を追加
INSERT INTO employees (name, department, salary)
VALUES ('高橋 健一', '開発', 580000);
データの更新(UPDATE)
既存のデータを書き換えます。
WHERE句を忘れるとテーブル内の全データが更新されてしまうため、実行前には必ず確認が必要です。
-- 特定の社員の給与を更新
UPDATE employees
SET salary = 620000
WHERE employee_id = 2;
データの削除(DELETE)
不要になったレコードを削除します。
UPDATEと同様に、条件指定を誤ると致命的なデータ損失に繋がります。
-- 退職した社員のデータを削除
DELETE FROM employees
WHERE employee_id = 3;
8. テーブルの定義(DDL):CREATEとALTER
データベースの構造自体を作成・変更するコマンドです。
テーブルの作成(CREATE TABLE)
カラム名とデータ型を指定して新しいテーブルを作成します。
-- プロジェクト管理テーブルの作成
CREATE TABLE projects (
project_id INT PRIMARY KEY,
project_name VARCHAR(100) NOT NULL,
start_date DATE,
budget DECIMAL(10, 2)
);
テーブルの変更(ALTER TABLE)
既存のテーブルにカラムを追加したり、型を変更したりします。
-- projectsテーブルに終了予定日のカラムを追加
ALTER TABLE projects ADD COLUMN end_date DATE;
9. 実務で差がつくCTE(共通テーブル式)
2026年のモダンなSQL開発において欠かせないのが WITH 句を使った CTE(Common Table Expressions) です。
複雑なサブクエリを整理し、クエリの可読性を劇的に向上させます。
CTEの基本構文
一時的な名前を付けたクエリを定義し、その後のメインクエリで利用します。
-- 高額所得者の平均を算出する例
WITH high_salary_employees AS (
SELECT
*
FROM
employees
WHERE
salary > 700000
)
SELECT
department,
COUNT(*) AS high_earner_count
FROM
high_salary_employees
GROUP BY
department;
サブクエリを入れ子にするよりも構造が明確になり、デバッグもしやすくなるため、実務では積極的に活用すべき構文です。
10. 実務における記述のベストプラクティス
文法を覚えるだけでなく、現場で「良いSQL」とされる書き方を意識することが重要です。
コメントを適切に残す
なぜその条件で絞り込んでいるのか、複雑な結合の意図は何かをコメントとして残しましょう。
-- 2025年度の退職者を除外した有効なアクティブユーザー数を算出
SELECT COUNT(*) FROM users WHERE status = 'active';
インデックスを意識したWHERE句
大量のデータを扱う場合、カラムにインデックスが貼られているかを確認します。
インデックスが効かない書き方(例:左辺での演算)を避けるだけで、クエリの実行速度が100倍以上変わることもあります。
SELECT * を避ける
分析ツールやアプリケーションからクエリを投げる際、不要なカラムまで取得するとネットワーク負荷やメモリ消費が増大します。
常に必要なカラムのみを定義する習慣をつけましょう。
まとめ
本記事では、SQLの基本構文から実務で頻出する応用的な書き方までを整理しました。
SQLは単なるデータの操作言語ではなく、データをビジネスの価値に変えるための「共通言語」です。
2026年の現在においても、生成AIを活用したSQL生成技術が進歩していますが、AIが生成したクエリが正しいかどうかを判断し、最適化するためには、自身の基礎知識が欠かせません。
今回解説した SELECT、WHERE、GROUP BY、JOIN、そして WITH 句といった基本要素をマスターすることで、複雑なデータ分析やシステム開発にも自信を持って対応できるようになります。
まずは手元の環境で実際にコードを書き、実行結果を確認することから始めてみてください。
