数据库基础-12-多表查询(内连接、外连接、自连接、联合查询、子查询)

一、多表关系

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

一对多(One-to-Many):

表示一个表中的每一行记录都可以在另一个表中关联到多行。通俗来讲,就是一个实体(表)在另一个实体(表)中可以有多个关联实体(表)。

举个例子,一个学校有多个班级,而每个班级又有多个学生。这里的学校和班级构成了一对多的关系,即一个学校可以拥有多个班级,而每个班级又可以有多个学生。在数据库中,可以将学校、班级和学生分别建立成独立的表,并通过外键约束建立起关联。

实现:在多的一方建立外键,指向一的一方的主键。

CREATE TABLE school (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL
);

CREATE TABLE class (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  school_id INT NOT NULL,
  FOREIGN KEY (school_id) REFERENCES school(id)
);

CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  class_id INT NOT NULL,
  FOREIGN KEY (class_id) REFERENCES class(id)
);

多对多(Many-to-Many):

表示一个表中的每一行记录都可以关联到另一个表中的多行,而另一个表中的每一行记录也可以关联到第一个表中的多行。通俗来讲,就是两个实体(表)之间存在多对多的关系,即两个实体互相关联。

举个例子,一个学生可以选修多门课程,而一门课程也可以被多个学生选修。这里的学生和课程构成了多对多的关系,即一个学生可以选修多门课程,一门课程也可以被多个学生选修。在数据库中,需要使用一个中间表来存储两个实体之间的关联关系。

CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL
);

CREATE TABLE course (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL
);

CREATE TABLE student_course (
  student_id INT NOT NULL,
  course_id INT NOT NULL,
  PRIMARY KEY (student_id, course_id),
  FOREIGN KEY (student_id) REFERENCES student(id),
  FOREIGN KEY (course_id) REFERENCES course(id)
);

student 表和 course 表之间建立了多对多的关系,即一个学生可以选修多门课程,一门课程也可以被多学生选修。通过创建一个名为 student_course 的中间表来存储学生和课程之间的关联关系。该表包含两个外键,分别引用了 student 表和 course 表,用于建立学生和课程之间的关联。

一对一(One-to-One):

表示一个表中的每一行仅能关联到另一个表中的一行记录,而另一个表中的每一行记录也只能关联到第一个表中的一行。通俗来讲,就是两个实体(表)之间存在一对一的关系,即两个实体相互关联且每个实体只跟另一个实体关联一次。

举个例子,一个人只有一个身份证号码,而一个身份证号码也只属于一个人。这里的人和身份证构成了一对一的关系,即一个人只有一个身份证号码,一个身份证号码也只属于一个人。在数据库中,可以使用外键来实现一对一关系。

CREATE TABLE person (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL
);

CREATE TABLE id_card (
  id INT PRIMARY KEY,
  number VARCHAR(20) UNIQUE NOT NULL,
  person_id INT UNI
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值