第3部:MySQL連携 Step 8 / 24

MySQL入門

MySQLは世界で最も使われているリレーショナルデータベース。Webアプリのデータを永続的に保存・管理します。

MySQLとは

特徴

  • オープンソースで無料
  • 高速で信頼性が高い
  • 広く使われており情報が豊富
  • クラウド対応(AWS RDS, Cloud SQL等)

SQLite との違い

  • SQLite: ファイルベース、小規模向け
  • MySQL: サーバー型、大規模対応
  • → 本番環境ではMySQLを使うことが多い

DockerでMySQLを起動

compose.yaml

services:
  db:
    image: mysql:8.0
    container_name: my-mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: myapp
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

起動と接続

# 起動
docker compose up -d

# MySQLに接続
docker compose exec db mysql -umyuser -pmypassword myapp

# または root で接続
docker compose exec db mysql -uroot -prootpassword

SQL基本操作

データベース操作

-- データベース一覧
SHOW DATABASES;

-- データベース作成
CREATE DATABASE blog;

-- データベース選択
USE blog;

-- 現在のデータベース確認
SELECT DATABASE();

テーブル作成(CREATE)

-- usersテーブル
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(255) NOT NULL UNIQUE,
    name VARCHAR(100) NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- postsテーブル
CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT NOT NULL,
    author_id INT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE
);

-- テーブル一覧
SHOW TABLES;

-- テーブル構造確認
DESCRIBE users;

データ挿入(INSERT)

-- ユーザー追加
INSERT INTO users (email, name, password_hash)
VALUES ('yamada@example.com', '山田太郎', 'hashed_password_here');

-- 複数行追加
INSERT INTO users (email, name, password_hash) VALUES
    ('tanaka@example.com', '田中花子', 'hash1'),
    ('suzuki@example.com', '鈴木一郎', 'hash2');

-- 記事追加
INSERT INTO posts (title, content, author_id)
VALUES ('はじめての投稿', 'これは最初の記事です。', 1);

データ取得(SELECT)

-- すべてのユーザー取得
SELECT * FROM users;

-- 特定のカラムのみ
SELECT id, name, email FROM users;

-- 条件付き検索
SELECT * FROM users WHERE email = 'yamada@example.com';

-- 並び替え
SELECT * FROM posts ORDER BY created_at DESC;

-- 件数制限
SELECT * FROM posts ORDER BY created_at DESC LIMIT 10;

-- JOINで関連データ取得
SELECT posts.*, users.name as author_name
FROM posts
JOIN users ON posts.author_id = users.id;

データ更新(UPDATE)

-- ユーザー名を更新
UPDATE users SET name = '山田次郎' WHERE id = 1;

-- 複数カラム更新
UPDATE posts
SET title = '更新後のタイトル', content = '更新後の本文'
WHERE id = 1;

注意:WHERE句を忘れると全件更新されます!

データ削除(DELETE)

-- 特定の記事を削除
DELETE FROM posts WHERE id = 1;

-- ユーザーを削除(関連する記事も削除される)
DELETE FROM users WHERE id = 1;

注意:WHERE句を忘れると全件削除されます!

よく使う関数

-- 件数をカウント
SELECT COUNT(*) FROM posts;

-- 条件付きカウント
SELECT COUNT(*) FROM posts WHERE author_id = 1;

-- 現在日時
SELECT NOW();

-- 日付のフォーマット
SELECT DATE_FORMAT(created_at, '%Y年%m月%d日') FROM posts;

-- LIKE検索(部分一致)
SELECT * FROM posts WHERE title LIKE '%入門%';

-- IN句
SELECT * FROM users WHERE id IN (1, 2, 3);

-- BETWEEN
SELECT * FROM posts WHERE created_at BETWEEN '2024-01-01' AND '2024-12-31';

インデックス(高速化)

よく検索するカラムにインデックスを付けると検索が速くなります。

-- インデックス作成
CREATE INDEX idx_posts_author_id ON posts(author_id);
CREATE INDEX idx_posts_created_at ON posts(created_at DESC);

-- 複合インデックス
CREATE INDEX idx_posts_author_created ON posts(author_id, created_at);

-- インデックス一覧
SHOW INDEX FROM posts;

まとめ

  • MySQLはサーバー型の本格的なデータベース
  • CRUD: CREATE, SELECT, UPDATE, DELETE
  • WHERE句を忘れない(全件操作を防ぐ)
  • よく検索するカラムにはインデックスを付ける
Docker Compose 次へ:FastAPI + MySQL