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 保证每行都是唯一的。
  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)。

没有名字的课程就像没有封面的书,数据库可不允许这样!

把 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 表里的学生关联起来了。

检查表之间的关联

现在来验证一下表真的关联上了。我们写个查询,把课程和学生名字一起查出来。

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

我们通过外键把课程和学生关联起来了,现在一个查询就能查到相关的数据。这就是关系型模型的威力!

总结

希望刚才讲的内容你都能明白。因为很快我们要继续深入了,最好你对这些基础知识有信心!

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