SQL进阶基础(面试基础)— Part 1

前言

本文原题出自:https://www.cnblogs.com/deng-cc/p/6515166.html,经过笔者的归纳总结,现在将优化过的题目发出来(附答案,本答案是笔者亲自写的,答案无唯一性,一切以结果为准)


测试表构建并插入测试数据

本文中涉及的所有SQL均在MYSQL中进行测试,将建表语句以及插入数据语句导入MYSQL本地库中即可

下载_插入创建表和插入语句


题目及答案及讲解

(1)查询“001”课程比“002”课程成绩低的所有学生的学号、001学科成绩、002学科成绩

SELECT a.`学号`,a.`001成绩`,b.`002成绩`
FROM
(SELECT
StudentNo as '学号',score as '001成绩'
FROM
score
WHERE CourseNo=001)a 
JOIN
(SELECT
StudentNo as '学号',score as '002成绩'
FROM
score
WHERE CourseNo=002)b
ON a.`学号`=b.`学号`
WHERE a.`001成绩`<b.`002成绩`

#解题思路:
先查学了001课程的学生学号,成绩
再查学了002课程的学生学号,成绩
内关联,取交集。
条件设置为001课程小于002课程成绩

(2)查询平均成绩大于60分的同学的学号和平均成绩

SELECT StudentNo as '学号', AVG(score) as '平均分'
FROM 
score 
GROUP BY StudentNo
HAVING AVG(score)>60 

##解题思路
根据学号分组,求平均分
group by后用having

(3)查询所有同学的学号、姓名、选课数、总成绩

SELECT stu.studentNo as '学号',stu.`name` as '姓名',a.`选课数`,a.`总成绩`
FROM
(SELECT StudentNo as '学号',COUNT(score) as '选课数',SUM(score) as '总成绩'
FROM score
GROUP BY StudentNo)a
RIGHT JOIN
student stu
ON a.`学号`=stu.studentNo
ORDER BY stu.studentNo ASC

##解题思路
通过学号分组,查学号,count选课数,sum总成绩
因为不知道,score表中是否所有同学的都选课了,所以建立右链接。
将student表中所有学号全部展示,score表中没有的学号,显示空值

 (4)查询姓“李”的老师的个数

SELECT
count(*)
FROM
teacher
WHERE `name` LIKE '李%'

##解题思路
模糊查询

(5)查询没学过“叶平”老师课的同学的学号、姓名

SELECT
studentNo as '学号',`name` as '姓名'
FROM
student 
WHERE studentNo NOT IN
(SELECT
DISTINCT StudentNo
FROM
(SELECT crs.courseNo
FROM
(SELECT 
teacherNo
FROM
teacher
WHERE `name`='叶平')techno,course crs
WHERE techno.teacherNo=crs.teacherNo)dealtt,score scr
WHERE dealtt.courseNo=scr.CourseNo)

##解题思路
首先查出名字等于叶平的教师号
根据教师号,建立等值链接,查询课程号。
根据课程号,建立等值链接,学过这些课的学号并去重。
查询不在这些学号里的人。

(6)查询学过“001”并且也学过编号“002”课程的同学的学号、姓名

SELECT
ttno.StudentNo as '学号',stu.`name` as '姓名'
FROM
(SELECT
a.StudentNo
FROM
(SELECT
StudentNo
FROM
score 
WHERE CourseNo=001)a
JOIN
(SELECT
StudentNo
FROM
score
WHERE CourseNo=002)b
ON a.StudentNo=b.StudentNo)ttno,student stu
WHERE ttno.StudentNo=stu.studentNo

##解题思路
查学过1课程的学号和学过2课程的学号
进行内连接,得到两个都学过的学号
进行等值链接,得到姓名,学号

(7)查询学过“叶平”老师所教的所有课的同学的学号、姓名

SELECT numm.StudentNo,sdd.`name`
FROM
(SELECT
scr.StudentNo 
FROM
(SELECT crs.courseNo,COUNT(crs.courseNo) as cutt
FROM
(SELECT teacherNo
FROM
teacher
WHERE `name`='叶平')techno,course crs
WHERE techno.teacherNo=crs.teacherNo)stud
,score scr
WHERE stud.courseNo=scr.CourseNo
GROUP BY scr.StudentNo
HAVING COUNT(scr.CourseNo)=COUNT(stud.cutt))numm,student sdd
WHERE numm.StudentNo=sdd.studentNo
ORDER BY numm.StudentNo

##解题思路
首先查叶平的教师号,关联课程表查课程号,并计算课程总量
将查好的课程号与score表关联,查询学号,一定要按学号分组,并且count当前每个学号里面有几门课程,并与叶平老师课程总量进行对比。输出相等学号。
关联学生表,输出姓名,学号.

 (8)查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名

SELECT
kks.StudentNo,studd.`name`
FROM
(SELECT 
a.StudentNo
FROM
(SELECT
StudentNo,score
FROM
score 
WHERE CourseNo=001)a,
(SELECT
StudentNo,score
FROM
score
WHERE CourseNo=002)b
WHERE a.StudentNo=b.StudentNo
AND a.score>b.score)kks,student studd
WHERE kks.StudentNo=studd.studentNo

##解题思路
此题类似于第一题,先分开查001和002学号,分数
然后进行等值关联,并进行条件约束
最后与学生表关联,得到姓名,学号

(9)查询有课程成绩小于60分的同学的学号,姓名

SELECT
a.StudentNo,studd.`name`
FROM
(SELECT
DISTINCT StudentNo
FROM
score
WHERE score<60)a ,student studd
WHERE a.StudentNo=studd.studentNo

##解题思路
先查询小于60分的学号并去重
关联学生表,查询学号姓名

(10) 查询学全所有课的同学的学号、姓名

SELECT allern.StudentNo,studd.`name`
FROM
(SELECT StudentNo
FROM score
GROUP BY StudentNo
HAVING COUNT(CourseNo)=
(SELECT COUNT(courseNo) as crscutt
FROM
course))allern,student studd
WHERE allern.StudentNo=studd.studentNo

##解题思路
先查询课程总数
通过score表,按学号分组,过滤掉课程数不等于课程总数的学号。
关联学生表,即可查出姓名,学号

(11) 查询没有学全所有课的同学的学号、姓名

SELECT allern.StudentNo,studd.`name`
FROM
(SELECT StudentNo
FROM score
GROUP BY StudentNo
HAVING COUNT(CourseNo)<
(SELECT COUNT(courseNo) as crscutt
FROM
course))allern,student studd
WHERE allern.StudentNo=studd.studentNo

##解题思路
题解同上
只需将'='换成‘<’即可解决

(12)查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名

SELECT 
sno.StudentNo,studd.`name`
FROM
(SELECT 
DISTINCT StudentNo
FROM
score
WHERE CourseNo IN
(SELECT
CourseNo
FROM
score
WHERE StudentNo=001))sno,student studd
WHERE sno.StudentNo=studd.studentNo

##解题思路
先查询学号001所学课程。
再从score表中查出学过001所学课程中的学号,并去重
关联学生表,查出学号,姓名

 (13)查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名

SELECT 
sno.StudentNo,studd.`name`
FROM
(SELECT 
DISTINCT StudentNo
FROM
score
WHERE CourseNo IN
(SELECT
CourseNo
FROM
score
WHERE StudentNo=001)
AND
StudentNo <> 001)sno,student studd
WHERE sno.StudentNo=studd.studentNo

##解题思路
此题与上题思路相似,多加一个学号不等于1的过滤条件即可

(14) 把“score”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩

UPDATE
score ss,
(SELECT
crsno.courseNo as num,AVG(scr.score) as avgg
FROM
(SELECT crs.courseNo
FROM
(SELECT
teacherNo
FROM
teacher
WHERE `name`='叶平')techno,course crs
WHERE techno.teacherNo=crs.teacherNo)crsno,score scr
WHERE crsno.courseNo=scr.CourseNo
GROUP BY crsno.courseNo)delt
SET ss.score=delt.avgg
WHERE ss.CourseNo=delt.num

##解题思路
DML语句中update使用方法,格式(update 表 set 列 = 值 where 列 = '条件')
首先从教师表中,查出叶平老师的教师号,关联课程表查出课程号。
按课程号分组,查出平均分和课程号 将此表取别名delt
紧接着score和delt进行关联更新,条件是 set 列 = 平均分,where 列=‘delt中的课程号’

(15)查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名 

SELECT stunum.StudentNo,studd.`name`
FROM
(SELECT StudentNo
FROM
score
WHERE StudentNo <>2
GROUP BY StudentNo
HAVING AVG(CourseNo)=
(SELECT AVG(CourseNo)
FROM
score
WHERE StudentNo=002))stunum,student studd
WHERE stunum.StudentNo=studd.studentNo

##解题思路
本题难点在于如何确定完全相同的课程,解决方法可以用AVG和SUM函数来确定唯一的值
首先,查出学生002课程号的平均值,然后冲分数表中分组查询其他同学的课程号平均值,
并且让学号不等于2,where→group by→having顺序要牢记,让两个平均值相等,查出学号
最后关联学生表,查姓名和学号

 (16)删除学习“叶平”老师课的score表记录

DELETE FROM
score 
WHERE
score.CourseNo IN
(SELECT crs.courseNo
FROM
(SELECT teacherNo 
FROM
teacher
WHERE `name` = '叶平')techno,course crs
WHERE techno.teacherNo=crs.teacherNo)


##解题思路
DML语句中DELETE用法,格式:DELETE FROM 表 where 列 = ‘条件’
本题先查出叶平老师教师号,关联课程表查出课程号,删除条件是叶平老师课程好的同学

(17)向score表中插入一些记录,这些记录要求符合以下条件:

1、没有上过编号“002”课程的同学学号、2号课程、插入“002”号课程的平均成绩;

INSERT INTO
score(StudentNo, CourseNo, score)
(SELECT stu.studentNo,2,
(SELECT AVG(s3.score) FROM score s3 WHERE s3.CourseNo = 2)
FROM 
student stu 
WHERE 
stu.studentNo 
NOT IN 
(SELECT s2.StudentNo 
FROM 
score s2 
WHERE 
s2.CourseNo = 2))

##解题思路
DML语句中INSERT语句用法,格式:INSERT INTO 表 (列1, 列2,...) VALUES (值1, 值2,....)
本题思路先查学过课程2的学生学号,过滤出没学过的学号,然后查出课程2的平均分。
依次插入表score

(18)按学号由低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分

SELECT DBLT.StudentNo,
SUM(DBLT.`语文`) AS '语文',
SUM(DBLT.`数学`) AS '数学', 
SUM(DBLT.`英语`) AS '英语', 
DBLT.`有效课程数` AS '有效课程数',
(DBLT.`总分`/DBLT.`有效课程数`) AS '有效平均分'
FROM
(SELECT s1.StudentNo,
(CASE WHEN s1.CourseNo=(SELECT crs1.courseNo FROM course crs1 WHERE crs1.`name`='语文') THEN 
	(SELECT score FROM score WHERE StudentNo=s1.StudentNo AND CourseNo=s1.CourseNo) ELSE 0 END) AS '语文',
(CASE WHEN s1.CourseNo=(SELECT crs2.courseNo FROM course crs2 WHERE crs2.`name`='数学') THEN
	(SELECT score FROM score WHERE StudentNo=s1.StudentNo AND CourseNo=s1.CourseNo) ELSE 0 END) AS '数学',
(CASE WHEN s1.CourseNo=(SELECT crs3.courseNo FROM course crs3 WHERE crs3.`name`='英语')  THEN
	(SELECT score FROM score WHERE StudentNo=s1.StudentNo AND CourseNo=s1.CourseNo) ELSE 0 END) AS '英语',
(SELECT COUNT(*) FROM score WHERE StudentNo=s1.StudentNo) AS '有效课程数',
(SELECT SUM(score) FROM score WHERE StudentNo=s1.StudentNo GROUP BY StudentNo) AS '总分'
FROM
score s1)DBLT
GROUP BY DBLT.StudentNo
ORDER BY DBLT.StudentNo


##解题思路
写了这么久SQL,这个算是比之前难很多的了,原因在于逻辑很绕
这道题主要在于CASE WHEN的理解
首先我们要从score表中查出学号,case when中首先要让课程号等于语文的课程号,这样THEN的时候,通过限制学号和课程号,我们就可以查出每个同学的单独学科的成绩,ELSE中可以写0也可以写NULL,笔者自认为还是0方便一点。
三个case when基本思路都是差不多的,但需要注意的是case when之后学号并没有去重,成绩也没有归到一行,但此时group by是不可以的。
接下来,再case when之后,我们还需要count一下每位同学到底学了多少课
以及,通过限制学号,然后group by 查到每位同学总分是多少。
好了基本的指标都拿到手了,下面就容易了。
把上面的表作为一个子表,我们把这个子表对学号进行分组,然后呢,我刚才ELSE 0的意义,就来了,这时候我们把每门成绩进行sum,因为是0所以不会影响结果,有效课程直接从字表中取出,有效平均分就更不用说了,等于 总分/课程数
排序就很简单了

 (19) 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

SELECT CourseNo,MAX(score),MIN(score)
FROM
score
GROUP BY CourseNo

##解题思路
分组后聚合函数的使用

(20)按各科平均成绩从低到高和及格率的百分数从高到低顺序,查询课程ID,课程名,及格数,总数,及格率

SELECT  smm.CourseNo as '课程号', crs.`name` as '课程',smm.sap as '总数',plnum.ctt as '及格数', CONCAT((plnum.ctt/smm.sap)*100,'%') as 及格率
FROM
(SELECT
CourseNo,COUNT(score) as sap,AVG(score) as avgg
FROM
score
GROUP BY CourseNo)smm,
(SELECT
CourseNo,COUNT(score) as ctt
FROM
score
WHERE score>=60
GROUP BY CourseNo)plnum, course crs
WHERE plnum.CourseNo=smm.CourseNo
AND smm.CourseNo=crs.courseNo
ORDER BY smm.avgg,(plnum.ctt/smm.sap)*100 DESC

##解题思路
两个子查,上面那个按课程分组,但不进行过滤,查出来课程号,总个数,平均分
下面这个,按课程分组,但过滤掉小于60分的,查出来课程号和大于60分的个数,
三表关联,接下来很容易了,查出课程号,课程名,总数,及格数,及格率要用concat拼一下。
order by我就不用说了

 (21)查询不同老师所教不同课程平均分从高到低显示

SELECT orag.CourseNo,orag.`name`,tter.`name`,orag.agg
FROM
(SELECT crno.CourseNo,crno.`name`,crno.teacherNo,AVG(scr.score) as agg
FROM
score scr 
RIGHT JOIN
(SELECT courseNo,teacherNo,`name`
FROM
course)crno
on scr.CourseNo = crno.courseNo
GROUP BY crno.courseNo)orag,teacher tter
WHERE orag.teacherNo=tter.teacherNo
ORDER BY orag.agg DESC

##解题思路
讲实话,这题的需求看了好多遍,题意太不明确了。
先从course把能查的内容都查出来,但不要用*,然后SCORE表和crno表做又外链接,防止漏选课程,当然要根据课程号分组,这时候,基本指标就都查出来了。
最后就是与教师表做个简单的链接
注意order by放在最外面查询,才能有效果

(22)按各科统计各分数段人数:课程ID,课程名称,(100-85),(85-70),(70-60),(低于60)

SELECT
crs.courseNo,
crs.`name`,
SUM(CASE WHEN scr.score>=85 AND scr.score<=100 THEN 1 ELSE 0 END) as '85-100',
SUM(CASE WHEN scr.score>=75 AND scr.score<85 THEN 1 ELSE 0 END) as '75-85',
SUM(CASE WHEN scr.score>=60 AND scr.score<75 THEN 1 ELSE 0 END) as '60-75',
SUM(CASE WHEN scr.score<60 THEN 1 ELSE 0 END) as '低于60'
FROM
score scr RIGHT JOIN 
course crs
ON scr.CourseNo=crs.courseNo
GROUP BY crs.courseNo


##解题思路
sum(case when)的一种计数用法
右关联的目的是为了防止有遗漏

 (23)查询各科成绩前三名的记录(不考虑成绩并列情况)

SELECT * 
FROM
score scr
WHERE
(SELECT COUNT(*) FROM score s1 WHERE
s1.CourseNo = scr.CourseNo
AND
s1.score > s.score) <3


##解题思路
这么写其实一般都是想不到的,包括笔者也一样
这么写的话首先需要熟知sql执行顺序。
一般来讲sql都是先执行子查询,但这道题不同,子查中嵌入了主查的值,所以这是一个相关子查询,那么sql就不再是正常的执行顺序了,一般来讲是先将主查询的值传入子查,然后子查再返回给主查。
这道题有点类似于java中的冒泡排序,相当于两个for循环在一直对值进行比较。
但还是不建议这么写,实在是烧脑。
小于3的原因是,排在第三名前面的有两个人。
逻辑很烧脑,下面的体重还有一道类似的题,我会用分组排序函数,再给大家写一次

(24) 查询每门课程被选修的学生数

SELECT
crs.courseNo,
crs.`name`,
COUNT(scr.score)
FROM
score scr
RIGHT JOIN
course crs
ON scr.CourseNo=crs.courseNo
GROUP BY crs.courseNo

##解题思路
本题没什么好说的,考点就是右链接

 (25)查询出只选修了一门课程的全部学生的学号和姓名

SELECT
scr.StudentNo,studd.`name`
FROM
score scr , student studd
WHERE scr.StudentNo=studd.studentNo
GROUP BY StudentNo
HAVING COUNT(score)=1

##解题思路
取出只选了一门课的学生首先就是按学生分组。
那么就简单了,统计一下每位学生上了几门课就OK了。
然后让这个值等于1.简单一个关联即可取出最后的答案。

(26) 查询男生、女生的人数

SELECT
sex,COUNT(`name`)
FROM
student
GROUP BY sex

##解题思路
按性别分组,统计个人数就完事了

(27)查询同名同姓学生名单,并统计同名人数

SELECT	`name` as '姓名',COUNT(studentNo) as '人数'
FROM
student
GROUP BY `name`
HAVING COUNT(studentNo)>1

##解题思路
这道题与上一道没什么区别吧

(28)查询1991年出生的学生名单 

SELECT
*
FROM
student
WHERE 
(SELECT  DISTINCT SUBSTR(
FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y-%m-%d'),
1,4) as '当前年份'
FROM
DUAL) - age = 1991


##解题思路
这个还挺好玩的,
根据UNIX_TIMESTAP和FROM_UNIXTIME求出当前时间,
再根据substr函数截取到当前年份,
然后就事sql的基本执行顺序了。
原谅笔者总是在用hive和oracle对mysql的获取系统时间函数实在不知道
看了一下网上的解答,除了笔者这种方式还可以用  year(CURDATE())直接拿到系统年份

(29)查询每门课程的平均成绩,结果按平均成绩升序排列 

SELECT crs.courseNo,AVG(score)
FROM
score scr
RIGHT JOIN
course crs
ON scr.CourseNo=crs.courseNo
GROUP BY
crs.CourseNo
ORDER BY avg(score) ASC


##解题思路
唯一的需要理解的就是RIGHT JOIN,目的是放置遗漏课程

(30)查询平均成绩大于85的所有学生的学号、姓名和平均成绩 

SELECT
studd.`name`,scr.StudentNo,AVG(scr.score) as agg
FROM
score scr ,student studd 
WHERE scr.StudentNo=studd.studentNo
GROUP BY
scr.StudentNo
HAVING agg>85

##解题思路
学号分组,求平均值,过滤掉小于等于85分的人
简单关联,求结果

 (31)查询课程名称为“数学”,且分数低于60的学生姓名和分数

SELECT studd.`name`,scc.score
FROM
(SELECT StudentNo,score
FROM
score
WHERE CourseNo=
(SELECT
courseNo
FROM
course
WHERE `name`='数学')
AND score<60)scc,student studd
WHERE scc.StudentNo=studd.studentNo

##解题思路
写了上面那么多更难的,这个三表关联肯定很简单啦
最重要的是找到关联规则。

 (32)查询所有学生的选课情况(本题有歧义,可以理解为所有学生选了什么课)

SELECT statorg.StudentNo,statorg.`name`,crs.`name`
FROM
(SELECT
studd.StudentNo,studd.`name`,scr.CourseNo
FROM
score scr 
RIGHT JOIN
student studd
ON scr.StudentNo=studd.studentNo)statorg,course crs
WHERE statorg.CourseNo=crs.courseNo

##解题思路
本题考点还是一个右链接,但是需求实在是太不明确了。
做到这一步,基本就算做完了。
但如果想让表再清楚一点,可以针对表再进行一次列转行操作。
笔者实在是懒了,就不弄了。

(33)查询任何一门课程成绩在70分以上的学生姓名、课程名称和分数 

SELECT studd.`name`,crs.`name`,tmp.score
FROM
(SELECT
StudentNo,CourseNo,score
FROM
score
WHERE score>70)tmp,course crs,student studd
WHERE studd.studentNo=tmp.StudentNo
AND crs.courseNo=tmp.CourseNo


##解题思路
三表关联查询,只不过我这一次换了一种写法,和上面没什么区别

(34)查询不及格的课程,并按课程号从大到小排列

SELECT
DISTINCT scr.CourseNo,crs.`name`
FROM
score scr ,course crs
WHERE scr.CourseNo=crs.courseNo
AND scr.score<60
ORDER BY scr.CourseNo DESC

##解题思路
又是一道题意不明确的题。如果按需求讲,到这里已经结束了。
具体思路就不讲了,很简单

(35)查询课程编号为003且课程成绩在80分以上的学生的学号和姓名

SELECT
scr.StudentNo,studd.`name`
FROM
score scr ,student studd
WHERE scr.StudentNo=studd.studentNo
AND scr.CourseNo=003
AND scr.score>80

##解题思路
两表关联,限定条件课程等于3,分数大于80

 (36)求选了课程的学生人数

SELECT
COUNT(DISTINCT scr.StudentNo) as '人数'
FROM
score scr
WHERE scr.score
IS NOT NULL


##解题思路
基础操作,条件分数非空在本题中可加可不加
但如果score表中没选课的人,学号也添加进去,分数显示空值,那么就必须加上

 (37)查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩

SELECT
studd.`name`,tbl.score
FROM
(SELECT
scr.StudentNo,scr.score
FROM
score scr
WHERE CourseNo =
(SELECT
crs.courseNo
FROM
teacher tcer,course crs
WHERE tcer.teacherNo=crs.teacherNo
AND tcer.`name`='杨艳')
ORDER BY score DESC
LIMIT 1)tbl,student studd
WHERE tbl.StudentNo=studd.studentNo

##解题思路
这道题有意思的地方是在取出第一名的成绩,不建议用笔者这种方法,局限性太大。
不光可以这么写,也可以通过max函数查出最高分,让分数等于最高分这么求出
还有用自定义函数,排名,取第一名。
后两种都还可以,反正是比笔者这种方法好,因为笔者实在是懒,追求结果就好。

 (38)查询各个课程及相应的选修人数

SELECT
crs.`name`,
COUNT(scr.score)
FROM
score scr 
RIGHT JOIN 
course crs
ON crs.courseNo=scr.CourseNo
GROUP BY crs.courseNo


##解题思路
关联查询,但切记分组要按课程表分组,因为分数表分组是不全的

 (39) 查询不同课程但成绩相同的学生的学号、课程号、学生成绩

SELECT
tmp.StudentNo,studd.`name`,tmp.score
FROM
(SELECT s1.StudentNo,s1.CourseNo,s1.score
FROM
score s1,score s2
WHERE s1.CourseNo<>s2.CourseNo
AND s1.score=s2.score 
)tmp,student studd
WHERE tmp.StudentNo=studd.studentNo
ORDER BY tmp.score


##解题思路
讲真,看到这个需求我是爆炸的。
这什么需求啊,根本没看懂。
那既然如此也得应着头皮做,没什么思路,就是按照要求来。
分数相同就是score相等
学号不同就是studentNO不等

 (40)查询每门课程成绩最好的前两名

SELECT
s1.StudentNo,s1.CourseNo,s1.score
FROM
score s1
WHERE
(SELECT COUNT(*) 
FROM score s2
WHERE 
s1.CourseNo=s2.CourseNo
AND s2.score>s1.score)<2
ORDER BY s1.CourseNo ASC ,s1.score DESC


##解题思路
与上面的一道题类似,这种题没法说思路
只能凭感觉。有机会可以更新一种比较麻烦的方法,但现在就先这样了


 作者:唐辰(数据界小白)

 欢迎大神优化修改~

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值