CodeGym /課程 /SQL SELF /建立資料表 students 跟它和 courses 的關...

建立資料表 students 跟它和 courses 的關聯

SQL SELF
等級 20 , 課堂 0
開放

來,我們花點時間複習一下之前學過的東西。就照步驟來,全部拆開講清楚。接下來會有很多內容都會用到這些基礎,最好你能超級清楚每一條指令到底在幹嘛。

我們再用學生和課程這個例子,從頭來一次。從建立資料表開始,到每個步驟發生什麼事都會說明。準備好了嗎?

現在我們要建立一個 students 資料表,專門存學生的資訊,然後用 foreign key 把它跟 courses 資料表串起來。這過程你會看到 foreign key 怎麼拿來模擬實體之間的關係。

建立 students 資料表

students 這個表會存學生的資訊:獨一無二的 id、名字還有生日。我們會用 CREATE TABLE 指令來建立它。

CREATE TABLE students (
    student_id SERIAL PRIMARY KEY, -- 每筆資料的唯一 key
    name TEXT NOT NULL,            -- 學生名字(必填)
    birth_date DATE                -- 學生生日
);

這裡發生了什麼?

  1. student_id SERIAL PRIMARY KEY:這是每個學生的唯一 id。SERIAL 會自動幫你編號,PRIMARY KEY 保證每一行都不會重複。
  2. name TEXT NOT NULL:這是學生的名字欄位。我們加了 NOT NULL,所以一定要填名字才能存進來。
  3. birth_date DATE:這是生日欄位。DATE 這個型別讓我們可以處理日期。

如果把資料表想像成一個人,student_id 就像他的身分證,name 就是名字,birth_date 是有時候會藏起來但對資料庫很重要的生日。

建立 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:課程描述欄位。這是額外的,可以不填(沒有 NOT NULL 限制)。

沒有名字的課程就像沒有封面的書,資料庫才不會讓這種事發生!

studentscourses 串起來

現在假設每個學生只能選一門課。為了這樣,我們要在 courses 表裡加一個 foreign key,指向 students 的 id。

CREATE TABLE courses (
    course_id SERIAL PRIMARY KEY,  -- 課程唯一 id
    title TEXT NOT NULL,           -- 課程名稱(必填)
    description TEXT,              -- 課程描述
    student_id INT REFERENCES students(student_id) -- foreign key,連到 students 表
);

student_id INT REFERENCES students(student_id) 到底在幹嘛?

  1. 我們加了一個 student_id 欄位,這個欄位會對應到 students 表裡的 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

我們用 foreign key 把課程跟學生串起來,現在一個查詢就能拿到關聯資料。這就是關聯式模型的威力!

總結

希望剛剛講的你都覺得很清楚很 easy,因為很快我們就要進階了,最好你對這些基礎有信心!

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