メインコンテンツまでスキップ

第6章 DBMS と SQL — データを操作する仕組みと共通言語

この章で学ぶこと

  • DBMS の主要機能を 5 つ挙げられる
  • SQL の 4 種類 (DDL / DML / DCL / TCL) の違いを説明できる
  • 主要な RDBMS 製品の特徴を理解し、用途に応じて選べる

DBMS は「データのプロ」

DBMS (Database Management System) は、アプリケーションとデータの間に立って、SQL の解析・最適化・実行・データ保存・同時アクセス制御などを一手に引き受けるソフトウェアです。

DBMS がなかったら

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・小規模ツール
PostgreSQL と MySQL のシェア比較

Stack Overflow Developer Survey 2025 では、PostgreSQL が専門開発者の 58.2% が使用する「最も使われている」データベース 1 位で、MySQL は 39.6% で 2 位です。一方、WordPress や既存の LAMP スタックなど運用中のシステムでの採用実績は MySQL が厚く、既存案件では MySQL に触れる機会も多くあります。新規プロジェクトでは PostgreSQL が選ばれる傾向が強く、本ガイドのコード例も PostgreSQL を default として採用しています。

商用系

製品ベンダー特徴主な用途
Oracle DatabaseOracle大規模システム向けの機能と性能銀行・通信・大企業の基幹システム
Microsoft SQL ServerMicrosoftWindows 環境との親和性企業向け業務システム全般
Db2IBMメインフレームと親和銀行・保険のレガシーシステム

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: テーブル作成・インデックス作成

従業員テーブルの作成 (PostgreSQL)
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
Jr が最初に触るなら

個人開発・学習目的なら SQLite が最も気軽です (インストール不要・ファイル 1 つ)。Web 開発の本格的な学習を始めるなら PostgreSQLMySQL を Docker などで立ち上げて触るのが標準的な流れです。

演習

演習 1: DBMS の役割を判定

次の処理は DBMS が肩代わりしてくれるでしょうか? それともアプリ側で書く必要があるでしょうか?

  1. 同じテーブルに 100 人が同時に書き込もうとしたときの順序制御
  2. ユーザーの入力したフォーム値が「メールアドレス形式かどうか」のチェック
  3. 検索条件に合うレコードを素早く取り出す
  4. ログインしているユーザーが「管理者か一般ユーザーか」の判定
解答例
番号判定理由
1. 同時書き込みの順序制御DBMS同時実行制御 (排他ロック・MVCC など) は DBMS の中核機能
2. メール形式チェック主にアプリ側データの形式検証はビジネスロジック寄り。DB の CHECK 制約で簡易チェックは可能だが、厳密な検証はアプリで行うのが一般的
3. レコードの高速検索DBMSインデックス + クエリ最適化エンジンが肩代わり。アプリは SQL を書くだけ
4. 管理者 / 一般ユーザーの判定両方役割を表すカラム (role) は DB に保存し、画面表示の出し分けはアプリ側が行う

ありがちな間違い: 「DBMS は SQL を実行するだけ」と思い込むこと。同時実行制御・最適化・権限管理など、SQL の実行以外にも多くの仕事を DBMS が肩代わりしています。

演習 2: SQL の分類クイズ

次の SQL 文はそれぞれ DDL / DML / DCL / TCL のどれに分類されるでしょうか?

  1. INSERT INTO users (name) VALUES ('Yamada');
  2. CREATE INDEX idx_email ON users(email);
  3. GRANT SELECT ON users TO analyst_user;
  4. BEGIN;
  5. ALTER TABLE users ADD COLUMN age INTEGER;
  6. SELECT COUNT(*) FROM users;
解答例
番号分類理由
1. INSERTDMLデータの操作 (追加)
2. CREATE INDEXDDLデータ構造の定義 (インデックスもオブジェクトの一種)
3. GRANTDCL権限の管理
4. BEGINTCLトランザクションの開始
5. ALTER TABLEDDLテーブル構造の変更
6. SELECTDMLデータの取得

補足: 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 が肩代わりする機能を理解すると、自分で書く必要のあるコードと書かなくていいコードの境界が見える

次章では、リレーショナルデータベースで使われる基本用語 (テーブル / カラム / レコード / 主キー / 外部キー) と命名規則を扱います。