数据表 --
1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
--2.课程表 Course(CId,Cname,TId) --CId --课程编号,Cname 课程名称,TId 教师编号
--3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名
--4.成绩表 SC(SId,CId,score) --SId 学生编号,CId 课程编号,score 分数
创建测试数据
学生表 Student
create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-05-20' , '男');
insert into Student values('04' , '李云' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-03-01' , '女');
insert into Student values('07' , '郑竹' , '1989-07-01' , '女');
insert into Student values('09' , '张三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2017-12-30' , '女');
insert into Student values('12' , '赵六' , '2017-01-01' , '女');
insert into Student values('13' , '孙七' , '2018-01-01' , '女');
科目表 Course
create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10))
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');
教师表 Teacher
create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
成绩表 SC
create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);
题目:查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
分析:
1、查询出"01"号同学的所有课程
2、将"01"号同学的所有课程和其他同学的课程进行对比,得到完全相同的其他同学的信息。
思路:
难点就在这第二点,需要多个值与多个值之间进行匹配,但我学过的mysql中和多个不相连值有关的只有in,not in。
那匹配怎么处理呢?
这就用到了多个表的拼接,我先在sc表中将"01"号同学的所有课程查询出来生成一个派生表s ,再与student拼接在一起生成一个另一个新的派生表t,再将t和sc进行一个左连接,条件t.sid = sc.sid and t.cid =sc.cid,生成一个派生表pp,这个时候不是和‘’01‘’号同学课程完全相同的同学sc.sid就会存在null,这是一个左连接的一个特性,sc.sid有这个null,说明就是不是完全相同的,这是我就可以用sid not in (select t.sid from pp where sc.sid is null) 取到 完全和‘’01‘’相同的sid,取到sid后面就是一个简单的查询了。
MySQL代码:
select * from student where sid not in
(select pp.sid from
(select t.*,sc.SId sc_sid ,sc.cid sc_cid from
(select * from student ,
(select cid from sc where sid=1) s ) t
left join sc on t.SId = sc.SId and t.CId =sc.CId) pp where sc_sid is null) and sid !=1;
运行结果:

该博客介绍了如何使用MySQL查询出与01号同学学习课程完全相同的所有其他同学的信息。首先,从成绩表SC中查询01号同学的所有课程,然后通过派生表和左连接操作找出所有课程与01号同学相同的其他学生。
3351

被折叠的 条评论
为什么被折叠?



