这个是一个比较经典的sql面试题,面试的难度挺大的,这里我将详细讲解,怎么使用这个方法进行查询操作。

  • student(Sid,Sname,Sage,Ssex)
    • Sid 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别

    • 创建学生表表,添加对应的测试数据,测试数据如下

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('08' , '王菊' , '1990-01-20' , '女');
  • 成绩表
    • sc(Sid,Cid,score)
    • Sid 学生编号,Cid 课程编号,score 分数
    • 创建学成绩表,添加对应的测试数据,测试数据如下
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);

思路①

解决问题的思路是创建一个虚拟表,该表中放置两个字段分别是学生的课程一与学生的课程二。
首先获得课程一所对应的表,语句如下

SELECT st.*,sc.* from student st inner join sc on (st.Sid = sc.Sid) and sc.cid = '01'

运行结果如下图
在这里插入图片描述

然后依据该表在关联课程表,查询课程一与课程二都在该表中的字段,语句如下

SELECT st.*,sc.*,s2.* from student st inner join sc on (st.Sid = sc.Sid) and sc.cid = '01'
inner join sc s2 on (st.Sid = s2.Sid) and s2.cid = '02'

运行结果如下图:
在这里插入图片描述
最后根据该表,在判断进行课程一比课程二大的判断,语句如下图所示:

SELECT st.*,sc.*,s2.* from student st inner join sc on (st.Sid = sc.Sid) and sc.cid = '01'
inner join sc s2 on (st.Sid = s2.Sid) and s2.cid = '02' where sc.score >s2.score

运行结果如下图:
在这里插入图片描述

思路②

创建一张虚拟表,虚拟表中一行数据中即有两个课程的数据。

select * from student stu 
							inner join sc s on stu.Sid = s.Sid
							inner JOIN sc s1 on stu.Sid = s1.Sid

①通过表中赵雷可以看出某一条数据中既包含两个课程的数据,可能这两个课程都是课程一,等等情况
在这里插入图片描述
② 然后,选出一条数据中既有课程一又有课程二的数据(有的话肯定是两条,设定一条数据中前面的字段为课程一),然后选择课程一大于课程二的数据

select * from student stu 
							inner join sc s on stu.Sid = s.Sid
							inner JOIN sc s1 on stu.Sid = s1.Sid
							where s.Cid = '01' and s1.Cid = '02' 
							and s.score > s1.score

在这里插入图片描述

Logo

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

更多推荐