CodeGym /コース /SQL SELF /studentsテーブルの作成と coursesテーブルとの...

studentsテーブルの作成と coursesテーブルとの関連付け

SQL SELF
レベル 20, レッスン 0
使用可能

ちょっと時間をとって、今までやった内容をおさらいしよう。ステップごとに何が起きてるか、しっかり確認していくよ。この先、今まで学んだことがベースになることがたくさん出てくるから、各コマンドが何をしてるのかバッチリ理解しておこう!

もう一度、学生とコースの例を最初からやってみよう。テーブル作成から、各ステップで何が起きてるかまで。準備はいい?

これからstudentsテーブルを作って、学生の情報を保存するよ。そして外部キーを使ってcoursesテーブルとつなげる。こうやってエンティティ同士の関係をモデリングする時に外部キーがどう使われるか見ていこう!

studentsテーブルの作成

studentsテーブルには、学生のユニークID、名前、生年月日を保存するよ。CREATE TABLEコマンドを使って作成しよう。

CREATE TABLE students (
    student_id SERIAL PRIMARY KEY, -- 各レコードのユニークキー
    name TEXT NOT NULL,            -- 学生の名前(必須)
    birth_date DATE                -- 学生の誕生日
);

ここで何が起きてる?

  1. student_id SERIAL PRIMARY KEY: これは各学生のユニークIDだよ。SERIAL型で自動的に増えるフィールドを作って、PRIMARY KEYで各行のIDがユニークになるようにしてる。
  2. name TEXT NOT NULL: 学生の名前用のフィールド。NOT NULLを指定してるから、名前なしでレコードを追加できないようになってる。
  3. birth_date DATE: 誕生日を保存するフィールド。DATE型で日付を扱えるよ。

もしテーブルが人間だったら、student_idはパスポート、nameはそのまま名前、birth_dateは…まあ普段は隠したいけど、DB的には大事な情報だね。

coursesテーブルの作成

次はコース情報を保存するテーブルを作るよ。コースID、タイトル、説明を含める。

CREATE TABLE courses (
    course_id SERIAL PRIMARY KEY,  -- コースのユニークID
    title TEXT NOT NULL,           -- コース名(必須)
    description TEXT               -- コースの説明
);

ここで何が起きてる?

  1. course_id SERIAL PRIMARY KEY: これも自動で増えるフィールドで、各コースのユニークIDになる。
  2. title TEXT NOT NULL: コース名用のフィールド。NOT NULLで、どんなコースにも名前が必要ってことだね。
  3. description TEXT: コースの説明用。これはオプションで、空でもOK(NOT NULLなし)。

タイトルのないコースは、表紙のない本みたいなもん。DBはそれを許してくれないよ!

studentsテーブルとcoursesテーブルの関連付け

今度は、各学生が一つのコースだけに登録できると仮定しよう。そのためにcoursesテーブルに外部キーを追加して、studentsテーブルのIDを参照するようにするよ。

CREATE TABLE courses (
    course_id SERIAL PRIMARY KEY,  -- コースのユニークID
    title TEXT NOT NULL,           -- コース名(必須)
    description TEXT,              -- コースの説明
    student_id INT REFERENCES students(student_id) -- studentsテーブルへの外部キー
);

student_id INT REFERENCES students(student_id)は何してる?

  1. student_idフィールドを作って、studentsテーブルのユニークID(student_id)を参照するようにしてる。
  2. テーブル同士の関連はREFERENCESキーワードで作る。
  3. つまり、coursesにデータを追加する時、student_idの値はstudentsテーブルに存在してないとダメ。例えば、存在しないstudent_idでコースに登録しようとするとエラーになるよ。

テーブルへのデータ挿入

テーブルができたら、学生とコースをちょっと追加してみよう。空っぽの教室じゃつまらないもんね!

学生を追加する

INSERT INTO students (name, birth_date) VALUES
('Alex Lin', '2000-05-10'),
('Maria Chi', '1998-02-15'),
('Otto Song', '2001-09-25');

コースを追加する

INSERT INTO courses (title, description, student_id) VALUES
('SQLの基礎', 'SQLの基本構文を学ぶ', 1),
('リレーショナルデータベース', 'リレーショナルモデルの理解', 2),
('初心者向けPostgreSQL', 'PostgreSQLのインストールと設定', 3);

各コースにstudent_idを指定して、studentsテーブルのIDとつなげてるよ。

テーブル間の関連を確認する

じゃあ、本当にテーブルがつながってるか確認しよう。コース情報と学生名を一緒に表示するクエリを作るよ。

SELECT
    courses.title AS course_title,
    courses.description AS course_description,
    students.name AS student_name
FROM 
    courses
JOIN 
    students ON courses.student_id = students.student_id;

例:クエリの結果:

course_title course_description student_name
SQLの基礎 SQLの基本構文を学ぶ Alex Lin
リレーショナルデータベース リレーショナルモデルの理解 Maria Chi
初心者向けPostgreSQL PostgreSQLのインストールと設定 Otto Song

外部キーでコースと学生をつなげて、1つのクエリで関連データを取得できるようになった!これがリレーショナルモデルの力だね!

まとめ

今やったことがちゃんと理解できてたら嬉しいな。これからもっと進んでいくから、自信を持ってついてきてね!

2
タスク
SQL SELF, レベル 20, レッスン 0
ロック未解除
studentsテーブルの作成
studentsテーブルの作成
2
タスク
SQL SELF, レベル 20, レッスン 0
ロック未解除
`courses`テーブルと外部キーの作成
`courses`テーブルと外部キーの作成
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION