多对多查询

如:

一门课程可以多个学生选择,

一个学生也可以拥有多门课程。

 

其实使用中间表,就很好的完成了多对多的查询

下面有样表,和具体实现代码

# 课程表
create table class( -- 课程表
	id int primary key auto_increment, -- 主键 自增
  cname varchar(32) not null -- 课程名称
);
# 学生表
create table student( -- 学生表
  id int primary key auto_increment, -- 学生id 主键 自增
  sname varchar(32) not null, -- 学生姓名
  age int not null -- 学生年龄
);
# 中间表
create table cls_stu_tab( -- 中间表
	id int primary key auto_increment, -- id 主键
  cid int not null, -- 课程表id
  sid int not null -- 学生表id
);
# 添加数据
# 课程
insert into class (cname) values('打野'),('上单'),('辅助'),('射手'),('法师');
# 学生
insert into student(sname,age) values('韩信',22),('李白',23),('孙悟空',54),('兰陵王',19),('小乔',22),('大桥',23),('曹操',33),('太乙真人',28),('鲁班七号',33),('狄仁杰',88),('阿珂',18),('关羽',25),('刘备',29),('张飞',23),('哪吒',3),('黄忠',56);
# 中间表
insert into cls_stu_tab (sid,cid) values(1,1),(2,1),(2,3),(3,3),(4,1),(4,2),(5,3),(5,5),(6,3),(6,5),(7,1),(7,2),(7,3),(7,5);

# 多对多的查询,需要2张和1张中间表
# 曹操选择哪些课程
select 
	s.sname, -- 学生姓名
	c.cname -- 课程姓名
from 
	student s -- 学生表
join 
	cls_stu_tab cst -- 中间表
on 
	s.id=cst.sid -- 建立连接学生表和中间表
join
	class c -- 课程表
on
	c.id=cst.cid -- 建立连接课程表和中间表
where
	s.sname='曹操'; -- 约束条件

/* 显示结果
+--------+--------+
| sname  | cname  |
+--------+--------+
| 曹操   | 打野   |
| 曹操   | 上单   |
| 曹操   | 辅助   |
| 曹操   | 法师   |
+--------+--------+
*/
# 打野都被哪些学生选择了
select 
	s.sname, -- 查询姓名
	c.cname -- 查询课程
from
	student s -- 学生表
join
	cls_stu_tab cst -- 中间表
on
	cst.sid=s.id -- 建立连接中间表和学生表
join
	class c -- 课程表
on
	cst.cid = c.id -- 建立连接中间表和课程表
where
	c.cname = '打野'; -- 约束查询条件
	
/* 显示结果
+-----------+--------+
| sname     | cname  |
+-----------+--------+
| 韩信      | 打野   |
| 李白      | 打野   |
| 兰陵王    | 打野   |
| 曹操      | 打野   |
+-----------+--------+
*/

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐