多对多查询
如:
一门课程可以多个学生选择,
一个学生也可以拥有多门课程。
其实使用中间表,就很好的完成了多对多的查询
下面有样表,和具体实现代码
# 课程表
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 |
+-----------+--------+
| 韩信 | 打野 |
| 李白 | 打野 |
| 兰陵王 | 打野 |
| 曹操 | 打野 |
+-----------+--------+
*/