MySQL: MySQLの概要とデータベースの基本概念
MySQLは、世界で最も普及しているオープンソースのリレーショナルデータベース管理システムであり、データの保存やクエリの実行を簡単かつ効率的に行えます。
このチュートリアルは、経験のない初心者向けに作成されています。データベースの基礎から始まり、MySQL を使ったデータ管理を自在に扱えるようになるまで段階的に解説しています。
1. 学習内容
- データベースとは何か、なぜそれが必要なのか?
- リレーショナルデータベースと非リレーショナルデータベースの違い
- MySQLの歴史とバージョンの変遷
- MySQLの主な利点と活用事例
- MySQLのインストールと接続の基本
2. ある開発者の実話
(1) 課題:Excelではもはや対応しきれない
あるEコマースのオペレーションマネージャーに、緊急の任務が割り当てられた。
「過去12か月間の販売動向を、5,000人の顧客と30,000件の注文を対象にまとめ、明日の朝、CEOに報告してください。」
Excelファイルを開く:100,000行以上のデータ、ファイルサイズ 50 MB。
問題は次々と起こった:
- Excelを開くのに3分かかり、フィルターを適用するたびに動作が重くなる
- 「顧客テーブル」と「注文テーブル」を関連付けたいのですが、VLOOKUPを使い続けていて、もう頭を抱えそうになっています。
- データは更新されましたが、レポートは自動的に更新されません。
- 3人の同僚が同時に編集すると? ファイルの競合、データの損失
(2) データベースソリューション
MySQL を使った再設計:
-- Create a Customer Table
CREATE TABLE customers (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(150)
);
-- Create the Orders Table
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
amount DECIMAL(10,2),
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
-- One SQL Identify Annual Sales Trends
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
COUNT(*) AS total_orders,
SUM(amount) AS total_revenue
FROM orders
WHERE order_date >= '2025-07-01'
GROUP BY month
ORDER BY month;
収量の比較:
| 次元 | Excel | MySQL |
|---|---|---|
| 10万行のクエリ | 30秒以上 | 1秒未満 |
| マルチテーブル結合 | 手動のVLOOKUP | 自動結合 |
| 共同編集 | ファイルの競合 | 競合のない同時読み書き操作 |
| データの更新 | 手動による更新 | 最新データのリアルタイムクエリ |
| データセキュリティ | データ損失のリスク | トランザクションおよびバックアップの保護 |
3. データベースとは何か?
データベースとは、データ構造に従ってデータを整理、保存、管理するための保管場所のことです。
(1) データベースとファイルストレージの比較
graph TB
A[Data Storage Methods] --> B[File Storage]
A --> C[Database]
B --> D[Excel / CSV / TXT]
B --> E[Manual Management,Low efficiency]
C --> F[Structured Storage]
C --> G[Efficient Queries,Safe and Reliable]
| ディメンション | ファイルストレージ | データベース |
|---|---|---|
| データ量 | 数千行 | 数百万~数億行 |
| クエリ速度 | 遅い(ファイル全体スキャン) | 速い(インデックス最適化) |
| 同時アクセス | 未対応 | 複数のユーザーによる同時読み取り/書き込みアクセスをサポート |
| データの整合性 | 保証されない | 制約条件およびトランザクションは保証される |
| セキュリティ | ファイルレベル | ユーザー権限 + 暗号化 |
(2) データベースのカテゴリ
graph TB
A[Database] --> B[Relational Database RDBMS]
A --> C[Non-relational database NoSQL]
B --> D[MySQL / PostgreSQL]
B --> E[Oracle / SQL Server]
B --> F[SQLite]
C --> G[Key-value type: Redis]
C --> H[Document-based: MongoDB]
C --> I[Column Type: Cassandra]
C --> J[Graph Database: Neo4j]
| タイプ | 代表的な製品 | データモデル | 適用シナリオ |
|---|---|---|---|
| リレーショナル | MySQL、PostgreSQL | テーブル(行+列) | 構造化データ、トランザクション処理 |
| キー・バリュー | Redis | キー・バリューペア | キャッシュ、セッション、リーダーボード |
| ドキュメント型 | MongoDB | JSON/BSON ドキュメント | 半構造化データ、コンテンツ管理 |
| カラムファミリーの種類 | Cassandra | カラムファミリー | ビッグデータ分析、時系列データ |
| グラフデータベース | Neo4j | ノード + エッジ | ソーシャルネットワーク、レコメンデーションシステム |
4. リレーショナルデータベースの基本概念
(1) 表
テーブルは、データベースにデータを格納するための基本単位であり、行と列で構成されています。
graph LR
subgraph customers Table
direction TB
H[id | name | email | created_at]
R1[1 | Alice | alice@email.com | 2025-01-15]
R2[2 | Bob | bob@email.com | 2025-02-20]
R3[3 | Charlie | charlie@email.com | 2025-03-10]
end
| 用語 | 定義 | 例 |
|---|---|---|
| 表 | データの集まり | customers 表 |
| 行 | 特定のレコード | アリスの詳細情報 |
| 列 | データの属性 | name 列 |
| 主キー | 各行を一意に識別するフィールド | id 列 |
| 外部キー | 別のテーブルを参照するフィールド | orders.customer_id |
(2) 関係の種類
erDiagram
CUSTOMERS ||--o{ ORDERS : "A customer has multiple orders"
ORDERS ||--|{ ORDER_ITEMS : "An order contains multiple line items"
PRODUCTS ||--o{ ORDER_ITEMS : "An item appears in multiple orders"
| 関係の種類 | 説明 | 例 |
|---|---|---|
| 1対1(1:1) | あるレコードが別のレコードに対応する | ユーザー ↔ IDカード |
| 1対多 (1:N) | 1つのレコードが複数のレコードに対応する | 顧客 → 注文 |
| 多対多 (M:N) | 複数のレコードが互いに対応し合う | 学生 ↔ 科目(履修登録フォームを介して) |
(3) SQL言語の分類
SQL(構造化問い合わせ言語)は、リレーショナルデータベースを扱うための標準的な言語です。
| カテゴリ | 正式名称 | キーワード | 目的 |
|---|---|---|---|
| DDL | データ定義言語 | CREATE/ALTER/DROP | データベース構造を定義する |
| DML | データ操作言語 | INSERT/UPDATE/DELETE | データの挿入、更新、削除 |
| DQL | データクエリ言語 | SELECT | データのクエリ |
| DCL | データ制御言語 | GRANT/REVOKE | 権限管理 |
| TCL | トランザクション制御言語 | COMMIT/ROLLBACK | トランザクション制御 |
5. MySQLの歴史
(1) バージョン履歴
timeline
title MySQL Version History
1995 : MySQL 1.0 Published
: From Sweden MySQL AB Company Development
2000 : MySQL 3.23
: Supports transaction processing
2003 : MySQL 4.0
: Support UNION Search
2005 : MySQL 5.0
: Supports stored procedures、View、Trigger
2008 : Sun Acquisition MySQL AB
2010 : Oracle Acquisition Sun
: Obtain MySQL Ownership
2013 : MySQL 5.6
: InnoDB Full-Text Search
2016 : MySQL 5.7
: JSON Support、Performance Improvements
2018 : MySQL 8.0
: Window Functions、CTE、Characters
2024 : MySQL 8.4 LTS
: Long-Term Support Version
2024 : MySQL 9.0 Innovation
: Latest Innovative Version
(2) MySQLの設計思想
MySQLの設計上の基本原則:
シンプルさを第一に
- インストールと設定が簡単で、習得も容易です
- 構文は直感的で、自然言語に非常に近い
パフォーマンス最優先
- 読み取り速度が極めて高速であるため、読み取りが頻繁で書き込みが少ないワークロードに最適です
- InnoDB ストレージエンジンは、高性能なトランザクション処理を実現します
オープン・エコシステム
- オープンソースかつ無料(GPLライセンス)
- 多種多様なサードパーティ製ツールやドライバー
6. MySQLの主な利点
(1) メリットの比較
| ディメンション | MySQL | PostgreSQL | Oracle | SQL Server |
|---|---|---|---|---|
| 価格 | 無料(オープンソース) | 無料(オープンソース) | 高価(商用) | 高価(商用) |
| 学習難易度 | ⭐ 簡単 | ⭐⭐ 普通 | ⭐⭐⭐ 難しい | ⭐⭐ 普通 |
| 読み取り性能 | ⭐⭐⭐ 極めて高速 | ⭐⭐ 高速 | ⭐⭐ 高速 | ⭐⭐ 高速 |
| 地域活動 | ⭐⭐⭐ 非常に高い | ⭐⭐ 高い | ⭐ 普通 | ⭐ 普通 |
| 利用事例 | Webアプリケーション、eコマース | 複雑なクエリ、GIS | 大規模エンタープライズシステム | Windowsエコシステム |
(2) 代表的なユースケース
mindmap
root((MySQL Applications))
Web Development
Blog System
E-commerce Platform
Social Networks
Content Management
Enterprise Applications
ERP System
CRM System
Inventory Management
Order Processing
Data Analysis
Log Storage
User Behavior
Report Statistics
Mobile Apps
App Backend
Game Data
Push Notification System
MySQLは誰が利用しているのか?
| 会社 | 目的 |
|---|---|
| Meta(Facebook) | ユーザーデータ、ソーシャルグラフ |
| ツイート、ユーザープロフィール | |
| GitHub | コードリポジトリ、ユーザーデータ |
| Airbnb | 掲載物件、予約、ユーザー |
| Shopify | ECサイトのバックエンド、商品、注文 |
| Booking.com | ホテルの予約、ユーザーレビュー |
7. MySQLの簡単な紹介
(1) 3つのステップでMySQLに接続する
| ステップ | コマンド/アクション |
|---|---|
| 1. インストール | 1つのコマンドでDockerを起動する(詳細はレッスン2を参照) |
| 2. 接続 | mysql -u root -p |
| 3. 検証 | SELECT VERSION(); |
📖 次のレッスンでは、クロスプラットフォームでのインストール(Windows/Mac/Linux/Docker)、MySQL Workbenchへの接続、およびセキュリティ設定について詳しく解説します。このセクションでは、概要を簡単に紹介するのみです。
▶ サンプル:1つのコマンドでDockerを起動する
# Pull and Start MySQL 8.0 (see Lesson 2 for details)
docker run -d --name mysql-tutorial \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=MyPass123! \
mysql:8.0
# Enter MySQL Command Line
docker exec -it mysql-tutorial mysql -u root -pMyPass123!
▶ サンプル:接続後の簡易確認
-- View MySQL Version
SELECT VERSION();
-- View All Databases
SHOW DATABASES;
出力:
+-----------+
| VERSION() |
+-----------+
| 8.0.36 |
+-----------+
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
▶ サンプル:最初のデータベースとテーブルの作成
-- 1. Create a Database
CREATE DATABASE my_first_db;
-- 2. Using the Database
USE my_first_db;
-- 3. Create a user table
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 4. Insert Data
INSERT INTO users (username, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO users (username, email) VALUES ('Bob', 'bob@example.com');
-- 5. Query Data
SELECT * FROM users;
出力:
+----+----------+-----------------+---------------------+
| id | username | email | created_at |
+----+----------+-----------------+---------------------+
| 1 | Alice | alice@example.com | 2026-07-03 10:30:00 |
| 2 | Bob | bob@example.com | 2026-07-03 10:30:01 |
+----+----------+-----------------+---------------------+
▶ サンプル:データに対するCRUD操作
-- Conditional Query
SELECT username, email FROM users WHERE username = 'Alice';
-- Update Data
UPDATE users SET email = 'alice_new@example.com' WHERE id = 1;
-- Delete Data
DELETE FROM users WHERE id = 2;
-- Count the number of users
SELECT COUNT(*) AS total_users FROM users;
❓ よくある質問
📖 まとめ
- データベースとは、データ構造に従ってデータを整理、保存、管理するためのリポジトリのことです。
- リレーショナルデータベースは、データをテーブル(行と列)の形式で格納し、テーブル間の関連性をサポートします。
- SQL は、リレーショナルデータベースを操作するための標準言語であり、DDL、DML、DQL、DCL、TCL の 5 つのカテゴリに分類されます。
- MySQLは、世界で最も普及しているオープンソースのリレーショナルデータベースです。シンプルで高速、しかも無料です。
- MySQL 8.0以降は現在の主流バージョンであり、ウィンドウ関数、JSON、ロールなどの新機能をサポートしています。
- Docker は、MySQL をインストールする最も簡単な方法です
📝 練習問題
-
基本演習(難易度:⭐):Docker を使用して MySQL 8.0 をインストールします。接続したら、
SELECT VERSION();を実行してバージョン番号を確認してください。 -
上級問題(難易度 ⭐⭐):
schoolという名前のデータベースを作成し、その中にstudents(id, name, age, grade)という名前のテーブルを含め、5件のレコードを挿入し、すべてのレコードをクエリで取得してください。 -
チャレンジ問題(難易度:⭐⭐⭐):
coursesテーブルと、それに関連するstudent_coursesテーブル(多対多の関係)を作成し、適切なフィールドを設計した上で、JOIN を使用して、特定の学生が履修したすべてのコースをクエリで抽出してください。