咱们花点时间,把之前学过的内容再过一遍。一步一步来,看看每一步到底发生了啥。后面会有很多内容都基于这些基础,最好你能真的搞明白每条命令到底干了啥。
我们再用学生和课程的例子,从头到尾过一遍。从建表开始,到每一步都拆开讲。准备好了吗?
现在我们要创建一个 students 表,用来存学生的信息,然后用外键把它和 courses 表关联起来。这个过程中你能看到外键是怎么用来模拟实体之间关系的。
创建 students 表
students 表会存学生的信息:他们的唯一 id、名字和生日。我们用 CREATE TABLE 命令来建表。
CREATE TABLE students (
student_id SERIAL PRIMARY 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 表里加个外键,指向 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) 是干嘛的?
- 我们加了一个
student_id字段,它会指向students表里的唯一 id(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 表里的学生关联起来了。
检查表之间的关联
现在来验证一下表真的关联上了。我们写个查询,把课程和学生名字一起查出来。
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 |
我们通过外键把课程和学生关联起来了,现在一个查询就能查到相关的数据。这就是关系型模型的威力!
总结
希望刚才讲的内容你都能明白。因为很快我们要继续深入了,最好你对这些基础知识有信心!
GO TO FULL VERSION