GitHub Codespacesで MySQL学習環境をつくろう!

スポンサーリンク
DALL·E 2025-02-24 06.26.17 - A futuristic workspace with a holographic screen displaying SQL code. A person is interacting with the holographic interface, running SQL queries and MySQL

GitHubアカウントの作成

手順

  1. GitHub公式サイトにアクセスする
  2. 右上の「Sign up」をクリックする
  3. メールアドレスを入力しよう
  4. パスワードを設定する
  5. ユーザー名を入力(半角英数字、ハイフン、アンダースコアのみ)する
  6. メール認証を完了

ポイント
ユーザー名は後から変更できるが、URLに使われるので慎重に選ぼう。

リポジトリの作成

手順

  1. GitHubにログインする
  2. 右上の「+」アイコンをクリックする
  3. 「New repository」を選択する
  4. リポジトリの情報を入力:
    • Repository name: mysql-learning(任意の名前でOK)
    • Description: MySQL学習用リポジトリ(任意)
    • Public / Private: どちらでもOK
      • Public: 誰でも見られる
      • Private: 自分だけ、または招待した人だけ見られる
    • Add a README file: チェックを入れる(推奨)
  5. 「Create repository」をクリックする

必要なファイルの作成

.devcontainer/devcontainer.json を作成

  1. リポジトリのページで「Add file」→「Create new file」をクリックする
  2. ファイル名に .devcontainer/devcontainer.json と入力しよう
    • スラッシュ(/)を入れると自動的にフォルダが作成される
  3. 以下の内容をコピー&ペーストしよう
{
  "name": "MySQL Learning Environment",
  "dockerComposeFile": "docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/workspace"
}

4.そのまま「Commit changes」をクリックする(コミットメッセージはデフォルトでOK)

.devcontainer/docker-compose.yml を作成

  1. 「Add file」→「Create new file」をクリックする
  2. ファイル名に .devcontainer/docker-compose.yml と入力しよう
    ※すでに.devcontainer/が表示されている場合、docker-compose.yml` と入力すること。
  3. 以下の内容をコピー&ペーストしよう
version: '3.8'

services:
  app:
    image: mcr.microsoft.com/devcontainers/base:ubuntu
    volumes:
      - ..:/workspace:cached
    command: sleep infinity
    network_mode: service:db
    depends_on:
      - db

  db:
    image: mysql:8.0
    restart: unless-stopped
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: password

volumes:
  mysql-data:

4.「Commit changes」をクリックする

README.md を作成(既にある場合はスキップ)

  1. リポジトリのトップページに戻る
  2. README.mdが既にある場合は、鉛筆マーク(Edit)をクリックして編集
  3. 「Commit changes」をクリック

Codespacesの起動

手順

  1. リポジトリのページで緑色の「Code」ボタンをクリックする
  2. 「Codespaces」タブを選択する
  3. 「Create codespace on main」をクリックする
  4. 新しいタブが開き、Codespacesが起動する(初回は5〜10分かかる)

画面の見方

  • 左側: ファイルエクスプローラー(ファイル一覧)
  • 中央: エディター(ファイルを編集する場所)
  • 下部: ターミナル(コマンドを実行する場所)

ポイント

  • Codespacesは一定時間操作しないと自動的に停止する
  • 停止したCodespacesは「Code」→「Codespaces」から再開できる
  • データは保持されるので、続きから作業できる

MySQL学習環境のセットアップ

Codespacesが起動したら、以下の通りMySQL学習環境をセットアップしよう。

テーブル構成

部署表(departments)

カラム名データ型制約説明
department_idINTPRIMARY KEY部署番号
department_nameVARCHAR(100)NOT NULL部署名

社員表(employees)

カラム名データ型制約説明
employee_idINTPRIMARY KEY社員番号
nameVARCHAR(100)NOT NULL氏名
genderENUMNOT NULL性別(男/女)
birth_dateDATENOT NULL生年月日
salaryDECIMAL(10,2)NOT NULL給与
department_idINTFOREIGN KEY部署番号

MySQLクライアントをインストール

ターミナルで以下の通り順次実行する。

sudo apt update 
sudo apt upgrade -y
sudo apt-get install -y mysql-client

MySQLの起動を確認

# MySQLが起動するまで待つ(準備ができるとエラーが出なくなる)
mysql -h db -u root -ppassword -e "SELECT 1"

データベースとテーブルを作成

MySQLに接続しよう。

mysql -h db -u root -ppassword

以下のSQL文を順次実行する。

-- データベース作成
CREATE DATABASE company_db;
USE company_db;

-- 部署表
CREATE TABLE departments (
    department_id VARCHAR(10) PRIMARY KEY,
    department_name VARCHAR(100) NOT NULL
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 社員表
CREATE TABLE employees (
    employee_id VARCHAR(10) PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    gender ENUM('男', '女') NOT NULL,
    birth_date DATE NOT NULL,
    salary DECIMAL(10, 2) NOT NULL,
    department_id VARCHAR(10) NOT NULL,
    FOREIGN KEY (department_id) REFERENCES departments(department_id)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 部署データ
INSERT INTO departments (department_id, department_name) VALUES 
    ('001', '総務部'),
    ('002', '経理部'),
    ('003', '営業部');

-- 社員データ
INSERT INTO employees (employee_id, name, gender, birth_date, salary, department_id) VALUES 
    ('0001', '佐藤一郎', '男', '1951-01-01', 450000, '002'),
    ('0002', '鈴木二郎', '男', '1962-02-02', 400000, '003'),
    ('0003', '高橋花子', '女', '1973-03-03', 350000, '001'),
    ('0004', '田中四郎', '男', '1984-04-04', 300000, '001'),
    ('0005', '渡辺良子', '女', '1995-05-05', 250000, '003');

-- MySQLから抜ける
EXIT;

動作確認

# MySQLに接続(データベースを指定)
mysql -h db -u root -ppassword company_db

MySQLプロンプト内で以下を実行しよう。

-- テーブル確認
SHOW TABLES;

-- データ確認
SELECT * FROM employees;
SELECT * FROM departments;

注意: データベースを指定せずに接続した場合は、以下を実行しよう。

USE company_db;

基本的な使い方

MySQLへの接続

# データベースを指定して接続(推奨)
mysql -h db -u root -ppassword company_db

または、

# データベースを指定せずに接続
mysql -h db -u root -ppassword

# MySQLプロンプト内でデータベースを選択
USE company_db;

終了

quit

テーブル確認

-- テーブル一覧
SHOW TABLES;

-- 社員データを表示
SELECT * FROM employees;

-- 部署データを表示
SELECT * FROM departments;

データ検索

-- 給与が35万円以上の社員
SELECT * FROM employees WHERE salary >= 350000;

-- 営業部の社員
SELECT e.* FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.department_name = '営業部';

-- 名前に「田」を含む社員
SELECT * FROM employees WHERE name LIKE '%田%';

実行例

mysql> SELECT * FROM employees WHERE salary >= 350000;
+-------------+--------------+--------+------------+-----------+---------------+
| employee_id | name         | gender | birth_date | salary    | department_id |
+-------------+--------------+--------+------------+-----------+---------------+
| 0001        | 佐藤一郎     | 男     | 1951-01-01 | 450000.00 | 002           |
| 0002        | 鈴木二郎     | 男     | 1962-02-02 | 400000.00 | 003           |
| 0003        | 高橋花子     | 女     | 1973-03-03 | 350000.00 | 001           |
+-------------+--------------+--------+------------+-----------+---------------+
3 rows in set (0.00 sec)
mysql> SELECT e.* FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.department_name = '営業部';
+-------------+--------------+--------+------------+-----------+---------------+
| employee_id | name         | gender | birth_date | salary    | department_id |
+-------------+--------------+--------+------------+-----------+---------------+
| 0002        | 鈴木二郎     | 男     | 1962-02-02 | 400000.00 | 003           |
| 0005        | 渡辺良子     | 女     | 1995-05-05 | 250000.00 | 003           |
+-------------+--------------+--------+------------+-----------+---------------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM employees WHERE name LIKE '%田%';
+-------------+--------------+--------+------------+-----------+---------------+
| employee_id | name         | gender | birth_date | salary    | department_id |
+-------------+--------------+--------+------------+-----------+---------------+
| 0004        | 田中四郎     | 男     | 1984-04-04 | 300000.00 | 001           |
+-------------+--------------+--------+------------+-----------+---------------+
1 row in set (0.00 sec)

データ集計

-- 部署別の社員数
SELECT 
    d.department_name,
    COUNT(e.employee_id) as employee_count
FROM departments d
LEFT JOIN employees e ON d.department_id = e.department_id
GROUP BY d.department_name;

-- 部署別の平均給与
SELECT 
    d.department_name,
    AVG(e.salary) as average_salary,
    MIN(e.salary) as min_salary,
    MAX(e.salary) as max_salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
GROUP BY d.department_name;

実行例

mysql> SELECT d.department_name,
    -> COUNT(e.employee_id) as employee_count
    -> FROM departments d
    -> LEFT JOIN employees e ON d.department_id = e.department_id
    -> GROUP BY d.department_name;
+-----------------+----------------+
| department_name | employee_count |
+-----------------+----------------+
| 総務部          |              2 |
| 経理部          |              1 |
| 営業部          |              2 |
+-----------------+----------------+
3 rows in set (0.06 sec)
mysql> SELECT 
    ->  d.department_name,
    -> AVG(e.salary) as average_salary,
    -> MIN(e.salary) as min_salary,
    -> MAX(e.salary) as max_salary
    -> FROM employees e
    -> JOIN departments d ON e.department_id = d.department_id
    -> GROUP BY d.department_name;
+-----------------+----------------+------------+------------+
| department_name | average_salary | min_salary | max_salary |
+-----------------+----------------+------------+------------+
| 総務部          |  325000.000000 |  300000.00 |  350000.00 |
| 経理部          |  450000.000000 |  450000.00 |  450000.00 |
| 営業部          |  325000.000000 |  250000.00 |  400000.00 |
+-----------------+----------------+------------+------------+
3 rows in set (0.00 sec)

結合クエリ

-- 社員と部署を結合して表示
SELECT 
    e.employee_id,
    e.name,
    e.gender,
    e.birth_date,
    e.salary,
    d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

実行例

mysql> SELECT
    -> e.employee_id,
    -> e.name,
    -> e.gender,
    -> e.birth_date,
    -> e.salary,
    -> d.department_name
    -> FROM employees e
    -> JOIN departments d ON e.department_id = d.department_id;
+-------------+--------------+--------+------------+-----------+-----------------+
| employee_id | name         | gender | birth_date | salary    | department_name |
+-------------+--------------+--------+------------+-----------+-----------------+
| 0003        | 高橋花子     | 女     | 1973-03-03 | 350000.00 | 総務部          |
| 0004        | 田中四郎     | 男     | 1984-04-04 | 300000.00 | 総務部          |
| 0001        | 佐藤一郎     | 男     | 1951-01-01 | 450000.00 | 経理部          |
| 0002        | 鈴木二郎     | 男     | 1962-02-02 | 400000.00 | 営業部          |
| 0005        | 渡辺良子     | 女     | 1995-05-05 | 250000.00 | 営業部          |
+-------------+--------------+--------+------------+-----------+-----------------+
5 rows in set (0.00 sec)

並び替え

-- 性別で分けて、各性別内で生年月日順
SELECT gender, name, birth_date 
FROM employees 
ORDER BY FIELD(gender, '男', '女'), birth_date ASC;

実行例

mysql> SELECT gender, name, birth_date 
    -> FROM employees
    -> ORDER BY FIELD(gender, '男', '女'), birth_date ASC;
+--------+--------------+------------+
| gender | name         | birth_date |
+--------+--------------+------------+
| 男     | 佐藤一郎     | 1951-01-01 |
| 男     | 鈴木二郎     | 1962-02-02 |
| 男     | 田中四郎     | 1984-04-04 |
| 女     | 高橋花子     | 1973-03-03 |
| 女     | 渡辺良子     | 1995-05-05 |
+--------+--------------+------------+
5 rows in set (0.00 sec)

ターミナルから直接実行

MySQLプロンプトに入らずに、ターミナルから直接SQLを実行することもできる。

# テーブル一覧(データベース名を指定)
mysql -h db -u root -ppassword company_db -e "SHOW TABLES;"

# 全社員表示
mysql -h db -u root -ppassword company_db -e "SELECT * FROM employees;"

# 複雑なクエリも実行可能
mysql -h db -u root -ppassword company_db -e "
SELECT d.department_name, COUNT(*) as count
FROM employees e
JOIN departments d ON e.department_id = d.department_id
GROUP BY d.department_name;"

重要: ターミナルから実行する場合は、必ず -e オプションの前にデータベース名 company_db を指定しよう。

学習リソース

接続情報

  • ホスト: db
  • ユーザー: root
  • パスワード: password
  • データベース: company_db
  • ポート: 3306

ファイル構成

mysql-learning/
├── .devcontainer/
│   ├── devcontainer.json    # Codespaces設定
│   └── docker-compose.yml   # Docker構成
└── README.md               

次回以降の起動

Codespacesを再起動した場合

  1. データは保持されているので、すぐに使える
  2. 以下の通りMySQLに接続しよう
mysql -h db -u root -ppassword company_db

変更をコミット&プッシュ

Codespacesで作業した内容をGitHubに保存(プッシュ)する方法を説明しよう。

変更を確認

ターミナルで以下のコマンドを実行する。

git status

変更をステージングに追加

# すべての変更を追加
git add .

# 特定のファイルだけ追加する場合
git add ファイル名

コミット(変更を記録)

git commit -m "コミットメッセージ"

コミットメッセージの例:

  • git commit -m "練習用クエリを追加"
  • git commit -m "VIEWを作成"
  • git commit -m "README修正"

ポイント:

  • コミットメッセージは何を変更したか分かるように書こう
  • 日本語でOK

プッシュ(GitHubに送信)

git push

成功すると以下の通り表示される。

Enumerating objects: 4, done.
...
To https://github.com/ユーザー名/mysql-learning
   abc1234..def5678  main -> main

私のGitHubプロフィール

コメント

タイトルとURLをコピーしました