クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

テーブルとキー

このレッスンのあとで: キーを持つテーブルを、リレーショナルデータベースの中に作れる。

55分のレッスンコマンド13件MySQL と phpMyAdmin のラボ:ショップのデータベースで SQL を練習する

同じ社員番号が二人に

小さな会社が、社員の名簿を表計算ソフトで管理していました。2人の社員に、同じ社員番号31が付いてしまいました。

その結果、給与明細が別の人に届きました。

データベースなら、2つ目の31を入れようとした時点で断ります。今日は、その仕組みを作ります。

このレッスンのゴール

メモ

キーを持つテーブルを、リレーショナルデータベースの中に作れる。

重要な言葉

ことばいみれい
テーブル1種類のものを、行と列で入れておく表
データ型列に入れてよい値の種類INT
主キー行を1つずつ区別する列。同じ値は2度使えないid
外部キー別のテーブルの行を指す列route_id
制約変更のたびにデータベースが調べる決まりNOT NULL
NULL値がないことを表す印

学生が入力するセルは、このプレビューでは空白です。

テーブルは1種類のものを持つ

リレーショナルデータベースは、データをテーブルに入れます。1つのテーブルには、1種類のものだけを入れます。顧客、商品、注文などです。

列にはそれぞれデータ型があります。数字の列に文字を入れようとすると、断られます。

まず、ターミナルにログインのやり方を教えます。次の2つの Run は、このレッスン全体の準備です。

証明書を受け入れる設定

コマンド
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnf

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ショップ用の短い名前

コマンド
alias sql='mariadb -h db -u student -pstudent shop -t -e'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

表の列を見る

コマンド
sql "DESCRIBE reviews"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

例: データ型の選び方

入れる事実型理由
在庫の個数INT整数だけでよい
円の値段INT1円未満はないので整数でよい
ドルの値段DECIMAL(8,2)セントまで正確に持てる
都市の名前VARCHAR(40)40文字までの文字列
出荷した日DATE日数の計算をデータベースに任せられる
販売終了かBOOLEANはいかいいえだけ

学生が入力するセルは、このプレビューでは空白です。

主キーは行の名札

主キーは、行ごとに値が違う列です。NULL にはできません。

多くの場合、データベースが数えてくれる番号を使います。AUTO_INCREMENT です。同じキーの2行目は断られます。

2つの列を組み合わせて、1つのキーにすることもあります。その場合は、組み合わせが重ならないようにします。

2つの列でできたキー

コマンド
sql "DESCRIBE order_items"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

名前やメールアドレスを主キーにしがちです。名前は重なりますし、メールアドレスは変わります。データベースが数える番号を使い、メールアドレスは UNIQUE の列として別に持ちます。

外部キーは別の表を指す

荷物は、ある配送ルートで運ばれます。荷物の表に、ルートの詳しい情報は写しません。ルートの番号だけを入れます。

この列が外部キーです。その番号がルートの表にあるかを、データベースが調べます。

だから、存在しないルートで荷物を送ることはできません。

自分の表を2つ作ろう

このラボでは、student_ で始まる名前のデータベースを自由に作れます。小さな配送会社のために student_depot を作ります。

ショップのデータベースは、そのまま変わりません。順番に Run してください。エラーで終わる Run も、学習の一部です。

自分のデータベースを作る

コマンド
sql "CREATE DATABASE IF NOT EXISTS student_depot"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

そのための短い名前

コマンド
alias depot='mariadb -h db -u student -pstudent student_depot -t -e'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

2つの表をまとめて消す

コマンド
depot "DROP TABLE IF EXISTS parcels, routes"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

routes 表を作る

コマンド
depot "CREATE TABLE routes (id INT AUTO_INCREMENT PRIMARY KEY, town VARCHAR(40) NOT NULL UNIQUE, days INT NOT NULL DEFAULT 1)"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

parcels 表を作る

コマンド
depot "CREATE TABLE parcels (id INT AUTO_INCREMENT PRIMARY KEY, route_id INT NOT NULL, weight_kg DECIMAL(5,2) NOT NULL, sent_on DATE NOT NULL, FOREIGN KEY (route_id) REFERENCES routes(id))"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ルートを2つ入れる

コマンド
depot "INSERT INTO routes (town, days) VALUES ('Osaka', 1), ('Nagoya', 2)"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ルート9で荷物を送る

コマンド
depot "INSERT INTO parcels (route_id, weight_kg, sent_on) VALUES (9, 2.5, '2026-03-02')"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

Osaka をもう一度入れる

コマンド
depot "INSERT INTO routes (town) VALUES ('Osaka')"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

routes 表だけを消してみる

コマンド
depot "DROP TABLE routes"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

さらに挑戦

配送会社に運転手の表を足します。student_depot に drivers 表を作ります。番号の主キー、名前、UNIQUE の免許証番号を持たせます。

次に ALTER TABLE で parcels に driver_id 列を足し、drivers への外部キーを付けます。決まりごとに、それに反する行を1つ入れて、本当に断られるかを確かめます。

このラボとソースについて: MySQL と phpMyAdmin のラボ:ショップのデータベースで SQL を練習する

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。