13.表关系

本文介绍了数据库设计中的三种关系类型:一对一、一对多和多对多。一对一关系通过主键+主键的方式实现,如学生表与详情信息表的关联;一对多关系,如学院与学生的关联,通过外键实现;多对多关系,如学生与课程的关系,需借助中间表来建立。文章还提供了示例SQL语句进行数据插入和查询,并强调了查询时的关联操作和数据一致性维护。
摘要由CSDN通过智能技术生成

1.一对一


学生表中有学号,姓名,学院
但是学生还有电话,地址等私密信息,不会放在学生表中,因此会另外一个详情信息表

此时详情信息表与学生表是一一对应的关系

主键+主键实现


create table student(
    id int primary key,
    name varchar(20)
);


create table studentDetails(
    id int primary key,
    sex varchar(20) not null,
    age int,
    address varchar(20) comment '家庭地址',
    home_num varchar(20),
    foreign key(id) references student(id)
);


comment:注释信息

被连接的为父表

添加数据
    父表 --- 子表

删除数据
    子表 --- 父表

查询连接
    合并查询
        返回的结果集字段类型和数量要保持一致
        单独使用union会把两张表的数据合并,并且过滤掉相同的数据
        不想过滤掉数据可以使用union all
        select name,id from A uinon select * from B;
    
    连接查询
        select * from A,B;

建表
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

插入数据
在这里插入图片描述

在这里插入图片描述

查询
在这里插入图片描述

2. 一对多

当前表的非主键连接另外一张表的主键

例如:
    一个学院多名学生
    一名学生只能在一个学院
    此时,学院与学生就是一对多关系


# 学院表
create table department(
    # 学院id
    d_id int primary key auto_increment,
    # 学院名
    d_name varchar(20) not null
);

# 创建学生表
create table student(
    # 学生id
    s_id int primary key auto_increment,
    # 学生名
    s_name varchar(20) not null,
    # 所属学院的id
    dept_id int not null,
    foreign key(dept_id) references department(d_id)
);


insert into department values(1, '外语学院'),(2, '计算机学院');

insert into student values(1, '张三', 2),(2, '快乐', 2);

查询采用关联查询(左关联或者右关联)

3.多对多

多对多需要中间表实现

学生报名选修课
一名学生可以选择多门课程
一门课程可以有多名学生
此时;学生与课程是多对多


# 建立课程表
create table course(
    cours_id int primary key auto_increment,
    cours_name varchar(20) not null
);

# 学生表
create table student(
    # 学生id
    s_id int primary key auto_increment,
    # 学生名
    s_name varchar(20) not null,
);


# 选课表(中间表)
create table middle(
    s_id int,
    cours_id int,
    primary key(s_id, cours_id),
    foreign key(s_id) references student(s_id),
    foreign key(cours_id) references course(cours_id)
);


insert into student values(1, '张三'),(2, '快乐');
insert into course values(1, '外语'),(2, 'python');
insert into middle values(1,2)  # 关联
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值