sql语句之多表关系 一对多 多对多

多表的关系介绍

  • 在实际的开发过程中,项目一定是有多张表的,且这些表之间是都有关系的
  • 表与表之间的关系分类:一对一 一对多 多对多
    一对一:A表的一行对应B表的一行,反之也成立,此时,两张表可以合并成一张表
    在这里插入图片描述
    一对多:A表的一行对应B表的多行,反之不成立
    在这里插入图片描述
    多对多:A表的一行对应B表的多行,B表的一行对应A表的多行
    在这里插入图片描述

多表的关系-一对多关系

  • 初始化数据
  • 一对多的创建流程
    在这里插入图片描述
    》创建主表(分类表)
    》创建从表(商品表)
    》给主表和从表之间添加外键约束
    alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);
    》给主表添加数据(随便添加)
    》给从表添加数据(添加数据是必须依赖主表)
    (3)一对多特点
    添加数据: 主表:随意添加,从表:受主表限制
    删除数据: 主表:如果某一行的数据受到从表的依赖,则不能删除, 从表:可以随意删除
#创建主表(分类表)
CREATE TABLE category(
	cid INT PRIMARY KEY AUTO_INCREMENT,
	cname VARCHAR(20)
);
#创建从表(产品表)
CREATE TABLE product(
	pid INT PRIMARY KEY AUTO_INCREMENT,
	pname VARCHAR(20),
	price DOUBLE,
	cid INT -- 外键 表示属于哪个分类
);
》给主表和从表之间添加外键约束 
`alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);`
alter table product add  foreign key (cid) references category(cid)
》给主表添加数据
insert into category value(null,'电子')
insert into category value(null,'服装')
》给从表添加数据(添加数据是必须依赖主表)
insert into product value(null,'联想',2000,1)
insert into product value(null,'华为',4000,1)	
insert into product value(null,'真维斯',100,2)

多表的关系-多对多关系

多对多创建流程
》》创建订单表(主表) order
》》创建中间表(从表) 保存交叉线
》》给中间表建立外键约束(2次)
》》给订单表添加数据(随意)
》》给中间表添加数据(受限)

#创建从表(产品表)
CREATE TABLE product(
	pid INT PRIMARY KEY AUTO_INCREMENT,
	pname VARCHAR(20),
	price DOUBLE,
	cid INT -- 外键 表示属于哪个分类
);
CREATE TABLE orders(
	oid INT PRIMARY KEY AUTO_INCREMENT,
	money DOUBLE
);
CREATE TABLE product(
	pid INT PRIMARY KEY AUTO_INCREMENT,
	pname VARCHAR(20),
	price DOUBLE,
	cid INT -- 外键 表示属于哪个分类
)
INSERT INTO product VALUE(NULL,'联想',2000,1)
INSERT INTO product VALUE(NULL,'华为',4000,1)	
INSERT INTO product VALUE(NULL,'真维斯',100,2)	
CREATE TABLE orders_product(
	oid INT , -- 必须存在 外键
	pid INT  -- 必须存在 外键
);
#给中间表建立外键约束(2次)
ALTER TABLE orders_product ADD FOREIGN KEY(oid) REFERENCES orders(oid);
ALTER TABLE orders_product ADD FOREIGN KEY(pid) REFERENCES product(pid);

在这里插入图片描述

多对多(演员与角色的关系)

创建表:多对多的关系(演员表与角色表)
》》 创建演员表(左侧主表)
》》 创建角色表(右侧主表)
》》创建中间表(从表)
》》建立外键约束(2次)
》》给演员表添加数据
》》给角色表添加数据
》》给中间表添加数据

# 创建演员表(左侧主表)
CREATE TABLE users(
	uid INT PRIMARY KEY AUTO_INCREMENT,
	uname VARCHAR(20)
)
# 创建角色表(右侧主表)
CREATE TABLE role(
	rid INT PRIMARY KEY AUTO_INCREMENT,
	rname VARCHAR(20)
)
# 创建中间表(从表)
CREATE TABLE users_role(
	rid INT , -- 数据必须在role存在
	uid INT   -- 数据必须在users存在
)
#建立外键约束两次
ALTER TABLE users_role ADD FOREIGN KEY(rid) REFERENCES role(rid);
ALTER TABLE users_role ADD FOREIGN KEY(uid) REFERENCES users(uid);

在这里插入图片描述

总结

  • 要分析表与表之间的关系是属于一对多还是多对多
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一对多表关联的SQL语句可以使用LEFT JOIN或INNER JOIN来实现。假设我们有两个表,一个是主表(One表),另一个是从表(Many表),并且从表中有一个外键指向主表的主键。 使用LEFT JOIN的SQL语句如下: SELECT One.column1, Many.column2 FROM One LEFT JOIN Many ON One.primary_key = Many.foreign_key; 使用INNER JOIN的SQL语句如下: SELECT One.column1, Many.column2 FROM One INNER JOIN Many ON One.primary_key = Many.foreign_key; 其中,One是主表的表名,Many是从表的表名,column1和column2是需要查询的列名,primary_key是主表的主键列名,foreign_key是从表的外键列名。 请注意,LEFT JOIN会返回主表中的所有记录,而INNER JOIN只会返回主表和从表中匹配的记录。 #### 引用[.reference_title] - *1* *2* [SQL语句多表关联查询语法](https://blog.csdn.net/weixin_44272607/article/details/114300691)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [sql语句多表关系 一对多 多对多](https://blog.csdn.net/xinxin_____/article/details/108760670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值