SQL笔试经典50题

MySQL经典50题

1、

#1、查询“01”课程比“02”课程成绩高的所有学生的学号;
SELECT s1.sid
FROM SC s1 JOIN SC s2 ON s1.sid=s2.sid AND s1.cid='01' AND s2.cid='02' AND s1.score>s2.score

在这里插入图片描述
2、

#2、查询平均成绩大于60分的同学的学号和平均成绩;
SELECT sid as 学号, avg(score) as 平均成绩
FROM SC GROUP BY sid HAVING 平均成绩>60

在这里插入图片描述
3、

#3、查询所有同学的学号、姓名、选课数、总成绩
SELECT s2.sid as 学号, s2.sname as 姓名, a.b as 选课数, a.c as 总成绩
FROM Student s2,
(SELECT s1.sid as id ,count(s1.cid) as b, sum(s1.score) as c
FROM SC s1 JOIN Student s2 ON s1.sid=s2.sid GROUP BY s1.sid)a
WHERE s2.sid=a.id 

在这里插入图片描述
4、

#4、查询姓“李”的老师的个数;
SELECT * FROM Teacher WHERE tname LIKE '李%'

在这里插入图片描述
5、

#5、查询没学过“张三”老师课的同学的学号、姓名;
SELECT DISTINCT(s1.sid) as 学号,s1.sname as 姓名
FROM Student s1 JOIN SC s2 ON s1.sid=s2.sid AND s2.cid IN
(SELECT c1.cid FROM Teacher t1 JOIN Course c1 ON t1.tid=c1.tid AND t1.tname NOT LIKE '张三') 

在这里插入图片描述
6、

#6、查询学过编号“01”并且也学过编号“02”课程的同学的学号、姓名;
SELECT sid as 学号, sname as 姓名 FROM Student WHERE sid in 
(SELECT s1.sid
FROM SC s1 JOIN SC s2 ON s1.sid=s2.sid AND s1.cid='01' AND s2.cid='02')

在这里插入图片描述
7、

#7、查询学过“张三”老师所教的课的同学的学号、姓名;
SELECT s2.sid as 学号, s2.sname as 姓名
FROM SC s1 JOIN Student s2 ON s1.sid=s2.sid AND s1.cid IN
(SELECT cid FROM Course WHERE tid IN
(SELECT tid FROM Teacher WHERE tname='张三'))

在这里插入图片描述
8、

#8、查询课程编号“01”的成绩比课程编号“02”课程低的所有同学的学号、姓名;
SELECT a.sid as 学号, s3.sname as 姓名
FROM (SELECT s1.sid FROM SC s1 JOIN SC s2 ON s1.sid=s2.sid AND s1.cid='01' AND s2.cid='02' AND s1.score<s2.score)a JOIN Student s3 ON a.sid=s3.sid  

在这里插入图片描述
9、

#9、查询所有课程成绩小于60分的同学的学号、姓名;
SELECT DISTINCT(s2.sid) as 学号, s2.sname as 姓名
FROM SC s1 JOIN Student s2 ON s1.sid=s2.sid WHERE s1.score<60

在这里插入图片描述
10、

#10、查询没有学全所有课的同学的学号、姓名;
SELECT s2.sid as 学号, s2.sname as 姓名
FROM (SELECT s1.sid as s3, count(1) as n 
FROM SC s1 GROUP BY s1.sid HAVING n!=(SELECT COUNT(1) FROM Course))a JOIN Student s2 ON a.s3=s2.sid 

在这里插入图片描述
11、
利用01的课程号当作连表查询的条件

#11、查询至少有一门课与学号为“01”的同学所学相同的同学的学号和姓名;
SELECT s2.sid as 学号, s2.sname as 姓名
FROM(SELECT DISTINCT(s1.sid)as s3
FROM(SELECT cid FROM SC WHERE sid='01')a JOIN SC s1 ON a.cid=s1.cid 
WHERE s1.sid!='01')b JOIN Student s2 ON b.s3=s2.sid

在这里插入图片描述
12、

#12、查询和"01"号的同学学习的课程完全相同的其他同学的学号和姓名
##01学生上课的数量
SELECT COUNT(1) FROM SC WHERE sid='01'
##
SELECT s3.sid as 学号, s3.sname as 姓名
FROM Student s3 JOIN (SELECT s1.sid as s2,count(1) as n 
FROM(SELECT * FROM SC WHERE sid='01')a JOIN SC s1 ON a.cid=s1.cid GROUP BY s1.sid HAVING n=3)b 
WHERE sid=b.s2 AND sid!='01'

在这里插入图片描述
13、

#13、把“SC”表中“张三”老师教的课的成绩都更改为此课程的平均成绩;
##这里不用更新了,筛选出来,计算平均数,生成搜索视图就行
SELECT avg(score) FROM SC WHERE cid IN(
SELECT cid FROM Course WHERE tid IN (SELECT tid FROM Teacher WHERE tname='张三'))

在这里插入图片描述
14、

#14、查询没学过"张三"老师讲授的任一门课程的学生姓名
SELECT sname as 学生姓名 FROM Student WHERE sid NOT IN
(SELECT sid FROM SC s1 JOIN (SELECT cid FROM Course WHERE tid IN(SELECT tid FROM Teacher WHERE tname='张三'))a ON s1.cid=a.cid)

在这里插入图片描述
15、

#15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
SELECT s2.sid as 学号, s2.sname as 姓名, a.c1 as 平均成绩
FROM Student s2 JOIN (SELECT sid as id,count(1) as n,AVG(score) as c1
FROM SC s1 WHERE score<60 GROUP BY sid HAVING n>=2)a WHERE s2.sid=a.id

在这里插入图片描述
16、

#16、检索"01"课程分数小于60,按分数降序排列的学生信息
SELECT s4.* ,a.s3
FROM Student s4 JOIN
(SELECT sid as s2, score as s3 FROM SC s1 WHERE cid='01' AND score<60)a ON s4.sid=a.s2 ORDER BY a.s3 DESC

在这里插入图片描述
17、

#17、按平均成绩从高到低显示所有学生的平均成绩
##排序错位
SELECT s1.sid as 学号, s1.sname as 姓名, a.av as 平均成绩
FROM Student as s1 JOIN
(SELECT sid, avg(score) as av FROM SC s1 GROUP BY sid ORDER BY av DESC)a
ON s1.sid=a.sid 
#要把排序写在外面
SELECT s1.sid as 学号, s1.sname as 姓名, a.av as 平均成绩
FROM Student as s1 JOIN
(SELECT sid, avg(score) as av FROM SC s1 GROUP BY sid )a
ON s1.sid=a.sid ORDER BY a.av DESC

在这里插入图片描述
18、

#18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率
SELECT a.cid as 课程ID, Course.cname as 课程name,a.ma as 最高分, a.mi as 最低分, a.av as 平均分,a.p as 及格率
FROM(SELECT cid,MAX(score) as ma ,MIN(score) as mi ,AVG(score) as av, CONCAT((COUNT(if (score>=60,score,NULL))/COUNT(score))*100,'%') as p 
FROM SC s1 GROUP BY cid)a, Course WHERE a.cid=Course.cid 
##精简版
SELECT s1.cid,MAX(score) as ma ,MIN(score) as mi ,AVG(score) as av, CONCAT((COUNT(if (score>=60,score,NULL))/COUNT(score))*100,'%') as p 
FROM SC s1 JOIN Course ON s1.cid=Course.cid GROUP BY s1.cid

在这里插入图片描述COUNT(IF(条件,true时结果,false时结果))这个语句要记住!!!
19、

#19、按各科平均成绩从低到高和及格率的百分数从高到低顺序
SELECT cid, AVG(score) as av,COUNT(IF(score>=60,score,NULL))/COUNT(score) as p FROM SC GROUP BY cid ORDER BY av ASC,p DESC

在这里插入图片描述
20、

#20、查询学生的总成绩并进行排名
SELECT sid,SUM(score) as sscore
FROM SC as s1 GROUP BY sid ORDER BY sscore  DESC

在这里插入图片描述
21、

#21、查询不同老师所教不同课程平均分从高到低显示
SELECT s1.cid as 课程编号, t1.tname as 老师姓名,AVG(s1.score) as av
FROM SC s1 JOIN Course c1 ON s1.cid=c1.cid JOIN Teacher t1 ON c1.tid=t1.tid GROUP BY t1.tname , s1.cid ORDER BY av DESC

在这里插入图片描述
22、
23、
24、

#24、查询学生平均成绩及其名次
SELECT (@i:=@i+1) as 排名,a.s as 学号,a.av as 平均成绩
FROM(SELECT sid as s,AVG(score) as av 
FROM SC GROUP BY sid ORDER BY av DESC)a,(SELECT @i:=0) as j 

在这里插入图片描述
25、
26、

#26、查询每门课程被选修的学生数
SELECT cname as 课程, count(DISTINCT(sid))as 选课学生人数
FROM SC s1 JOIN Course c1 ON s1.cid=c1.cid GROUP BY cname

在这里插入图片描述
27、

#27、查询出只选修了一门课程的全部学生的学号和姓名
###数据中没有之选了一门的,所以改成选两门的吧
SELECT sid as 学号, sname as 姓名 FROM Student WHERE sid IN
(SELECT sid as id
FROM SC s1 GROUP BY sid HAVING count(1)=2)

在这里插入图片描述
28、

#28、查询男生、女生人数
SELECT ssex as 性别, COUNT(1) as 人数
FROM Student GROUP BY ssex

在这里插入图片描述
29、

#29、查询名字中含有"风"字的学生信息
SELECT * FROM Student WHERE sname LIKE '%风%'

在这里插入图片描述
30、

#30、查询同名同性学生名单,并统计同名人数
####同名同性其实就是一类,GROUP BY 就行!!!
SELECT sname,ssex, count(1) as n 
FROM Student GROUP BY sname,ssex HAVING n>1

31、

#31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime)
SELECT * FROM Student WHERE YEAR(sage)=1990

在这里插入图片描述
32、

SELECT cid, AVG(score) as av 
FROM SC s1 GROUP BY cid ORDER BY av asc,cid DESC

在这里插入图片描述
37、

#37、查询不及格的课程,并按课程号从大到小排列
SELECT sid,cid,score FROM SC WHERE score<60 ORDER BY cid DESC

在这里插入图片描述
38、

#38、查询课程编号为"01"且课程成绩在60分以上的学生的学号和姓名;
SELECT s1.sid as 学号,s1.sname as 姓名
FROM(SELECT sid FROM SC WHERE cid='01' AND score>60)a LEFT JOIN Student s1 ON a.sid=s1.sid

在这里插入图片描述40、

#40、查询选修“张三”老师所授课程的学生中,成绩最高的学生姓名及其成绩
SELECT a.s as 学号, s1.sname as 姓名,a.sc1 as 成绩
FROM(SELECT sid as s,score as sc1 FROM SC WHERE cid=(SELECT cid FROM Course WHERE tid=(SELECT tid FROM Teacher WHERE tname='张三')))a LEFT JOIN Student s1 ON a.s=s1.sid ORDER BY a.sc1 DESC LIMIT 1

在这里插入图片描述
42、查询每门功课成绩最好的前两名

43、

#43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
SELECT cid as 课程号, count(1) as number 
FROM SC s1 GROUP BY cid HAVING number>5 ORDER BY number DESC,cid ASC

在这里插入图片描述
44、

#44、检索至少选修两门课程的学生学号
SELECT s2.sid as 学号, s2.sname as 姓名
FROM(SELECT sid FROM SC s1 GROUP BY sid HAVING COUNT(1)>=2)a LEFT JOIN Student s2 ON a.sid=s2.sid

在这里插入图片描述
45、

#45、查询选修了全部课程的学生信息
SELECT a.sid as 学号, s1.sname as 姓名
FROM(SELECT sid 
FROM SC GROUP BY sid HAVING count(1)=(SELECT COUNT(DISTINCT(cname)) as n FROM Course))a, Student s1 WHERE a.sid=s1.sid

在这里插入图片描述
46、

#46、查询各学生的年龄
SELECT sid as 学号, sname as 姓名,(YEAR(NOW())-YEAR(sage)) as 年龄
FROM Student 

在这里插入图片描述
47-48

#47、查询本周过生日的学生
SELECT WEEK(NOW())#查看当前星期
SELECT WEEK(sage) FROM Student#查看所有学生生日对应的星期
SELECT sid,sname FROM Student WHERE WEEK(sage)=WEEK(NOW())
#48、查询下周过生日的学生
SELECT sid,sname FROM Student WHERE WEEK(sage)=WEEK(NOW())+1

49-50

#49、查询本月过生日的学生
SELECT sid,sname FROM Student WHERE MONTH(sage)=MONTH(NOW())
#50、查询下月过生日的学生
SELECT sid,sname FROM Student WHERE MONTH(sage)=MONTH(NOW())+1
  • 0
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值