第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できるようにすべきである。
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の種類
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を使用する際は、テーブルに短い別名(エイリアス)を付けることが一般的である。これによりクエリが読みやすくなり、同じテーブルを複数回参照する際にも便利である。
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製品により若干異なる場合があります。詳細は各製品のドキュメントをご確認ください。
本コンテンツは2025年12月時点の情報に基づいて作成されています。SQLの構文はDBMS製品により若干異なる場合があります。詳細は各製品のドキュメントをご確認ください。