第5章 SQL基礎

更新日:2025年12月28日

🎧

この章を音声で聴く

再生速度:
本章では、SQLの基本的な構文と操作について解説する。SQLは関係データベースを操作するための標準言語であり、DDL(データ定義言語)、DML(データ操作言語)、DCL(データ制御言語)に分類される。SELECT、INSERT、UPDATE、DELETEの基本操作、WHERE句による条件指定、JOINによるテーブル結合を学ぶ。

1. SQLの概要

1.1 DDL・DML・DCL

SQL(Structured Query Language)は、関係データベースを操作するための標準言語である。1970年代にIBMで開発され、現在はISO/IECにより標準化されている。

Table 1. SQLの分類

分類 正式名称 目的 主なコマンド
DDL Data Definition Language データ構造の定義 CREATE, ALTER, DROP, TRUNCATE
DML Data Manipulation Language データの操作 SELECT, INSERT, UPDATE, DELETE
DCL Data Control Language アクセス制御 GRANT, REVOKE
TCL Transaction Control Language トランザクション制御 COMMIT, ROLLBACK, SAVEPOINT
-- DDLの例:テーブル作成
CREATE TABLE employees (
    id INTEGER PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    salary DECIMAL(10,2)
);

-- DDLの例:テーブル変更
ALTER TABLE employees ADD COLUMN department_id INTEGER;

-- DDLの例:テーブル削除
DROP TABLE employees;

2. データ操作

2.1 SELECT

SELECT文は、テーブルからデータを取得するための文である。最も頻繁に使用されるSQL文である。

-- 基本構文
SELECT 列名1, 列名2 FROM テーブル名;

-- 全列を取得
SELECT * FROM employees;

-- 特定の列を取得
SELECT name, salary FROM employees;

-- 列に別名(エイリアス)を付ける
SELECT name AS 社員名, salary AS 給与 FROM employees;

-- 重複を排除
SELECT DISTINCT department_id FROM employees;

-- 計算式を含める
SELECT name, salary * 12 AS annual_salary FROM employees;

Table 2. SELECT文の主要句

目的 記述順序
SELECT 取得する列を指定 1(必須)
FROM 対象テーブルを指定 2(必須)
WHERE 行の抽出条件 3
GROUP BY グループ化 4
HAVING グループの抽出条件 5
ORDER BY 並び替え 6
LIMIT 取得件数制限 7

2.2 INSERT

INSERT文は、テーブルに新しいデータを挿入する文である。

-- 基本構文(列名を指定)
INSERT INTO employees (id, name, salary)
VALUES (1, '田中太郎', 450000);

-- 複数行を一度に挿入
INSERT INTO employees (id, name, salary) VALUES
(2, '鈴木花子', 520000),
(3, '佐藤次郎', 400000),
(4, '高橋三郎', 480000);

-- 全列に値を指定(列名省略可)
INSERT INTO employees VALUES (5, '山田四郎', 430000);

-- 他のテーブルからデータを挿入
INSERT INTO employees_backup
SELECT * FROM employees WHERE salary > 500000;

2.3 UPDATE

UPDATE文は、既存のデータを更新する文である。WHERE句を省略するとすべての行が更新されるため注意が必要である。

-- 基本構文
UPDATE employees SET salary = 500000 WHERE id = 1;

-- 複数列を更新
UPDATE employees 
SET salary = 550000, department_id = 2 
WHERE id = 1;

-- 計算式を使用
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 1;

-- 全行を更新(注意:WHERE句なし)
UPDATE employees SET status = 'active';
UPDATE/DELETE実行前の確認
UPDATE文やDELETE文を実行する前に、同じWHERE条件でSELECT文を実行し、影響を受ける行を確認することを推奨する。本番環境では、トランザクション内で実行し、問題があればROLLBACKできるようにすべきである。

2.4 DELETE

DELETE文は、テーブルからデータを削除する文である。WHERE句を省略するとすべての行が削除される。

-- 基本構文
DELETE FROM employees WHERE id = 5;

-- 複数条件で削除
DELETE FROM employees WHERE department_id = 3 AND salary < 300000;

-- 全行を削除(注意:WHERE句なし)
DELETE FROM employees;

-- TRUNCATEとの違い
-- DELETE: 行単位で削除、ログあり、ROLLBACK可
-- TRUNCATE: テーブル全体を高速削除、ROLLBACK不可(DBMSによる)
TRUNCATE TABLE employees;

3. WHERE句

WHERE句は、条件を指定して行を絞り込むための句である。

Table 3. 比較演算子

演算子 意味
= 等しい salary = 500000
<> または != 等しくない status <> 'inactive'
< より小さい age < 30
<= 以下 price <= 1000
> より大きい quantity > 100
>= 以上 score >= 80

Table 4. 論理演算子と特殊演算子

演算子 意味
AND かつ age >= 20 AND age <= 30
OR または dept = 'Sales' OR dept = 'Marketing'
NOT 否定 NOT (salary > 500000)
BETWEEN 範囲内 salary BETWEEN 400000 AND 600000
IN リスト内 dept_id IN (1, 2, 3)
LIKE パターンマッチ name LIKE '田中%'
IS NULL NULLである phone IS NULL
IS NOT NULL NULLでない email IS NOT NULL
-- WHERE句の例
SELECT * FROM employees WHERE salary >= 500000;

-- AND/OR
SELECT * FROM employees 
WHERE department_id = 1 AND salary > 400000;

-- BETWEEN
SELECT * FROM employees 
WHERE salary BETWEEN 400000 AND 600000;

-- IN
SELECT * FROM employees 
WHERE department_id IN (1, 2, 3);

-- LIKE(パターンマッチ)
-- % : 任意の0文字以上
-- _ : 任意の1文字
SELECT * FROM employees WHERE name LIKE '田%';      -- 田で始まる
SELECT * FROM employees WHERE name LIKE '%郎';      -- 郎で終わる
SELECT * FROM employees WHERE name LIKE '%中%';     -- 中を含む
SELECT * FROM employees WHERE name LIKE '田_太郎';  -- 田○太郎

-- NULL判定(= は使えない)
SELECT * FROM employees WHERE phone IS NULL;
SELECT * FROM employees WHERE phone IS NOT NULL;

4. JOIN

JOIN(結合)は、複数のテーブルを関連付けてデータを取得する操作である。関係代数の結合操作に対応する。

Fig. 1. JOINの種類

JOINの種類
JOINの種類と結果の範囲

4.1 INNER JOIN

INNER JOIN(内部結合)は、両方のテーブルで条件が一致する行のみを返す。

-- サンプルテーブル
-- employees: id, name, department_id
-- departments: id, department_name

-- INNER JOIN(内部結合)
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;

-- 旧構文(WHERE句での結合)- 非推奨
SELECT e.name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.id;
テーブル別名(エイリアス)
JOINを使用する際は、テーブルに短い別名(エイリアス)を付けることが一般的である。これによりクエリが読みやすくなり、同じテーブルを複数回参照する際にも便利である。

4.2 LEFT/RIGHT JOIN

外部結合(OUTER JOIN)は、一方のテーブルのすべての行を返し、他方のテーブルに一致する行がない場合はNULLを返す。

Table 5. JOINの種類

JOIN種類 説明 結果
INNER JOIN 両テーブルで一致する行のみ 共通部分のみ
LEFT JOIN 左テーブルのすべての行 左テーブル全体 + 右の一致分
RIGHT JOIN 右テーブルのすべての行 右テーブル全体 + 左の一致分
FULL OUTER JOIN 両テーブルのすべての行 両テーブル全体
CROSS JOIN すべての組み合わせ 直積(M × N 行)
-- LEFT JOIN(左外部結合)
-- 部署に所属していない社員も含める
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;

-- RIGHT JOIN(右外部結合)
-- 社員がいない部署も含める
SELECT e.name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;

-- 複数テーブルのJOIN
SELECT 
    e.name,
    d.department_name,
    p.project_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id
INNER JOIN projects p ON e.id = p.manager_id;

-- 自己結合(同じテーブルをJOIN)
-- 上司と部下の関係を取得
SELECT 
    e.name AS employee_name,
    m.name AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

5. まとめ

Table 6. 第5章のまとめ

概念 内容
DDL CREATE, ALTER, DROP - データ構造の定義
DML SELECT, INSERT, UPDATE, DELETE - データ操作
SELECT データの取得、DISTINCT, AS(エイリアス)
INSERT データの挿入、複数行挿入
UPDATE データの更新、WHERE句必須を推奨
DELETE データの削除、TRUNCATEとの違い
WHERE句 比較演算子、論理演算子、LIKE, IN, BETWEEN, IS NULL
INNER JOIN 両テーブルで一致する行を結合
LEFT/RIGHT JOIN 片方のテーブルのすべての行を含む結合
参考・免責事項
本コンテンツは2025年12月時点の情報に基づいて作成されています。SQLの構文はDBMS製品により若干異なる場合があります。詳細は各製品のドキュメントをご確認ください。