來,我們花點時間複習一下之前學過的東西。就照步驟來,全部拆開講清楚。接下來會有很多內容都會用到這些基礎,最好你能超級清楚每一條指令到底在幹嘛。
我們再用學生和課程這個例子,從頭來一次。從建立資料表開始,到每個步驟發生什麼事都會說明。準備好了嗎?
現在我們要建立一個 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 -- 學生生日
);
這裡發生了什麼?
student_id SERIAL PRIMARY KEY:這是每個學生的唯一 id。SERIAL會自動幫你編號,PRIMARY KEY保證每一行都不會重複。name TEXT NOT NULL:這是學生的名字欄位。我們加了NOT NULL,所以一定要填名字才能存進來。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 -- 課程描述
);
這裡發生了什麼?
course_id SERIAL PRIMARY KEY:一樣是自動編號,給每個課程一個獨一無二的 id。title TEXT NOT NULL:課程名稱欄位。NOT NULL是因為每個課程一定要有名字才合理。description TEXT:課程描述欄位。這是額外的,可以不填(沒有NOT NULL限制)。
沒有名字的課程就像沒有封面的書,資料庫才不會讓這種事發生!
把 students 跟 courses 串起來
現在假設每個學生只能選一門課。為了這樣,我們要在 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) 到底在幹嘛?
- 我們加了一個
student_id欄位,這個欄位會對應到students表裡的student_id。 - 兩個表的關聯是靠
REFERENCES這個關鍵字來連的。 - 意思就是說,每次你在
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,因為很快我們就要進階了,最好你對這些基礎有信心!
GO TO FULL VERSION