这篇文章主要介绍了最全50个数据库查询练习题,Mysql数据库版本,全部都验证过
此数据库查询语句是网络上50个数据库查询练习题目,网上有些版本是神谕语句写的,大多数公司还是用免费的关系型数据库数据库,以下都是关系型数据库版本,全部都有验证过。
表名和字段1.学生表
学生(s#,sname,sage,ssex)-学生编号,学生姓名,出生年月,学生性别
2.课程表
课程(c#、cname、t #)课程编号,课程名称,教师编号
3.教师表
教师(t#,tname)教师编号,教师姓名
4.成绩表
Sc(s#、c#、乐谱)学生编号,课程编号,分数
测试数据用数据库可视化工具做练习非常方便,推荐使用sqlyog,软件图标是一只海豚。
在新连接种填上本机地址,用户名,密码和端口就直接连上mysql。
所有测试数据如下:# - 插入学生表测试数据
插入学生值( 01 ,赵雷 , 1990-01-01 , 男);
插入学生值( 02 ,钱电 , 1990-12-21 , 男);
插入学生值( 03 ,孙风 , 1990-05-20 , 男);
插入学生值( 04 ,李云 , 1990-08-06 , 男);
插入学生值( 05 ,周梅 , 1991-12-01 , 女);
插入学生值( 06 ,吴兰 , 1992-03-01 , 女);
插入学生值( 07 ,郑竹 , 1989-07-01 , 女);
插入学生值( 08 ,王菊 , 1990-01-20 , 女);
# - 插入课程表测试数据
插入课程值( 01 ,语文 , 02);
插入课程值( 02 ,数学 , 01);
插入课程值( 03 ,英语 , 03);
# - 插入教师表测试数据
插入教师值( 01 ,张三);
插入教师值( 02 ,李四);
插入教师值( 03 ,王五);
# - 插入成绩表测试数据
插入南卡罗来纳州值( 01 , 01 ,80);
插入南卡罗来纳州值( 01 , 02 ,90);
插入南卡罗来纳州值( 01 , 03 ,99);
插入南卡罗来纳州值( 02 , 01 ,70);
插入南卡罗来纳州值( 02 , 02 ,60);
插入南卡罗来纳州值( 02 , 03 ,80);
插入南卡罗来纳州值( 03 , 01 ,80);
插入南卡罗来纳州值( 03 , 02 ,80);
插入南卡罗来纳州值( 03 , 03 ,80);
插入南卡罗来纳州值( 04 , 01 ,50);
插入南卡罗来纳州值( 04 , 02 ,30);
插入南卡罗来纳州值( 04 , 03 ,20);
插入南卡罗来纳州值( 05 , 01 ,76);
插入南卡罗来纳州值( 05 , 02 ,87);
插入南卡罗来纳州值( 06 , 01 ,31);
插入南卡罗来纳州值( 06 , 03 ,34);
插入南卡罗来纳州值( 07 , 02 ,89);
插入南卡罗来纳州值( 07 , 03 ,98);
最后是50个数据库查询练习,已经验证过,是关系型数据库版本的。
1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
SELECT * FROM
(选择" s# "作为sno1," c# "作为cno1,从南卡罗来纳州评分,其中" c # "=01)a
左连接
(选择" s# "作为二氧化锡,“c#”作为二氧化碳,从南卡罗来纳州评分,其中" c # "=02)b
关于a.sno1=b.sno2
其中a得分b得分
1.1 查询同时存在" 01 "课程和" 02 "课程的情况
SELECT * FROM
(选择" s# "作为sno1," c# "作为cno1,从南卡罗来纳州评分,其中" c # "=01)a
左连接
(选择" s# "作为二氧化锡,“c#”作为二氧化碳,从南卡罗来纳州评分,其中" c # "=02)b
关于a.sno1=b.sno2
其中二氧化锡不为空
1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
SELECT * FROM
(选择" s# "作为sno1," c# "作为cno1,从南卡罗来纳州评分,其中" c # "=01)a
左连接
(选择" s# "作为二氧化锡,“c#”作为二氧化碳,从南卡罗来纳州评分,其中" c # "=02)b
关于a.sno1=b.sno2
1.3 查询不存在" 01 "课程但存在" 02 "课程的情况
SELECT * FROM
sc,其中“c# ”=“02”和s# 不在(从sc,其中“c# ”=“01”中选择s#
2.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
SELECT a.`s # `,b.`sname `,a.avg_score FROM
(通过" s# "从南卡罗来纳州组中选择“s #”,AVG(得分)作为平均分数)作为a
左加入学生为b
在a . s # `=b . s # `上
其中平均分数=60
3.查询在南卡罗来纳州表存在成绩的学生信息
SELECT * FROM student WHERE s# IN(从南卡罗来纳州中选择不同的s #
4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为空)
SELECT `s # ,sname,course_num,score_sum FROM
(从学生中选择“s #”,sname)作为
左连接
(选择" s# "作为sno,COUNT(`c# `)作为课程数量,总和(分数)作为分数_总和,来自按sno分组的sc)作为b
在a . s # `=b . SnO
4.1 查有成绩的学生信息
# 在最外面一层挑选的时候,不可以用函数
# 如果两张表连接之后,有相同的字段,这时候挑选就需要把其中一个字段改名
SELECT `s # ,sname,course_num,score_sum FROM
(从学生中选择“s #”,sname)作为
左连接
(选择" s# "作为sno,COUNT(`c# `)作为课程数量,总和(分数)作为分数_总和,来自按sno分组的sc)作为b
在a . s # `=b . SnO
其中课程编号不为空
5.查询「李」姓老师的数量
SELECT COUNT(*)FROM teacher WHERE tname LIKE 李%
6.查询学过「张三」老师授课的同学的信息
# 张三老师是01号
SELECT * FROM student WHERE `s#` IN
(从南卡罗来纳州中选择s # ,其中c # =
(从课程中选择“c# ”,其中" t # "=
(从教师处选择" t# ",其中tname=张三)))
# 7.查询没有学全所有课程的同学的信息
SELECT `s# `,COUNT(` c # `)AS course _ num FROM sc GROUP BY ` s # ` s
拥有课程编号(从课程中选择计数(*))
# 8.查询至少有一门课与学号为01的同学所学相同的同学的信息
SELECT * FROM student WHERE `s#` IN
(从南卡罗来纳州中选择不同的" s# ",其中" c# "在
(从南卡罗来纳州中选择“c# ”,其中" s # "=01)
和"的# "!=01
# 9.查询和01号的同学学习的课程完全相同的其他同学的信息
从中选择" s# "
(SELECT * FROM sc
左连接
(从南卡罗来纳州中选择" c# "作为cno,其中" s # "=01)a
在sc.`c#`=a.cno)上作为b
按" s# "分组
具有COUNT(b.`s#`)=(选择计数(` c# `)作为来自南卡罗来纳州的cno,其中` s#`=01)
# 10.查询没学过张三老师讲授的任一门课程的学生姓名
# 张三是01
# 01老师是教数学,c#是02
SELECT * FROM student WHERE #不在
(从南卡罗来纳州中选择不同的" s# ",其中" c# "在
(从" t# "所在的课程中选择" c# "
(从教师处选择" t# ",其中tname=张三)))
# 11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
SELECT `s # ,sname,avg_score FROM
(选择“s #”,来自学生的名称,其中“s #”在
(选择a.`s# `来自
(选择s # ,从南卡罗来纳州中计数( c # )作为num,其中分数60按s # 分组)a
其中num=2))作为b
左连接
(通过" s# "选择" s# "作为AVG斯诺(得分)作为南卡罗来纳州组的平均分数)作为c
在b.`s#`=c.sno上
# 12.检索 01 课程分数小于60,按分数降序排列的学生信息
选择“s #”,sname,评分自
学生作为
左连接
(选择" s# "作为sno,“c#”,从南卡罗来纳州中得分,其中" c # "=01,得分为60 )b
在a . s # `=b . SnO
其中分数不为空
按分数排序DESC
# 13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
从sc GROUP BY ` s # ` ORDER BY avg _ score desc中选择《s #》、AVG(配乐)作为平均分数
# 14.查询各科成绩最高分、最低分和平均分:
# 以如下形式显示:课程ID,课程姓名,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
# 及格为=60,中等为:70-80,优良为:80-90,优秀为:=90
# 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
选择不同的a.`c# ,cname,最高分,最低分,平均分,及格率,中等率,优良率,优秀率来自sc a
在a上向左加入课程。` c# `=课程。` c#
左连接(选择“c# ”,最大值(分数)最高分,最小(分数)最低分,AVG(得分)平均分从南卡罗来纳州组按c#`)b对a.`c#`=b.`c# 进行
左连接(选择“c#”,舍入(R1/CNT * 100,2)作为及格率从
(选择 c# ),(SUM(得分=60然后1否则0结束时的情况)*1.00)作为r1,计数(*)作为南卡罗来纳州组中的CNT BY ` c# `)C1)c ON a . ` c# `=c . ` c# ` c
左连接(选择“c#”,舍入(R2/CNT * 100,2)作为中等率从
(选择‘c# ’,( SUM(当得分=70且得分80时的情况然后1否则0结束)*1.00)作为r2,计数(*)作为来自南卡罗来纳州组的CNT BY c# `)D1)d ON a . ` c# `=d . ` c#
左连接(选择“c#”,舍入(R3/CNT * 100,2)为优良率从
(选择 c# ),(SUM(当分数=80且分数90后1否则0结束时的情况)*1.00)作为r3,计数(*)作为来自南卡罗来纳州组的E1)e在a . ` c# `=e . ` c#
左连接(选择“c#”,舍入(R4/CNT * 100,2)作为优秀率从
(选择 c# ),(SUM(当分数=90然后1否则0结束时的情况)*1.00)作为r4,计数(*)作为来自南卡罗来纳州组的CNT BY ` c# `)f1)f ON a . ` c# `=f . ` c#
# 15.按各科成绩进行排序,并显示排名,得分重复时保留名次空缺
# mysql中没有排名()函数
# 这种是重复时候保留名次,所以最后名次和人数是一样的
选择“s#”、“c#”、“分数、排名
(选择s # , c # ,分数,
@currank :=IF(@prevrank=score,@currank,@incrank)作为排名,
@incrank :=@incrank 1,
@prevrank :=分数
来自sc,(
SELECT @currank :=0,@prevrank :=NULL,@incrank :=1
)r
按分数排序DESC)
# 15.1 按各科成绩进行排序,并显示排名,得分重复时合并名次
# 这种是当有重复名次的时候变成只有一个名次,所以排名的数量会变少
选择“s#”、“c#”、“分数,
情况
当@prevrank=score THEN @currank
当@ prev rank:=score THEN @ currank:=@ currank 1
作为等级结束
来自sc,
(SELECT @currank :=0,@prevrank :=NULL) r
按分数排序DESC
# 16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺
#来自后面不需要加表的别名
SELECT `s # ,sum_score,排名从
(选择“s #”,sum _ score,
@currank:=IF(@ prev rank=sum _ score,@ currank,@incrank)作为排名,
@incrank :=@incrank 1,
@prevrank :=sum_score
从
(SELECT `s# `,SUM(score)AS SUM _ score FROM sc GROUP BY ` s # `)c、
(SELECT @currank :=0,@prevrank :=NULL,@incrank :=1) r
按DESC总分排序
# 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
选择c.*,
情况
当@ prev rank=c . sum _ score THEN @ currank
当@ prev rank:=c . sum _ score THEN @ currank:=@ currank 1
作为等级结束
从
(选择a.`s # `,a.sname,SUM(分数)作为总和分数
来自(学生作为权利加入南卡罗来纳州作为b ON a.`s#`=b.`s# `)
按a . s # `)c分组,
(SELECT @currank :=0,@prevrank :=NULL ) d
按DESC总分排序
# 17.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
选择a.`c# ,b.cname,
总和(分数=85且分数=100时的情况,否则EN 1 0结束)[100-85],
总和(当分数=85且分数=100时,EN 1为0结尾)* 1.00/计数(*)为[100-85]%,
总和(当分数85和分数=70时的情况,否则EN 1 0结束)(85-70],
总和(当分数85和分数=70时的情况然后1否则0结束)* 1.00/COUNT(*)为(85-70)]百分比,
总和(当分数70和分数=60时的情况,否则EN 1 0结束)(70-60],
总和(当分数为70且分数=60时,EN 1为0结尾)* 1.00/计数(*)为(85-70)]百分比,
总和(当分数60和分数=0时的情况,否则EN 1 0结束)(60-0),
总和(当分数为60且分数=0然后1否则0结束时的情况)* 1.00/COUNT(*)为(85-70)]百分比,
计数(*)作为计数
从sc a左转进入a上的课程c#=b . ` c#
按" c# "分组
# 18.查询各科成绩前三名的记录
SELECT * FROM sc a其中
(从sc中选择COUNT(*),其中` c#`=a.`c# 和scorea.score)3
按a.`c# 排序,a .得分desc;
# 19.查询每门课程被选修的学生数
SELECT `c# `,COUNT(`s#`) FROM
(按" c# "从南卡罗来纳州顺序中选择“s#”、“c#”)a
按" c# "分组
SELECT a.`c# `,b.cname,COUNT(*)AS num FROM sc a LEFT JOIN course b ON a . ` c# `=b . ` c# ` c
按a . ` c# 分组;
# 20.查询出只选修两门课程的学生学号和姓名
选择a.`s # `,a.sname,cnt FROM
学生甲
左连接
(SELECT `s# `,COUNT(` c # `)AS CNT FROM sc GROUP BY ` s # `)b
在a . s # `=b . s # `上
其中cnt=2
# 21.查询男生、女生人数
通过ssex从学生组中选择ssex,计数
# 22.查询名字中含有「风」字的学生信息
SELECT * FROM student WHERE sname LIKE %风%
# 23.查询同名同性学生名单,并统计同名人数
选择a.*,b .同名人数来自学生a
左连接(SELECT sname,ssex,COUNT(*) AS同名人数来自学生小组,由sname,ssex)b
在名字=名字和a.ssex=b.ssex上
其中乙.同名人数一
# 24.查询1990 年出生的学生名单
SELECT * FROM student WHERE YEAR(sage)=1990
# 25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
选择 c# ,圆(AVG(分数),2)作为南卡罗来纳州组的avg _ score BY c# ORDER BY c# ASC
# 26.查询平均成绩大于等于85 的所有学生的学号、姓名和平均成绩
SELECT c.`s# `,sname,avg_score FROM
(学生丙
左连接
(SELECT `s# `,avg_score FROM
(选择` s # ,圆(AVG(分数),2)作为来自南卡罗来纳州的平均分数
GROUP BY ` s # ` ORDER BY avg _ score desc)a
其中平均分数=85) b
在c.`s # `=b.`s # `)
其中平均分数不为空
# 27.查询课程名称为「数学」,且分数低于60的学生姓名和分数
选择a.`s # `,a。名字,b。数学,b。分数自
学生甲
左连接
(选择“s#”、“c#”作为数学,从南卡罗来纳州得分,其中" c# "在
(从课程中选择“c# ”,其中cname=数学)
和sc .得分60) b
在a . s # `=b . s # `上
其中b .分数不为空
# 28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
选择a.`s # `,a.`sname `,a.`sage `,a.`ssex `,b.`c # `,b分数来源
学生a在a.`s # `=b.`s # `上向左加入sc b
在c.`c#`=b.`c# 上左转加入c航道
# 29.查询任何一门课程成绩在70 分以上的姓名、课程名称和分数
选择a.`s # `,a.`sname `,a.`sage `,a.`ssex `,b.`c # `,b分数来源
学生甲
左连接
(选择“s#”、“c#”,得分来自sc,其中得分为70) b ON a.`s#`=b.`s# `
左转航向c
在c.`c#`=b.`c# 上
其中分数不为空
# 30.查询不及格的课程
SELECT * FROM sc WHERE score 60
# 31.查询课程编号为01 且课程成绩在80 分以上的学生的学号和姓名
选择a.`s # `,a。名字,b。分数自
学生甲
左连接
(SELECT * FROM sc,其中" c# "="01 ",得分=80) b
在a . s # `=b . s # `上
其中分数不为空
# 32.求每门课程的学生人数
选择“c# ”,通过“c#”从sc组中计数(` c# `)
# 33.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
选择a.`s # `,a.`sname `,b.`c # `,b.max_score FROM
学生甲
左连接
(选择" s# "作为sid,“c#”,MAX(分数)作为南卡罗来纳州中的max_score,其中" c# "在
(从" t# "所在的课程中选择" c# "
(从教师处选择" t# ",其中tname=张三)b
在a . s # `=b . sid上
其中最高分数不为空
# 34.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
SELECT * FROM
(选择dd .*,
情况
当@prevrank=dd.score THEN @currank
当@ prev rank:=DD。得分然后@ currank:=@ currank 1
作为等级结束
从(选择a.*,b。分数从
学生甲
在a.`s # `=b.`s # `上向左连接sc b
在b上左转加入c航道
在c.`t#`=d.`t# `上左连接教师d,其中d.tname=张三)dd,(SELECT @currank :=0,@prevrank :=NULL ) ff
按分数排序DESC)作为dddddddd
其中秩=1;
# 35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
SELECT DISTINCT a.`s# `,a.`c# `,a.score FROM sc AS a JOIN sc AS b
a.`c# `!=b.`c# 和分数=分数和a.`s # `!=b.`s#
按a.`s# `,a.`c# `,a。分数排序
# 36.查询每门功课成绩最好的前两名
# 此题和18题相同
SELECT * FROM sc a其中
(从sc中选择COUNT(*),其中` c#`=a.`c# 和score . score)2
按a.`c# 排序,a .得分desc;
# 37.统计每门课程的学生选修人数(超过5人的课程才统计)
# 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
选择a.`c# ,计数(*)作为编号自
航线a左转,在a上与sc b汇合
按编号为5的a.`c# 分组
按编号排序,a.`c#
# 38.检索至少选修两门课程的学生学号
SELECT DISTINCT`s# `,COUNT(` c# `)AS num FROM sc GROUP BY ` s # ` have num=2
# 39.查询选修了全部课程的学生信息
SELECT * FROM
(SELECT `s# `,COUNT(*)AS num FROM sc GROUP BY ` s # `)b
其中数量=(从课程中选择计数(*))
# 40.查询各学生的年龄,只按年份来算
SELECT *,YEAR(NOW()) - YEAR(sage)作为学生的年龄
# 41.查询本周过生日的学生
SELECT * FROM
(选择*,周(圣人),月(圣人),日(圣人),
WEEK(STR_TO_DATE(CONCAT_WS(,,YEAR(NOW()),MONTH(sage),DAY(sage)), %y,%m,%d )作为w来自学生)a
其中w=周(现在())
# 42.查询下周过生日的学生
SELECT * FROM
(选择*,周(贤者),月(贤者),日(贤者),周(现在()),
WEEK(STR_TO_DATE(CONCAT_WS(,,YEAR(NOW()),MONTH(sage),DAY(sage)), %y,%m,%d )作为w来自学生)a
其中w 2=周(现在())
# 43.查询本月过生日的学生
SELECT *,MONTH(sage),MONTH(NOW()) FROM student
其中MONTH(sage)=MONTH(NOW())
# 44.查询下月过生日的学生
SELECT *,MONTH(sage),MONTH(NOW()) FROM student
其中月(sage)=月(NOW()) 1
到此这篇关于最全50个关系型数据库数据库查询练习题的文章就介绍到这了,更多相关关系型数据库数据库查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!