sql sever 表关系


一、一对多关系

比如专业表和学生表,一个专业对应多个学生

create table Profession --专业表
(
   ProId int primary key identity(1,1),--专业编号
   ProName varchar(50) not null--专业名称
)

create table Student
(
   ProId int not null FOREIGN KEY REFERENCES Profession(ProId),--专业编号(此字段用于关联专业表)
   StuId int primary key identity(1,1),--学生编号
   StuName varchar(10) not null,--学生姓名
   StuSex varchar(10) not null--学生性别
)

insert into Profession(ProName) values('软件工程')
insert into Profession(ProName) values('计算机科学与技术')

insert into Student(ProId,StuName,StuSex) values(1,'张三','男')
insert into Student(ProId,StuName,StuSex) values(1,'李四','女')
insert into Student(ProId,StuName,StuSex) values(2,'王五','男')
insert into Student(ProId,StuName,StuSex) values(2,'赵六','男')

select * from Profession
select * from Student

在这里插入图片描述
通过查询结果,可以很容易判断出来
一个专业对应多个学生(一对多)

这种一对多的关系做法也很简单,就是在多的表(比如这里的学生表)里面添加一个字段,然后和一的表(比如这里的专业表)进行关联即可。我们这里采用的是学生表的专业编号和专业表的专业标号进行关联(这里学生表的专业编号是一个外键)

二、一对一关系

我个人的理解是这样的:一对多关系是包含一对一关系的
什么意思?我一对多里面,那个多的表(比如上面讲的学生表),
如果我能保证一个专业只有一个学生,那就是一对一。

我们再来看看一对一关系的举例
比如学生基本信息表(学号、姓名、性别)和学生详情信息表(电话、邮箱、地址)
学生的一条基本信息就对应学生的一条详情信息(一对一)

create table StudentBasicInfo(--学生基本信息
  StuNo varchar(10) primary key not null,--学号
  StuName varchar(10) not null,--性别
  StuSex nvarchar(1) not null--性别
) 
create table StudentDetailInfo --学生详情信息
(
  StuNo varchar(20) primary key not null,
  StuQQ varchar(20),--QQ
  StuPhone varchar(20),--电话
  StuMail varchar(100),--邮箱
  StuBirth date --生日
)

这里的学号StuNo我没有自动编号的原因是这样的:
因为我们这里是1对1的关系。假如现在学生基本信息里面有3个学生,对应的学生编号为1,2,3
当我们填详情信息表的时候,如果1学生的详情资料还不知道,导致详情资料无法填写,但是2和3没有问题,那我详情资料表里面可以先把1略过先弄2和3.
ps:这两个表中StuNo有一个是自动增长是可以的,两个都自动增长就很不利于维护了。

这种纯粹的一对一关系做法也很简单,让两个主键进行一个关联(两个主键相等,认为它是一对一)

三、多对多关系

什么叫多对多关系?
简单来说:正过来是一对多,反过来还是一对多
比如学生信息表和课程信息表
一个学生会学多门课程
一门课程会有多个学生学

多对多的方案:就是添加一张表,来表示这个关系

create table Student--学生
(
  StuId int primary key identity(1,1),--学生编号
  StuName varchar(50) not null,--学生名字
  StuSex char(2) not null --学生性别
)
create table Course--课程
(
  CourseId int primary key identity(1,1),--课程编号
  CourseName varchar(30) not null,--课程名称
  CourseContent text --课程介绍
)

--上面两张表,单独看是没有任何关联的
--为了让它们产生关联,做法就是:再添加一张表
create table Exam--考试信息表
(
  ExamId int primary key identity(1,1),--选课成绩号
  StuId int not null,--学生编号
  CourseId int not null,--课程编号
  Score int not null--考试分数
)

insert into Exam(StuId,CourseId,Score) values(1,1,90)
--编号为1的学生,参加了课程1的学习,最后课程1考了90分
insert into Exam(StuId,CourseId,Score) values(1,2,80)
insert into Exam(StuId,CourseId,Score) values(2,2,8)

我们通过上面的3张表,表达学生选课的所有逻辑:学生选课可以维护、学生信息可以维护、学生考试考了多少分也可以维护。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劲夫学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值