← ハンズオン一覧に戻る

AWS Hands-on / Database

表と主キーで、データを SQL から操作する

RDS で MySQL のインスタンスを作り、表(テーブル)に行を追加・検索・更新・削除する基本の SQL 操作をひととおり体験します。「主キーで一意に識別する」「列ごとに型を決める」など、リレーショナルデータベースの考え方の土台を身につけます。

● Lv.2 基本的なリソースを作れる人 ⏱ 所要 40〜60 分 コンソール操作 + コマンドラインから SQL を実行
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • あると良い表計算ソフトのような「行と列」のデータイメージ。SQL やリレーショナルデータベースの経験は不要です(このハンズオンの中で説明します)

※ コンソール操作に加えて、ローカルのターミナルから mysql クライアントで SQL を実行します。RDS をパブリックアクセス可能にして、ローカルから直接接続します(ネットワークの細かい設計はこのハンズオンの範囲外とし、デフォルト VPC を使います)。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

表計算ソフトで行と列にデータを整理した経験がある人は多いと思います。リレーショナルデータベースも考え方は近く、データを「表(テーブル)」に整理して保存します。ただし表計算ソフトと違い、あらかじめ各列の「型」(文字列なのか数値なのか)を決め、表の中の1行を一意に区別するための「主キー」を必ず持たせます。こうした決まりごとがあることで、大量のデータの中から目的の行を高速に・正確に探したり、更新したりできるようになります。

今回は RDS で MySQL のデータベースを作り、SQL(データベースを操作するための言語)の基本となる4つの命令を実際に使ってみます。

テーブルの「主キー」って何のためにあるの?

主キーは、表の中の1行を他の行と確実に区別するための値です。例えば「商品ID」を主キーにすれば、たとえ同じ商品名の行が2つあっても、商品IDを指定すれば必ず1行だけを正確に取得・更新・削除できます。主キーの値は、同じテーブルの中で重複してはいけません。

列の「型」を最初に決めないといけないのはなぜ?

型(文字列・数値・日付など)を決めておくことで、データベースは値を正しく扱えます。例えば金額の列を数値型にしておけば「合計を計算する」といった処理が正確に行えますし、誤って文字列を入れようとするとエラーで気づけます。表計算ソフトのように後から自由に何でも入れられるわけではない、という違いがあります。

SQLって何の略?

Structured Query Language(構造化照会言語)の略です。データベースに対して「表を作る」「行を追加する」「条件に合う行を探す」「更新する」「削除する」といった指示を出すための言語です。今回扱う CREATE TABLE・INSERT・SELECT・UPDATE・DELETE の5つは、その中でも最も基本となる命令です。

Goal

RDS for MySQL のインスタンスを作成し、主キーを持つテーブルを1つ作る。SQL の基本命令(INSERT・SELECT・UPDATE・DELETE)を使って、行の追加・検索・更新・削除をひととおり実行する。

04 — SQL Commands

つくる構成

今回はネットワーク構成図の代わりに、これから使う SQL の基本5命令を1枚ずつのカードで示します。06「構築の進め方」の各ステップで、ここに出てくる命令を実際に使っていきます。

CREATE TABLE

列の構成(列名・型)と主キーを指定して、新しい表を作ります。

CREATE TABLE テーブル名 ( 列名 型 PRIMARY KEY, ... );

INSERT

テーブルに新しい行(データ)を1件追加します。

INSERT INTO テーブル名 (列名, ...) VALUES (値, ...);

SELECT

テーブルから行を取得します。WHERE 句で条件を絞り込めます。

SELECT * FROM テーブル名 WHERE 条件;

UPDATE

条件に合う行の値を変更します。WHERE 句を省略すると全行が対象になります。

UPDATE テーブル名 SET 列名 = 値 WHERE 条件;

DELETE

条件に合う行を削除します。WHERE 句を省略すると全行が削除されます。

DELETE FROM テーブル名 WHERE 条件;
05 — Requirements

要件

以下の要件を満たし、RDS for MySQL への SQL の基本操作をひととおり体験してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2RDS for MySQL のインスタンスを1つ作成する(パブリックアクセス「あり」、セキュリティグループのインバウンドはマイIPのみ許可、ネットワークはデフォルト VPC でよい)。
3主キーを持つテーブルを1つ作成する(テーブル名・列構成は自由。例:商品ID(主キー、整数型)、商品名(文字列型)、価格(整数型)を持つ products テーブル)。
4INSERT 文でデータを4〜5件追加し、SELECT 文で全件取得WHERE 句での条件付き取得をそれぞれ試す。
5UPDATE 文で1件の値を更新し、DELETE 文で1件を削除する。それぞれ SELECT 文で結果を確認する。
06 — Steps

構築の進め方

「データベースを作る → つなぐ → 表を作る → データを出し入れする」という順番で、SQL の基本操作を一通り経験します。

  1. マネジメントコンソールにサインインし、リージョンを東京に合わせる

    ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。

  2. RDS の「データベースの作成」で、MySQL のインスタンスを作成する

    RDS コンソールを開き、「データベースの作成」からエンジンの種類で「MySQL」を選びます。テンプレートは無料利用枠などを選び、マスターユーザー名・パスワードを決めます。接続関連の設定でパブリックアクセス「あり」を選び、VPC セキュリティグループは新規作成にして、インバウンドルールが「マイIP」のみを許可するようにします。

    なぜパブリックアクセスを「あり」にするのか

    本来は非公開のネットワークに置くことが多いのですが、今回は SQL の操作そのものを学ぶことに焦点を当てるため、ローカルの端末から直接つなげる構成にしています。ネットワークの細かい設計(非公開化など)は、このハンズオンの範囲外とします。

    マスターユーザー名・パスワード・DB インスタンス識別子は自由に決めて構いません(例:ユーザー名 admin)。後の手順で使うので、メモしておきましょう。

  3. ローカルのターミナルに mysql クライアントをインストールする

    お使いの OS に応じて、SQL を実行するための mysql クライアントを用意します。

    macOS(Homebrew を使う場合)
    # mysql-client をインストールする例
    brew install mysql-client
    echo 'export PATH="/opt/homebrew/opt/mysql-client/bin:$PATH"' >> ~/.zshrc
    Windows / Linux の場合

    Windows の場合は MySQL の公式サイトから「MySQL Shell」または「MySQL Installer」をダウンロードしてインストールします。Linux(Ubuntu など)の場合は sudo apt install mysql-client のようなパッケージマネージャーのコマンドで導入できます。

  4. RDS のエンドポイントを使って mysql クライアントから接続する

    RDS コンソールで作成したインスタンスの詳細を開き、「エンドポイント」をコピーします。ターミナルから次のように接続します。

    ローカルのターミナル
    mysql -h あなたのエンドポイント -u admin -p

    パスワードの入力を求められたら、手順2で決めたマスターパスワードを入力します。mysql> というプロンプトが表示されれば接続成功です。

  5. CREATE TABLE 文でテーブルを作成する

    主キーを持つテーブルを作成します。主キーにする列には PRIMARY KEY を指定します。

    mysql プロンプトの中で実行
    CREATE TABLE products (
      product_id INT PRIMARY KEY,
      product_name VARCHAR(50),
      price INT
    );

    SHOW TABLES; を実行し、作成したテーブルが一覧に表示されることを確認しましょう。

  6. INSERT 文で行を4〜5件追加する

    文字列の値はシングルクォート(')で囲み、数値の値はそのまま書きます。

    mysql プロンプトの中で実行
    INSERT INTO products (product_id, product_name, price) VALUES (1, 'ノート', 150);
    INSERT INTO products (product_id, product_name, price) VALUES (2, 'ペン', 100);
    INSERT INTO products (product_id, product_name, price) VALUES (3, '消しゴム', 80);
    INSERT INTO products (product_id, product_name, price) VALUES (4, 'はさみ', 300);
  7. SELECT 文で全件取得し、続けて WHERE 句で条件を指定した取得を試す

    mysql プロンプトの中で実行
    -- 全件取得
    SELECT * FROM products;
    
    -- 価格が 100 以上の行だけ取得
    SELECT * FROM products WHERE price >= 100;

    追加した行数と、全件取得した結果の件数が一致していることを確認しましょう。

  8. UPDATE 文で1件の値を変更し、SELECT 文で変わったことを確認する

    mysql プロンプトの中で実行
    UPDATE products SET price = 120 WHERE product_id = 2;
    SELECT * FROM products WHERE product_id = 2;
    WHERE 句で対象を絞り込む

    WHERE product_id = 2 のように主キーを指定すると、その1行だけが対象になります。

  9. DELETE 文で1件を削除し、SELECT 文で件数が減ったことを確認する

    mysql プロンプトの中で実行
    DELETE FROM products WHERE product_id = 3;
    SELECT * FROM products;

    削除した行が結果に含まれておらず、件数が1件減っていることを確認しましょう。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — INSERT や WHERE で SQL エラーになる

「文字列の値をクォートし忘れて、SQL エラーになる」

文字列の値はシングルクォート(')で囲む必要がありますが、数値の値は囲む必要がありません。エラーが出たら、自分が入力した値が文字列の列なのか数値の列なのかを見直し、クォートの有無が型と合っているか確認してみましょう。

Pitfall 02 — UPDATE や DELETE の影響範囲が想定と違う

「WHERE 句を付けずに実行してしまい、テーブルの全行が変更・削除される」

WHERE 句は「対象を絞り込む」ためのもので、省略すると全行が対象になります。UPDATE や DELETE を実行する前に、まず同じ条件で SELECT 文を実行し、対象になる行が想定どおりかを確認する習慣をつけておくと安心です。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。mysql クライアントの実行結果を見ながら、次を順に確かめましょう。

  • SHOW TABLES; を実行すると、作成したテーブルが一覧に表示される。
  • INSERT した行数と、SELECT * FROM テーブル名; の結果に表示される件数が一致している。
  • WHERE 句を付けた SELECT 文の結果が、条件に合う行だけに絞り込まれている。
  • UPDATE した行を SELECT した結果で、変更した列の値が新しい値になっている。
  • DELETE した行が、SELECT した結果の一覧から消えている。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. 主キーがないテーブルで、同じ内容の行を2回 INSERT したら何が起きそうでしょうか。
    ヒント
    主キーは行を一意に識別するための仕組みです。主キーがない、あるいは主キーの値が重複していない状態だと、データベースは「同じ内容の行」を区別する手段を持たなくなります。1行だけを指定して更新・削除したいときに、何が困りそうかという観点から考えてみましょう。
  2. WHERE 句を付けずに DELETE を実行してしまったら、データはどうなるでしょうか。事前にできる対策はあるでしょうか。
    ヒント
    WHERE 句のない DELETE は、テーブルの全行が対象になります。実行前に同じ条件で SELECT して対象行を確認する、バックアップ(スナップショット)を取っておく、といった「取り返しのつく状態」を事前に作っておく考え方を整理してみましょう。
  3. 列の型をあらかじめ決めて表で管理する設計と、項目ごとに自由に属性を持てる設計(リレーショナルではないデータベースの考え方)では、それぞれどんな場面に向いていそうでしょうか。
    ヒント
    型や列構成を事前に決める設計は、データの整合性を保ちやすく、複数の表を組み合わせた複雑な検索に向いています。一方、項目ごとに自由に属性を持てる設計は、データの形が一定でない場合や、キーを指定した高速なアクセスに向いています。「データの形がどれくらい決まっているか」という観点から考えてみましょう。
10 — Clean up

後片づけ

このハンズオンで作成したリソースを削除し、片づけましょう。

  1. RDS インスタンスを削除する:RDS コンソールの「データベース」一覧から作成したインスタンスを選び、「アクション」→「削除」を実行する。削除時に「最終スナップショットを作成しますか」と聞かれるので、もう使わないデータであればスナップショットを作成しない選択でも構いません(学習用データを残したい場合は作成を選びます)。
  2. セキュリティグループを削除する:RDS インスタンスの削除が完了したあと、EC2 コンソールの「セキュリティグループ」一覧から、手順2で新規作成したセキュリティグループを選び、削除する。
Caution — 他で使っているリソースは消さない

削除するのは、このハンズオンで自分が作ったものだけ

セキュリティグループの一覧には、デフォルトのセキュリティグループや、他の用途で使っているリソースが並んでいるかもしれません。間違えて削除しないよう、このハンズオンのために作成したものだけを選んで削除してください。デフォルト VPC 自体は削除しないでください。

コストに関する注意: RDS インスタンスは、起動している時間に応じて料金が発生します。無料利用枠の対象インスタンスタイプを選んでいても、利用枠を超えると課金される点に注意してください。検証が終わったら、後片づけの手順に沿ってRDS インスタンスを削除することを忘れないようにしましょう。セキュリティグループ自体には料金はかかりません。