第6章 DBMS と SQL — データを操作する仕組みと共通言語
この章で学ぶこと
- DBMS の主要機能を 5 つ挙げられる
- SQL の 4 種類 (DDL / DML / DCL / TCL) の違いを説明できる
- 主要な RDBMS 製品の特徴を理解し、用途に応じて選べる
第 2 章 システムとデータベースの関係 と 第 4 章 CRUD と ACID を理解していること。
DBMS は「データのプロ」
DBMS (Database Management System) は、アプリケーションとデータの間に立って、SQL の解析・最適化・実行・データ保存・同時アクセス制御などを一手に引き受けるソフトウェアです。
DBMS がなかったら
DBMS がなかったら、開発者は次のような処理を自分のコードで全て書く必要があります。
def find_user_by_email(email):
# ファイルを開いて 1 行ずつ読む
with open('users.txt', 'r') as f:
lines = f.readlines()
# 全件を線形検索 (インデックスなし)
for line in lines:
data = line.split(',')
if data[2] == email:
return {
'id': data[0],
'name': data[1],
'email': data[2],
}
# 同時アクセス制御なし → 他の人が書き込み中だと壊れる
# データ整合性チェックなし
# セキュリティ考慮なし (誰でもファイルを直接読める)
DBMS を使うと、このすべてが SELECT * FROM users WHERE email = ? の 1 行に置き換わります。
DBMS の主要な機能
これらは「データを安全・高速・公正に扱う」ために必要な機能群で、自分で実装したら何ヶ月もかかります。DBMS を使うことで、すぐに本来やりたいビジネスロジックに集中できます。
主要な RDBMS 製品
オープンソース系
| 製品 | 特徴 | 代表的な用途 |
|---|---|---|
| PostgreSQL | 高機能・拡張性が高い・SQL 標準への準拠が強い | Web アプリ・データ分析・地理情報 (PostGIS) |
| MySQL | 世界で広く使われている・Web アプリでの実績多数 | WordPress などの CMS・LAMP スタック |
| SQLite | ファイルベース (サーバ不要)・組み込みやすい | スマホアプリのローカル DB・小規模ツール |
Stack Overflow Developer Survey 2025 では、PostgreSQL が専門開発者の 58.2% が使用する「最も使われている」データベース 1 位で、MySQL は 39.6% で 2 位です。一方、WordPress や既存の LAMP スタックなど運用中のシステムでの採用実績は MySQL が厚く、既存案件では MySQL に触れる機会も多くあります。新規プロジェクトでは PostgreSQL が選ばれる傾向が強く、本ガイドのコード例も PostgreSQL を default として採用しています。
商用系
| 製品 | ベンダー | 特徴 | 主な用途 |
|---|---|---|---|
| Oracle Database | Oracle | 大規模システム向けの機能と性能 | 銀行・通信・大企業の基幹システム |
| Microsoft SQL Server | Microsoft | Windows 環境との親和性 | 企業向け業務システム全般 |
| Db2 | IBM | メインフレームと親和 | 銀行・保険のレガシーシステム |
SQL — データベースと対話する言語
SQL (Structured Query Language) は、リレーショナルデータベースを操作するための標準言語です。SQL は用途によって 4 つに分類されます。
| 分類 | 用途 | 主な命令 |
|---|---|---|
| DDL (Data Definition) | データ構造の定義 | CREATE TABLE / ALTER TABLE / DROP TABLE |
| DML (Data Manipulation) | データの操作 | SELECT / INSERT / UPDATE / DELETE |
| DCL (Data Control) | 権限の管理 | GRANT / REVOKE |
| TCL (Transaction Control) | トランザクションの制御 | BEGIN / COMMIT / ROLLBACK |
Jr が最初によく使うのは DML (データ操作) で、次に DDL (テーブル作成・変更) を学ぶ流れが一般的です。DCL は運用フェーズで、TCL は第 4 章で扱ったトランザクション管理に使います。
SQL の基本例
DDL: テーブル作成・インデックス作成
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
department VARCHAR(50),
salary NUMERIC(10, 2),
hire_date DATE NOT NULL,
is_active BOOLEAN NOT NULL DEFAULT TRUE
);
-- 検索を高速にするためのインデックス
CREATE INDEX idx_employees_department ON employees(department);
CREATE INDEX idx_employees_hire_date ON employees(hire_date);
DML: データの挿入・検索・更新・削除
-- INSERT: データを追加
INSERT INTO employees (name, email, department, salary, hire_date)
VALUES ('Yamada Taro', 'yamada@example.com', 'sales', 450000, '2026-01-15');
-- SELECT: データを検索
SELECT name, department, salary
FROM employees
WHERE department = 'sales'
AND salary > 400000
ORDER BY hire_date DESC;
-- UPDATE: データを更新
UPDATE employees
SET salary = salary * 1.1 -- 10% 昇給
WHERE department = 'sales'
AND hire_date < '2025-01-01';
-- DELETE: データを削除
DELETE FROM employees
WHERE is_active = FALSE
AND hire_date < '2022-01-01';
インデックス (index): 検索を高速化するためのデータ構造。本の巻末索引と同じく、特定の値からそのレコードの位置を素早く引ける。WHERE department = 'sales' のような検索条件によく使うカラムに作る。張り方の設計は第 19 章で扱う (B-Tree / Hash の内部実装は本ガイド範囲外)。
クエリ (query): データベースへの問い合わせ。一般に SQL 文 1 つ = 1 クエリ。
DBMS が SQL を実行する流れ
SELECT 文 1 つを投げてから結果が返るまでに、DBMS は内部で次のステップを実行します。
開発者は SQL を書くだけで、これらの最適化はすべて DBMS が肩代わりしてくれます。ただし「インデックスがない / 効きにくい SQL を書いてしまう」と最適化エンジンも遅いままで実行するしかないため、Jr もインデックスの存在は意識できると良いでしょう。
DBMS の選び方
| 軸 | 選択肢 |
|---|---|
| 予算 | 潤沢 → 商用 (Oracle / SQL Server) / 限定的 → オープンソース (PostgreSQL / MySQL) |
| 規模 | 大規模・基幹 → Oracle / SQL Server / 中規模 → PostgreSQL / MySQL / 小規模・組込 → SQLite |
| 用途 | Web 新規開発 → PostgreSQL / Web 既存・WordPress → MySQL / 組込・スマホアプリ → SQLite |
個人開発・学習目的なら SQLite が最も気軽です (インストール不要・ファイル 1 つ)。Web 開発の本格的な学習を始めるなら PostgreSQL か MySQL を Docker などで立ち上げて触るのが標準的な流れです。
演習
次の処理は DBMS が肩代わりしてくれるでしょうか? それともアプリ側で書く必要があるでしょうか?
- 同じテーブルに 100 人が同時に書き込もうとしたときの順序制御
- ユーザーの入力したフォーム値が「メールアドレス形式かどうか」のチェック
- 検索条件に合うレコードを素早く取り出す
- ログインしているユーザーが「管理者か一般ユーザーか」の判定
解答例
| 番号 | 判定 | 理由 |
|---|---|---|
| 1. 同時書き込みの順序制御 | DBMS | 同時実行制御 (排他ロック・MVCC など) は DBMS の中核機能 |
| 2. メール形式チェック | 主にアプリ側 | データの形式検証はビジネスロジック寄り。DB の CHECK 制約で簡易チェックは可能だが、厳密な検証はアプリで行うのが一般的 |
| 3. レコードの高速検索 | DBMS | インデックス + クエリ最適化エンジンが肩代わり。アプリは SQL を書くだけ |
| 4. 管理者 / 一般ユーザーの判定 | 両方 | 役割を表すカラム (role) は DB に保存し、画面表示の出し分けはアプリ側が行う |
ありがちな間違い: 「DBMS は SQL を実行するだけ」と思い込むこと。同時実行制御・最適化・権限管理など、SQL の実行以外にも多くの仕事を DBMS が肩代わりしています。
次の SQL 文はそれぞれ DDL / DML / DCL / TCL のどれに分類されるでしょうか?
INSERT INTO users (name) VALUES ('Yamada');CREATE INDEX idx_email ON users(email);GRANT SELECT ON users TO analyst_user;BEGIN;ALTER TABLE users ADD COLUMN age INTEGER;SELECT COUNT(*) FROM users;
解答例
| 番号 | 分類 | 理由 |
|---|---|---|
| 1. INSERT | DML | データの操作 (追加) |
| 2. CREATE INDEX | DDL | データ構造の定義 (インデックスもオブジェクトの一種) |
| 3. GRANT | DCL | 権限の管理 |
| 4. BEGIN | TCL | トランザクションの開始 |
| 5. ALTER TABLE | DDL | テーブル構造の変更 |
| 6. SELECT | DML | データの取得 |
補足: TRUNCATE TABLE(全削除) は DDL に分類されることが多いです。同じ「データを消す」操作でも DELETE(DML) は行単位、TRUNCATE(DDL) はテーブル全体を一括で消す、と性質が違います。ロールバックの可否は RDBMS で差があり、PostgreSQL の TRUNCATE はトランザクション内で安全にロールバックできますが、MySQL や Oracle では暗黙 commit が走るためロールバックできません。
まとめ
この章で学んだことを整理します。
- DBMS は SQL 解析・最適化・トランザクション管理・権限管理など、データを扱う面倒な仕事を肩代わりするソフトウェア
- 主要な RDBMS は PostgreSQL / MySQL / SQLite / Oracle / SQL Server。本ガイドでは PostgreSQL を default にする
- SQL は DDL (定義) / DML (操作) / DCL (権限) / TCL (トランザクション) の 4 分類
- DBMS が肩代わりする機能を理解すると、自分で書く必要のあるコードと書かなくていいコードの境界が見える
次章では、リレーショナルデータベースで使われる基本用語 (テーブル / カラム / レコード / 主キー / 外部キー) と命名規則を扱います。